import 'package:bolao_mobile/features/boloes/presentation/prazo.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('RelogioDoServidor', () {
    test('usa o horário do servidor, não o do device', () {
      final agoraDevice = DateTime.utc(2026, 8, 6, 12, 0);
      // Device 3 horas adiantado em relação ao servidor.
      final servidor = agoraDevice.subtract(const Duration(hours: 3));
      final relogio = RelogioDoServidor(
        serverTime: servidor,
        relogioLocal: () => agoraDevice,
      );

      final prazo = servidor.add(const Duration(hours: 1));
      // Pelo relógio do device o prazo já passou há 2h; pelo servidor falta 1h.
      expect(relogio.aberto(prazo), isTrue);
      expect(relogio.restanteAte(prazo).inMinutes, closeTo(60, 1));
    });

    test('device atrasado também não ganha tempo extra', () {
      final agoraDevice = DateTime.utc(2026, 8, 6, 12, 0);
      // Device 5 horas atrasado: tentaria palpitar depois do apito.
      final servidor = agoraDevice.add(const Duration(hours: 5));
      final relogio = RelogioDoServidor(
        serverTime: servidor,
        relogioLocal: () => agoraDevice,
      );

      final prazoJaFechado = servidor.subtract(const Duration(minutes: 10));
      expect(relogio.aberto(prazoJaFechado), isFalse);
    });

    test('sem desvio, servidor e device coincidem', () {
      final agora = DateTime.utc(2026, 8, 6, 12, 0);
      final relogio = RelogioDoServidor(
        serverTime: agora,
        relogioLocal: () => agora,
      );
      expect(relogio.aberto(agora.add(const Duration(minutes: 1))), isTrue);
      expect(
        relogio.aberto(agora.subtract(const Duration(minutes: 1))),
        isFalse,
      );
    });
  });

  group('formatarRestante', () {
    test('prazo vencido aparece como fechado', () {
      expect(formatarRestante(Duration.zero), 'fechado');
      expect(formatarRestante(const Duration(minutes: -5)), 'fechado');
    });

    test('formata dias, horas e minutos', () {
      expect(
        formatarRestante(const Duration(days: 2, hours: 3)),
        'fecha em 2d 3h',
      );
      expect(formatarRestante(const Duration(days: 1)), 'fecha em 1d');
      expect(
        formatarRestante(const Duration(hours: 2, minutes: 15)),
        'fecha em 2h 15min',
      );
      expect(formatarRestante(const Duration(minutes: 40)), 'fecha em 40min');
    });

    test('menos de um minuto tem texto próprio — é o momento crítico', () {
      expect(
        formatarRestante(const Duration(seconds: 30)),
        'fecha em menos de 1min',
      );
    });
  });
}
