/// Erros que a apresentação conhece.
///
/// Ficam **fora** do cliente HTTP de propósito: com o Firebase no lugar dele, o
/// que a tela trata continua sendo isto — mensagem legível, código quando faz
/// diferença, e a marca de "foi a rede". Se cada backend trouxesse o seu tipo de
/// erro, cada tela precisaria conhecer os dois, e a troca vazaria para cima.
/// Erro de API já traduzido para mensagem legível.
///
/// O backend manda motivo distinguível em cada recusa (prazo fechado, bolão já
/// começou, convite expirado). Jogar "erro genérico" na tela desperdiça isso e
/// é o que faz o participante desistir e voltar ao WhatsApp.
class ApiError implements Exception {
  ApiError(this.mensagem, {this.status, this.semConexao = false, this.motivo});

  final String mensagem;
  final int? status;
  final bool semConexao;

  /// Motivo em código, quando o servidor manda um: `JA_COMECOU`, `EXPIRADO`,
  /// `SAIU`, `TRAVADAS`. Existe para a tela **não precisar ler o texto** para
  /// decidir o que oferecer — texto muda, decisão não pode mudar junto.
  final String? motivo;

  @override
  String toString() => mensagem;
}

/// Sinaliza que a sessão morreu e o app precisa voltar ao login.
class SessaoExpirada extends ApiError {
  SessaoExpirada() : super('sua sessão expirou', status: 401);
}
