import '../../../core/firebase/chamadas.dart';
import 'ciclo_vida_repository.dart';

/// Encerramento, arquivamento, histórico e recriação sobre Firestore.
///
/// Tudo por callable, e por um motivo só: **nenhuma destas decisões cabe numa
/// rule**. Encerrar exige varrer os jogos atrás de pendência, recriar copia a
/// galera inteira para um bolão novo, e o histórico compõe o índice do usuário
/// com a classificação de cada bolão encerrado.
///
/// O campeão continua **derivado na leitura**: ele sai da classificação
/// materializada, não de um campo gravado no encerramento. Correção de placar
/// depois disso muda o campeão — é a decisão de 03/08, e é o que impede o app de
/// mostrar um título que os pontos já não sustentam.
class CicloVidaRepositoryFirebase implements CicloVidaRepository {
  CicloVidaRepositoryFirebase([Callables? callables])
    : _callables = callables ?? Callables();

  final Callables _callables;

  @override
  Future<Encerramento> lerEncerramento(String poolId) async {
    // A mesma callable de encerrar: ela devolve o resultado sem reencerrar
    // quando o bolão já está fechado, e recusa quando ainda há jogo pendente.
    return encerrar(poolId);
  }

  @override
  Future<Encerramento> encerrar(String poolId) async {
    final r = await _callables.chamar<Map<String, dynamic>>('encerrarBolao', {
      'poolId': poolId,
    });
    return Encerramento.doJson(mapaDaCallable(r));
  }

  @override
  Future<Encerramento> encerrarAntecipado(String poolId) async {
    final r = await _callables.chamar<Map<String, dynamic>>(
      'encerrarBolaoAntecipadamente',
      {'poolId': poolId},
    );
    return Encerramento.doJson(mapaDaCallable(r));
  }

  @override
  Future<void> arquivar(String poolId) => _callables.chamar<dynamic>(
    'arquivarBolao',
    {'poolId': poolId, 'arquivar': true},
  );

  @override
  Future<void> desarquivar(String poolId) => _callables.chamar<dynamic>(
    'arquivarBolao',
    {'poolId': poolId, 'arquivar': false},
  );

  @override
  Future<List<ParticipacaoEncerrada>> historico() async {
    final r = await _callables.chamar<List<dynamic>>('historicoDeBoloes');
    return r
        .map(
          (e) => ParticipacaoEncerrada.doJson(
            mapaDaCallable(e as Map<dynamic, dynamic>),
          ),
        )
        .toList();
  }

  @override
  Future<({String id, String nome, int herdados, int totalJogos})> recriar(
    String poolId, {
    required int rodadaInicial,
    required int rodadaFinal,
    String? nome,
  }) async {
    final r = await _callables
        .chamar<Map<String, dynamic>>('recriarTemporada', {
          'poolId': poolId,
          'matchdayFrom': rodadaInicial,
          'matchdayTo': rodadaFinal,
          'name': ?nome,
        });
    return (
      id: r['id'] as String,
      nome: r['name'] as String,
      herdados: r['inheritedMembers'] as int,
      totalJogos: r['totalMatches'] as int,
    );
  }
}
