// Implementação HTTP — o backend NestJS da fase 1.
//
// Continua aqui porque `MG-9` ainda não desligou o servidor antigo: enquanto a
// migração não é verificada ponta a ponta (`MG-8`), poder voltar para ele é o
// que separa "trocamos o backend" de "não temos backend".
import '../../../core/api/api_client.dart';
import 'ciclo_vida_repository.dart';

class CicloVidaRepositoryHttp implements CicloVidaRepository {
  CicloVidaRepositoryHttp(this._api);

  final ApiClient _api;

  /// Campeão e ranking final de bolão já encerrado. Leitura: **todo
  /// participante** pode ver, não só quem encerrou.
  @override
  Future<Encerramento> lerEncerramento(String poolId) async {
    final r = await _api.get<Map<String, dynamic>>('/pools/$poolId/closing');
    return Encerramento.doJson(r);
  }

  @override
  Future<Encerramento> encerrar(String poolId) async {
    final r = await _api.post<Map<String, dynamic>>('/pools/$poolId/close');
    return Encerramento.doJson(r);
  }

  @override
  Future<Encerramento> encerrarAntecipado(String poolId) async {
    final r = await _api.post<Map<String, dynamic>>(
      '/pools/$poolId/close-early',
    );
    return Encerramento.doJson(r);
  }

  @override
  Future<void> arquivar(String poolId) async {
    await _api.post<Map<String, dynamic>>('/pools/$poolId/archive');
  }

  @override
  Future<void> desarquivar(String poolId) async {
    await _api.delete<Map<String, dynamic>>('/pools/$poolId/archive');
  }

  @override
  Future<List<ParticipacaoEncerrada>> historico() async {
    final r = await _api.get<List<dynamic>>('/pools/history');
    return r
        .cast<Map<String, dynamic>>()
        .map(ParticipacaoEncerrada.doJson)
        .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 _api.post<Map<String, dynamic>>(
      '/pools/$poolId/recreate',
      body: {
        '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,
    );
  }
}
