// 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 '../../../core/sessao/sessao_store.dart';
import 'auth_repository.dart';

class AuthRepositoryHttp implements AuthRepository {
  AuthRepositoryHttp(this._api, this._sessao);

  final ApiClient _api;
  final SessaoStore _sessao;

  /// Cadastro. Não faz login automático aqui: quem orquestra é o controller,
  /// para o convite poder seguir direto ao bolão depois (CC-5).
  @override
  Future<Conta> cadastrar({
    required String email,
    required String senha,
    required String nomeExibicao,
  }) async {
    final r = await _api.post<Map<String, dynamic>>(
      '/auth/register',
      body: {'email': email, 'password': senha, 'displayName': nomeExibicao},
    );
    return Conta.doJson(r);
  }

  @override
  Future<void> entrar({required String email, required String senha}) async {
    final r = await _api.post<Map<String, dynamic>>(
      '/auth/login',
      body: {'email': email, 'password': senha},
    );
    await _sessao.salvar(
      accessToken: r['accessToken'] as String,
      refreshToken: r['refreshToken'] as String,
    );
  }

  /// Conta da sessão atual. Usado no cold start para saber se ainda vale.
  @override
  Future<Conta> minhaConta() async {
    final r = await _api.get<Map<String, dynamic>>('/auth/me');
    return Conta.doJson(r);
  }

  @override
  Future<void> sair() async {
    final refresh = await _sessao.refreshToken;
    if (refresh != null) {
      try {
        await _api.post<void>('/auth/logout', body: {'refreshToken': refresh});
      } on ApiError {
        // Logout local acontece de qualquer forma: credencial no device é o que
        // dá acesso, então limpar é mais importante que confirmar com o servidor.
      }
    }
    await _sessao.limpar();
  }
}
