import '../../../core/api/api_client.dart';
import '../../../core/sessao/sessao_store.dart';

class Conta {
  const Conta({
    required this.id,
    required this.email,
    required this.displayName,
  });

  factory Conta.doJson(Map<String, dynamic> j) => Conta(
    id: j['id'] as String,
    email: j['email'] as String,
    displayName: j['displayName'] as String,
  );

  final String id;
  final String email;
  final String displayName;
}

class AuthRepository {
  AuthRepository(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).
  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);
  }

  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.
  Future<Conta> minhaConta() async {
    final r = await _api.get<Map<String, dynamic>>('/auth/me');
    return Conta.doJson(r);
  }

  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();
  }
}
