import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:{{projectName}}/src/app.dart';
import 'package:{{projectName}}/src/sample_feature/sample_item_details_view.dart';
import 'package:{{projectName}}/src/settings/settings_controller.dart';
import 'package:{{projectName}}/src/settings/settings_service.dart';
import 'package:{{projectName}}/src/settings/settings_view.dart';

void main() {
  group('ListDetailApp', () {
    testWidgets('displays a list of items', (WidgetTester tester) async {
      final service = SettingsService();
      final controller = SettingsController(service);

      await controller.loadSettings();
      await tester.pumpWidget(MyApp(settingsController: controller));

      expect(find.byType(ListTile), findsNWidgets(3));
    });

    testWidgets('navigates to an item page', (WidgetTester tester) async {
      final service = SettingsService();
      final controller = SettingsController(service);

      await controller.loadSettings();
      await tester.pumpWidget(MyApp(settingsController: controller));
      await tester.tap(find.byType(ListTile).first);
      await tester.pumpAndSettle();

      expect(find.byType(SampleItemDetailsView), findsOneWidget);
    });

    testWidgets('changes the app theme', (WidgetTester tester) async {
      final service = SettingsService();
      final controller = SettingsController(service);

      // Navigate to Settings
      await controller.loadSettings();
      await tester.pumpWidget(MyApp(settingsController: controller));
      await tester.tap(find.byType(IconButton));
      await tester.pumpAndSettle();

      // Verify defaults in place
      expect(controller.themeMode, ThemeMode.system);
      expect(find.byType(SettingsView), findsOneWidget);
      expect(findApp(ThemeMode.system), findsOneWidget);

      // Change to Dark Theme
      await tester.tap(find.text('System Theme'));
      await tester.pumpAndSettle();
      await tester.tap(find.text('Dark Theme').last);
      await tester.pumpAndSettle();

      // Verify Dark Theme rendered
      expect(controller.themeMode, ThemeMode.dark);
      expect(findApp(ThemeMode.dark), findsOneWidget);

      // Change to Light Theme
      await tester.tap(find.text('Dark Theme'));
      await tester.pumpAndSettle();
      await tester.tap(find.text('Light Theme').last);
      await tester.pumpAndSettle();

      // Verify light theme enabled
      expect(controller.themeMode, ThemeMode.light);
      expect(findApp(ThemeMode.light), findsOneWidget);
    });
  });
}

Finder findApp(ThemeMode themeMode) => find.byWidgetPredicate(
    (widget) => widget is MaterialApp && widget.themeMode == themeMode,
);