import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:werwolf/main.dart' as app;
import 'package:werwolf/screens/playerregistry.dart';
import 'package:werwolf/screens/settings.dart';
import 'package:werwolf/screens/flippingcards.dart';
import 'package:werwolf/screens/gameboard.dart';

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  group('Werwolf Game Integration Tests', () {
    testWidgets('Complete game flow', (WidgetTester tester) async {
      app.main();
      await tester.pumpAndSettle();

      // Ensure we are on the PlayerRegistry screen
      expect(find.byType(PlayerRegistry), findsOneWidget);

      // Add players
      for (int i = 1; i <= 6; i++) {
        // Find the TextField, enter text, and simulate the 'done' action on the keyboard
        await tester.tap(find.byType(TextField).first);
        await tester.enterText(find.byType(TextField).first, 'Player $i');
        await tester.testTextInput.receiveAction(TextInputAction.done);
        // Wait for the UI to settle before proceeding
        await tester.pumpAndSettle();
        // Debug print to check entered text
        debugPrint('Entered Player $i');
      }

      // Ensure all players are added
      for (int i = 1; i <= 6; i++) {
        expect(find.text('Player $i'), findsOneWidget);
        // Debug print to confirm text presence
        debugPrint('Confirmed Player $i is present');
      }

      // Navigate to GameSettings screen
      await tester.tap(find.text('Spiel einstellen'));
      await tester.pumpAndSettle();
      expect(find.byType(GameSettings), findsOneWidget);

      // Ensure the number of players and wolves are displayed correctly
      expect(find.text('Anzahl der Spieler   6'), findsOneWidget);
      expect(find.text('Anzahl der Werwölfe   1'), findsOneWidget);

      // Toggle a special role
      await tester.tap(find.byType(Switch).first);
      await tester.pumpAndSettle();
      expect((tester.widget(find.byType(Switch).first) as Switch).value, true);

      // Navigate to FlipingCard screen
      await tester.tap(find.text('Spiel starten!'));
      await tester.pumpAndSettle();
      expect(find.byType(FlipingCard), findsOneWidget);

      // Track player roles
      Map<String, String> playerRoles = {};

      // Flip through all players
      for (int i = 1; i <= 5; i++) {
        await tester.tap(find.text('Klick um deine Rolle zu sehen!'));
        await tester.pumpAndSettle();

        // Debug print to check the UI and role text
        for (var widget in tester.allWidgets) {
          if (widget is Text) {
            debugPrint('Text widget: ${widget.data}');
          }
        }

        // Assuming the role is displayed somewhere we can read
        // Adjust the role extraction to how your app displays the role
        String role = tester
            .widgetList<Text>(find.byType(Text))
            .map((e) => e.data!)
            .firstWhere(
                (text) =>
                    text.contains('Dorfbewohner') ||
                    text.contains('Werwolf') ||
                    text.contains('Joker'),
                orElse: () => 'Unknown');

        if (role == 'Unknown') {
          throw StateError('No valid role found for Player $i');
        }

        playerRoles['Player $i'] = role;

        await tester.tap(find.text('Nächster Spieler'));
        await tester.pumpAndSettle();
      }

      // Ensure we navigate to the game board
      await tester.tap(find.text('Spiel anfangen!'));
      await tester.pumpAndSettle();
      expect(find.byType(PlayerGridView), findsOneWidget);

      // Find a player who is not a Werewolf to kill
      String playerToKill = playerRoles.entries
          .firstWhere((entry) => entry.value != 'Werwolf')
          .key;

      // Tap to kill a non-Werewolf player
      await tester.tap(find.text(playerToKill));
      await tester.pumpAndSettle();
      expect(find.byIcon(Icons.close), findsOneWidget);
      expect(find.byIcon(Icons.wb_sunny), findsOneWidget);

      // Skip phase
      await tester.tap(find.byType(ElevatedButton).first);
      await tester.pumpAndSettle();
      expect(find.byIcon(Icons.nights_stay), findsOneWidget);
    });
  });
}
