import { normalizarEmail, PRODUTO_KTALOGU } from "./assinatura-cakto.ts";

/**
 * As automações da assinatura (30/09/2026), sem banco: carrinho abandonado,
 * Pix gerado e não pago, primeiros passos de quem acabou de assinar e o aviso
 * ao dono da plataforma. O servidor e os testes leem daqui.
 */

const HORA_MS = 60 * 60 * 1000;
const DIA_MS = 24 * HORA_MS;

/* ------------------------------------------------------------------ */
/* Carrinho abandonado                                                 */
/* ------------------------------------------------------------------ */

export type Abandono = {
  email: string;
  nome: string | null;
  ofertaId: string | null;
  checkoutUrl: string | null;
  abandonadoEm: Date;
};

function texto(valor: unknown) {
  return typeof valor === "string" ? valor.trim() : "";
}

function registro(valor: unknown): Record<string, unknown> | null {
  return valor && typeof valor === "object" && !Array.isArray(valor) ? (valor as Record<string, unknown>) : null;
}

/**
 * O aviso `checkout_abandonment` tem forma própria: sem id de pedido, com o
 * cliente achatado em customerEmail/customerName. Só o produto da Ktalogu conta.
 */
export function lerAbandono(corpo: unknown): Abandono | null {
  const raiz = registro(corpo);
  if (texto(raiz?.event).toLowerCase() !== "checkout_abandonment") return null;
  const dados = registro(Array.isArray(raiz?.data) ? (raiz?.data as unknown[])[0] : raiz?.data);
  if (!dados || texto(registro(dados.product)?.id) !== PRODUTO_KTALOGU) return null;
  const email = normalizarEmail(dados.customerEmail);
  const quando = new Date(texto(dados.createdAt));
  if (!email || !Number.isFinite(quando.getTime())) return null;
  return {
    email,
    nome: texto(dados.customerName) || null,
    ofertaId: texto(registro(dados.offer)?.id) || null,
    checkoutUrl: texto(dados.checkoutUrl) || null,
    abandonadoEm: quando,
  };
}

/** Primeiro lembrete depois de 1 hora; o segundo, depois de 24 horas; nada passados 3 dias. */
export function lembreteDeCarrinho(abandonadoEm: Date, agora = new Date()): "carrinho-1h" | "carrinho-24h" | null {
  const idade = agora.getTime() - abandonadoEm.getTime();
  if (idade < HORA_MS || idade > 3 * DIA_MS) return null;
  return idade >= DIA_MS ? "carrinho-24h" : "carrinho-1h";
}

/* ------------------------------------------------------------------ */
/* Pix gerado e não pago                                               */
/* ------------------------------------------------------------------ */

/**
 * Lembra uma vez, a partir de 1 hora depois de gerado, e só se o Pix ainda
 * vale por mais 15 minutos (não adianta mandar um código que vai vencer).
 */
export function lembrarDoPix(criadoEm: Date, expiraEm: Date | null, agora = new Date()) {
  const idade = agora.getTime() - criadoEm.getTime();
  if (idade < HORA_MS || idade > 2 * DIA_MS) return false;
  if (expiraEm && expiraEm.getTime() - agora.getTime() < 15 * 60 * 1000) return false;
  return true;
}

/* ------------------------------------------------------------------ */
/* Primeiros passos                                                    */
/* ------------------------------------------------------------------ */

export type PrimeiroPasso = "passo-produto" | "passo-loja" | "passo-orcamento";

/**
 * Dia 1: cadastrar o primeiro produto. Dia 3: montar a loja. Dia 7: mandar o
 * primeiro orçamento. Cada um só sai se a pessoa ainda não fez aquilo, e só
 * dentro de uma janela curta (quem voltar depois não recebe o passo velho).
 */
export function primeiroPasso(diasDesdeQueAssinou: number, feitos: { produto: boolean; loja: boolean; orcamento: boolean }): PrimeiroPasso | null {
  const d = diasDesdeQueAssinou;
  if (d >= 1 && d < 3 && !feitos.produto) return "passo-produto";
  if (d >= 3 && d < 6 && !feitos.loja) return "passo-loja";
  if (d >= 7 && d < 10 && !feitos.orcamento) return "passo-orcamento";
  return null;
}

/* ------------------------------------------------------------------ */
/* Aviso ao dono da plataforma                                         */
/* ------------------------------------------------------------------ */

export type AcontecimentoParaODono = "nova" | "troca" | "renovacao" | "recusado" | "cancelamento" | "reembolso" | "chargeback";

/** O que o aviso da Cakto foi, para o e-mail do dono. Null: não interessa (Pix gerado, pedido de reembolso...). */
export function acontecimentoParaODono(evento: string, detalheDoResultado: string): AcontecimentoParaODono | null {
  switch (evento) {
    case "purchase_approved":
      return /dias de crédito/.test(detalheDoResultado) ? "troca" : "nova";
    case "subscription_renewed":
    case "subscription_late_recovered":
      return "renovacao";
    case "subscription_renewal_refused":
    case "subscription_late":
      return "recusado";
    case "subscription_canceled":
      return "cancelamento";
    case "refund":
      return "reembolso";
    case "chargeback":
      return "chargeback";
    default:
      return null;
  }
}

export const TITULO_PARA_O_DONO: Record<AcontecimentoParaODono, { emoji: string; titulo: string; tom: "bom" | "atencao" | "ruim" | "marca" }> = {
  nova: { emoji: "💰", titulo: "Nova assinatura", tom: "bom" },
  troca: { emoji: "⚡", titulo: "Troca de plano ou renovação antecipada", tom: "bom" },
  renovacao: { emoji: "🔁", titulo: "Assinatura renovada", tom: "bom" },
  recusado: { emoji: "⚠️", titulo: "Pagamento recusado", tom: "atencao" },
  cancelamento: { emoji: "✋", titulo: "Assinatura cancelada", tom: "atencao" },
  reembolso: { emoji: "↩️", titulo: "Reembolso", tom: "ruim" },
  chargeback: { emoji: "🚨", titulo: "Chargeback", tom: "ruim" },
};
