import type { InfoDaLive } from "@/components/digitais/VendaDaLive";
import { quemAssiste } from "@/lib/digitais/servidor/curso";

import { momentoDaSala } from "../regras.ts";
import { acaoDaLive, linkDoGoogleAgenda, motivoParaNaoVender } from "../venda.ts";
import { CAMPOS_DA_SALA, type Admin, type SalaDoBanco } from "./sala.ts";

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

export async function salaDoProduto(admin: Admin, lojaId: string, produtoId: string): Promise<(SalaDoBanco & { aprender?: unknown }) | null> {
  const { data } = await admin.from("live_salas").select(`${CAMPOS_DA_SALA},aprender`).eq("user_id", lojaId).eq("product_id", produtoId).maybeSingle();
  return (data as (SalaDoBanco & { aprender?: unknown }) | null) ?? null;
}

/* Quantas vagas a live já tem (acessos abertos). */
export async function vagasDaLive(admin: Admin, lojaId: string, produtoId: string): Promise<number> {
  const { count } = await admin
    .from("digital_entitlements")
    .select("id", { count: "exact", head: true })
    .eq("user_id", lojaId)
    .eq("product_id", produtoId)
    .in("status", ["ativo", "agendado"]);
  return count ?? 0;
}

/* A página de venda da live: o que mostrar e o que o botão faz. */
export async function montarInfoDaLive(
  admin: Admin,
  params: { slug: string; lojaId: string; produtoId: string; nome: string; nomeDaLoja: string; acaoDaLoja: AcaoDaLoja },
): Promise<InfoDaLive | null> {
  const sala = await salaDoProduto(admin, params.lojaId, params.produtoId);
  if (!sala) return null;
  const momento = momentoDaSala(sala);
  const [vagas, quem] = await Promise.all([
    vagasDaLive(admin, params.lojaId, params.produtoId),
    sala.acesso === "aberta" ? Promise.resolve(null) : quemAssiste(admin, { slug: params.slug, lojaId: params.lojaId, produtoId: params.produtoId, tipo: "live" }),
  ]);
  const linkDaSala = `/${params.slug}/live/${sala.id}`;
  return {
    comecaEm: sala.comeca_em,
    duracaoMin: sala.duracao_min,
    esperaMin: sala.espera_min,
    acesso: sala.acesso,
    momento,
    gravacaoParaQuemComprou: sala.gravar && sala.gravacao_para === "compradores",
    apresentador: { nome: sala.apresentador_nome, bio: sala.apresentador_bio, foto: sala.apresentador_foto },
    aprender: (Array.isArray(sala.aprender) ? sala.aprender : []).filter((l): l is string => typeof l === "string" && Boolean(l.trim())).slice(0, 8),
    vagas,
    limiteVagas: sala.limite_vagas,
    agenda: linkDoGoogleAgenda({
      titulo: params.nome,
      comecaEm: sala.comeca_em,
      duracaoMin: sala.duracao_min,
      detalhes: `Live da ${params.nomeDaLoja}. Para entrar, use o link que chegou no seu e-mail ou a área de membros da loja.`,
      local: `${params.nomeDaLoja} · ao vivo`,
    }),
    acao: acaoDaLive({ sala, momento, vagas, jaGarantiu: quem?.tipo === "aluno" || quem?.tipo === "equipe", linkDaSala, acaoDaLoja: params.acaoDaLoja }),
  };
}

/* Na compra: a live ainda vende? null = sim; texto = por que não. */
export async function motivoParaNaoVenderALive(admin: Admin, lojaId: string, produtoId: string): Promise<string | null> {
  const sala = await salaDoProduto(admin, lojaId, produtoId);
  if (!sala) return "Esta live não está disponível.";
  const vagas = sala.limite_vagas ? await vagasDaLive(admin, lojaId, produtoId) : 0;
  return motivoParaNaoVender(sala, momentoDaSala(sala), vagas);
}
