import type { Momento } from "./regras.ts";

/*
 * A venda da live na loja: o que o botão da página faz e se a compra ainda
 * pode acontecer. A mesma regra vale na página e na rota de compra.
 */

export type SalaParaVenda = {
  acesso: "paga" | "cadastro" | "aberta";
  vender_durante: boolean;
  limite_vagas: number | null;
  gravar: boolean;
  gravacao_para: "compradores" | "ninguem";
};

/* Ainda dá para garantir a vaga? null = dá; texto = o motivo de não dar. */
export function motivoParaNaoVender(sala: SalaParaVenda, momento: Momento, vagas: number): string | null {
  if (momento === "cancelada") return "Esta live foi cancelada.";
  if (sala.acesso === "aberta") return "Esta live é aberta: não precisa garantir vaga.";
  if (momento === "encerrada") {
    return sala.gravar && sala.gravacao_para === "compradores" ? null : "Esta live já aconteceu.";
  }
  if (momento === "ao_vivo" && !sala.vender_durante) return "As vagas fecharam quando a live começou.";
  if (sala.limite_vagas && vagas >= sala.limite_vagas) return "As vagas esgotaram.";
  return null;
}

export type AcaoDaLive =
  | { tipo: "entrar"; href: string; rotulo: string }
  | { tipo: "garantir"; href: string; rotulo: string }
  | { tipo: "login"; href: string; rotulo: string }
  | { tipo: "whatsapp"; href: string | null; rotulo: string }
  | { tipo: "fechado"; motivo: string };

type AcaoDaLoja =
  | { tipo: "comprar"; href: string }
  | { tipo: "entrar"; href: string }
  | { tipo: "whatsapp"; href: string | null }
  | { tipo: "fechado"; motivo: string | null };

export function acaoDaLive(params: {
  sala: SalaParaVenda;
  momento: Momento;
  vagas: number;
  jaGarantiu: boolean;
  linkDaSala: string;
  acaoDaLoja: AcaoDaLoja;
}): AcaoDaLive {
  const { sala, momento, vagas, jaGarantiu, linkDaSala, acaoDaLoja } = params;
  if (momento === "cancelada") return { tipo: "fechado", motivo: "Esta live foi cancelada pela loja." };
  const gravacaoParaQuemComprou = sala.gravar && sala.gravacao_para === "compradores";
  if (jaGarantiu || sala.acesso === "aberta") {
    if (momento === "encerrada") {
      return gravacaoParaQuemComprou ? { tipo: "entrar", href: linkDaSala, rotulo: "Assistir a gravação" } : { tipo: "fechado", motivo: "Esta live já aconteceu." };
    }
    if (momento === "ao_vivo") return { tipo: "entrar", href: linkDaSala, rotulo: "Entrar na live agora" };
    if (momento === "espera") return { tipo: "entrar", href: linkDaSala, rotulo: "Entrar na sala de espera" };
    return { tipo: "entrar", href: linkDaSala, rotulo: jaGarantiu ? "Vaga garantida · ver a sala" : "Ver a sala da live" };
  }
  const motivo = motivoParaNaoVender(sala, momento, vagas);
  if (motivo) return { tipo: "fechado", motivo };
  const rotulo = momento === "encerrada" ? "Comprar a gravação" : sala.acesso === "cadastro" ? "Garantir vaga grátis" : "Garantir minha vaga";
  if (acaoDaLoja.tipo === "comprar") return { tipo: "garantir", href: acaoDaLoja.href, rotulo };
  if (acaoDaLoja.tipo === "entrar") return { tipo: "login", href: acaoDaLoja.href, rotulo: "Entrar para garantir a vaga" };
  if (acaoDaLoja.tipo === "whatsapp") return { tipo: "whatsapp", href: acaoDaLoja.href, rotulo: "Garantir pelo WhatsApp" };
  return { tipo: "fechado", motivo: acaoDaLoja.motivo || "Indisponível no momento." };
}

/* O link "Pôr na agenda" do Google (sem conta, sem nada nosso). */
export function linkDoGoogleAgenda(params: { titulo: string; comecaEm: string; duracaoMin: number; detalhes: string; local: string }): string {
  const inicio = new Date(params.comecaEm);
  const fim = new Date(inicio.getTime() + params.duracaoMin * 60000);
  const formato = (d: Date) => d.toISOString().replace(/[-:]/g, "").replace(/\.\d{3}/, "");
  const busca = new URLSearchParams({
    action: "TEMPLATE",
    text: params.titulo,
    dates: `${formato(inicio)}/${formato(fim)}`,
    details: params.detalhes,
    location: params.local,
  });
  return `https://calendar.google.com/calendar/render?${busca.toString()}`;
}
