import 'package:bolao_mobile/core/api/api_client.dart';
import 'package:bolao_mobile/core/sessao/sessao_store.dart';
import 'package:bolao_mobile/features/boloes/data/boloes_repository.dart';
import 'package:bolao_mobile/features/boloes/presentation/rodada_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';

class _RepoFalso extends BoloesRepository {
  _RepoFalso() : super(ApiClient(SessaoStore()));

  @override
  Future<Rodada> rodada(String poolId, int matchday) async => Rodada(
    serverTime: DateTime.utc(2026, 8, 6, 12),
    jogos: [
      JogoDaRodada(
        matchId: 'm1',
        homeTeam: 'Flamengo',
        awayTeam: 'Vasco',
        // Prazo bem no futuro: sem o encerramento, este jogo estaria aberto.
        kickoffAt: DateTime.utc(2026, 9, 6, 12),
        deadlineOpen: true,
      ),
    ],
  );
}

Widget _app({required bool encerrado}) => ProviderScope(
  overrides: [boloesRepositoryProvider.overrideWithValue(_RepoFalso())],
  child: MaterialApp(
    home: RodadaPage(poolId: 'p1', matchday: 20, encerrado: encerrado),
  ),
);

void main() {
  group('RodadaPage em bolão encerrado', () {
    testWidgets('bolão aberto mantém o envio e a contagem', (t) async {
      await t.pumpWidget(_app(encerrado: false));
      await t.pumpAndSettle();

      expect(find.text('Enviar palpites'), findsOneWidget);
      expect(find.textContaining('Bolão encerrado'), findsNothing);
    });

    testWidgets('encerrado explica o motivo e tira a ação de enviar', (
      t,
    ) async {
      await t.pumpWidget(_app(encerrado: true));
      await t.pumpAndSettle();

      // Campo desabilitado sem motivo é indistinguível de app quebrado.
      expect(
        find.textContaining('Bolão encerrado: os palpites estão fechados'),
        findsOneWidget,
      );
      expect(find.text('Enviar palpites'), findsNothing);
      expect(find.text('bolão encerrado'), findsOneWidget);
    });

    testWidgets('encerrado fecha até o campo de jogo com prazo aberto', (
      t,
    ) async {
      await t.pumpWidget(_app(encerrado: true));
      await t.pumpAndSettle();

      final campos = t.widgetList<TextFormField>(find.byType(TextFormField));
      expect(campos, isNotEmpty);
      for (final c in campos) {
        expect(c.enabled, isFalse);
      }
    });
  });
}
