/**
 * Quando avisar o cliente sobre a assinatura, sem banco e sem envio: a mesma
 * regra para o e-mail, a faixa do painel e os testes.
 *
 * Cada aviso tem uma referência (o dia do vencimento, ou o pedido), e o par
 * (tipo, referência) sai uma vez só. Quem renova sozinho no cartão não recebe
 * "vence em": a cobrança vem sozinha.
 */

export type TipoDeAviso =
  | "vence-em-7"
  | "vence-em-3"
  | "vence-em-1"
  | "acesso-encerrado"
  | "pagamento-confirmado"
  | "pagamento-recusado"
  | "acesso-cortado"
  | "boas-vindas";

export type ContaParaAvisar = {
  email: string;
  venceEm: Date | null;
  /** Assinatura ativa no cartão, que a Cakto cobra sozinha. */
  renovaSozinha: boolean;
  /** O acesso está liberado agora (status que libera e não vencido). */
  ativa: boolean;
};

const DIA_MS = 24 * 60 * 60 * 1000;
const BRASILIA_MS = 3 * 60 * 60 * 1000;

/** O dia (AAAA-MM-DD) em Brasília: a referência que não se repete no mesmo ciclo. */
export function diaEmBrasilia(momento: Date) {
  return new Date(momento.getTime() - BRASILIA_MS).toISOString().slice(0, 10);
}

/** Dias de calendário (em Brasília) entre hoje e o vencimento. */
export function diasAteVencer(venceEm: Date, agora = new Date()) {
  const hoje = Date.parse(`${diaEmBrasilia(agora)}T00:00:00Z`);
  const dia = Date.parse(`${diaEmBrasilia(venceEm)}T00:00:00Z`);
  return Math.round((dia - hoje) / DIA_MS);
}

export function avisosDoDia(conta: ContaParaAvisar, agora = new Date()): Array<{ tipo: TipoDeAviso; referencia: string }> {
  if (!conta.venceEm) return [];
  const referencia = diaEmBrasilia(conta.venceEm);
  const dias = diasAteVencer(conta.venceEm, agora);

  if (conta.ativa && !conta.renovaSozinha) {
    if (dias === 7) return [{ tipo: "vence-em-7", referencia }];
    if (dias === 3) return [{ tipo: "vence-em-3", referencia }];
    if (dias === 1 || dias === 0) return [{ tipo: "vence-em-1", referencia }];
  }
  /* Venceu ontem ou anteontem e não renovou: um aviso só, com o caminho de volta. */
  if (!conta.ativa && (dias === -1 || dias === -2)) return [{ tipo: "acesso-encerrado", referencia }];
  return [];
}

export type FaixaDaAssinatura = { tom: "atencao" | "ruim"; texto: string } | null;

/** A faixa do topo do painel. Mesma regra dos e-mails, dita em uma linha. */
export function faixaDaAssinatura(dados: { venceEm: Date | null; renovaSozinha: boolean; ativa: boolean; pagamentoRecusado: boolean }, agora = new Date()): FaixaDaAssinatura {
  if (!dados.ativa || !dados.venceEm) return null;
  const dias = diasAteVencer(dados.venceEm, agora);
  if (dados.pagamentoRecusado) {
    return { tom: "ruim", texto: "Não conseguimos cobrar a renovação da sua assinatura. Confira o cartão ou renove pelo painel para não perder o acesso." };
  }
  if (dados.renovaSozinha || dias > 7) return null;
  if (dias <= 0) return { tom: "ruim", texto: "Sua assinatura vence hoje. Renove para continuar usando amanhã." };
  if (dias === 1) return { tom: "ruim", texto: "Sua assinatura vence amanhã. Renove para não perder o acesso." };
  return { tom: "atencao", texto: `Sua assinatura vence em ${dias} dias. Renove para não perder o acesso.` };
}
