import type { Metadata } from "next";
import { headers } from "next/headers";
import { notFound } from "next/navigation";
import type { ReactNode } from "react";

import MoldeDosMembros from "@/components/digitais/membros/MoldeDosMembros";
import GravacaoDaLive from "@/components/live/GravacaoDaLive";
import SalaDaLive, { type AcessoInicial } from "@/components/live/SalaDaLive";
import { ajustesDosDigitais, corDaArea } from "@/lib/digitais/servidor/ajustes-do-pedido";
import { quemAssiste } from "@/lib/digitais/servidor/curso";
import { momentoDaSala } from "@/lib/live/regras";
import { gravacoesDaSala } from "@/lib/live/servidor/gravacoes";
import { chaveDoApresentadorValida, conviteValido, lerSala } from "@/lib/live/servidor/sala";
import { buildCatalogMetadata } from "@/lib/catalog-metadata";
import { carregarLoja } from "@/lib/loja/dados-da-loja";
import { createAdminClient } from "@/lib/supabase-admin";

import "@/components/live/live.css";

/*
 * A sala da live (prévias 18-20): a entrada estilo Meet, a sala ao vivo e,
 * depois que acaba, a gravação. Quem pode entrar é conferido aqui (para a
 * tela certa) e de novo na rota de entrada (que é quem manda).
 */

export const dynamic = "force-dynamic";
export const revalidate = 0;

type Props = {
  params: Promise<{ slug: string; salaId: string }>;
  searchParams: Promise<{ apresentar?: string; convite?: string }>;
};

/*
 * O que aparece na aba e na prévia do link (WhatsApp, Instagram, Facebook):
 * tudo da loja que organizou, nunca do Ktalogu. Ícone da loja, título e
 * descrição da própria live, a capa da live (ou a imagem da loja) e o link
 * curto que a pessoa mandou como endereço.
 */
export async function generateMetadata(props: Props): Promise<Metadata> {
  const { slug, salaId } = await props.params;
  const admin = createAdminClient();
  const [dados, sala] = await Promise.all([carregarLoja(slug), lerSala(admin, salaId)]);
  const perfil = dados?.profile ?? null;
  const nome = perfil?.catalog_name || perfil?.store_name || "Loja";
  if (!perfil || !sala || sala.user_id !== String(perfil.id)) {
    return { title: { absolute: nome }, robots: { index: false, follow: false } };
  }
  const produto = sala.product_id
    ? ((await admin.from("products").select("description,image_url").eq("id", sala.product_id).maybeSingle()).data as {
        description: string | null;
        image_url: string | null;
      } | null)
    : null;
  const reuniao = sala.categoria === "reuniao";
  const quando = quandoCurto(sala.comeca_em);
  const resumo = (produto?.description ?? "").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
  const descricao = reuniao
    ? `Reunião com ${nome}${quando ? ` · ${quando}` : ""}. Toque no link para entrar.`
    : resumo
      ? `${resumo.slice(0, 150)}${resumo.length > 150 ? "…" : ""}`
      : `Live de ${nome}${quando ? ` · ${quando}` : ""}. Toque no link para participar.`;
  const capa = produto?.image_url && /^https:\/\//.test(produto.image_url) ? produto.image_url : null;
  const base = buildCatalogMetadata({ profile: perfil, scope: "page", pageTitle: `${sala.titulo} · ${nome}`, pageDescription: descricao, path: `/live/${sala.id}`, image: capa, imageAlt: sala.titulo });

  /* O endereço da prévia é o link curto, no domínio por onde a pessoa abriu (o da loja, se tiver). */
  const cabecalhos = await headers();
  const host = (cabecalhos.get("x-forwarded-host") || cabecalhos.get("host") || "").split(",")[0].trim();
  const protocolo = host.startsWith("localhost") || host.startsWith("127.0.0.1") ? "http" : "https";
  const linkCurto = host ? `${protocolo}://${host}/${sala.codigo}` : undefined;

  /* Sem imagem própria nem da loja, a prévia fica sem imagem (nunca a logo do Ktalogu). */
  const imagens = (base.openGraph?.images ? (Array.isArray(base.openGraph.images) ? base.openGraph.images : [base.openGraph.images]) : []).filter((imagem) => {
    const url = typeof imagem === "string" ? imagem : imagem instanceof URL ? imagem.href : String((imagem as { url: string | URL }).url);
    return !url.includes("brand-logo");
  });
  return {
    ...base,
    applicationName: nome,
    robots: { index: false, follow: false },
    alternates: linkCurto ? { canonical: linkCurto } : undefined,
    openGraph: { ...base.openGraph, url: linkCurto, images: imagens },
    twitter: { ...base.twitter, card: imagens.length ? "summary_large_image" : "summary", images: imagens.length ? base.twitter?.images : undefined },
  };
}

function quandoCurto(iso: string) {
  try {
    return new Intl.DateTimeFormat("pt-BR", { weekday: "short", day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit", timeZone: "America/Sao_Paulo" }).format(
      new Date(iso),
    );
  } catch {
    return "";
  }
}

/* A hora em que a página foi montada (o relógio da sala começa dela). */
function horaDoServidor() {
  return Date.now();
}

function quandoPorExtenso(iso: string) {
  try {
    return new Intl.DateTimeFormat("pt-BR", { day: "2-digit", month: "long", year: "numeric", hour: "2-digit", minute: "2-digit", timeZone: "America/Sao_Paulo" }).format(
      new Date(iso),
    );
  } catch {
    return "";
  }
}

export default async function PaginaDaLive(props: Props) {
  const { slug, salaId } = await props.params;
  const busca = await props.searchParams;
  const dados = await carregarLoja(slug);
  const perfil = dados?.profile;
  if (!perfil) return notFound();
  const lojaId = String(perfil.id);
  const admin = createAdminClient();
  const sala = await lerSala(admin, salaId);
  if (!sala || sala.user_id !== lojaId) return notFound();

  const [ajustes, produtoR] = await Promise.all([
    ajustesDosDigitais(lojaId),
    sala.product_id ? admin.from("products").select("id,name,image_url").eq("id", sala.product_id).maybeSingle() : Promise.resolve({ data: null }),
  ]);
  const produto = produtoR.data as { id: string; name: string; image_url: string | null } | null;
  const { fonte, fundo, capas } = ajustes.area;
  const cor = corDaArea(ajustes, perfil);
  const nomeDaLoja = String(perfil.catalog_name || perfil.store_name || "Loja");
  const logo = (perfil as { catalog_logo_url?: string | null; logo_url?: string | null }).catalog_logo_url || (perfil as { logo_url?: string | null }).logo_url || null;

  /* Quem é, para a tela certa (a rota de entrada confere de novo). */
  let acessoInicial: AcessoInicial = "comprar";
  let motivo: string | null = null;
  const apresentar = typeof busca.apresentar === "string" ? busca.apresentar : null;
  const convite = typeof busca.convite === "string" ? busca.convite : null;
  if (apresentar && chaveDoApresentadorValida(sala.id, apresentar)) acessoInicial = "apresentador";
  else if (convite && conviteValido(sala, convite)) acessoInicial = "convidado";
  else {
    const quem = sala.product_id ? await quemAssiste(admin, { slug, lojaId, produtoId: sala.product_id, tipo: "live" }) : null;
    if (quem?.tipo === "aluno") acessoInicial = "aluno";
    else if (quem?.tipo === "equipe") acessoInicial = "equipe";
    else if (sala.acesso === "aberta") acessoInicial = "aberta";
    else if (quem?.tipo === "fechado") {
      acessoInicial = "fechado";
      motivo = quem.motivo;
    }
  }
  if (apresentar && acessoInicial !== "apresentador") motivo = "Este link de quem apresenta venceu. Gere outro no painel, em Lives → Entrar ao vivo.";

  const momento = momentoDaSala(sala);
  const linkDeVolta = `/${slug}/membros`;
  const linkDoProduto = sala.product_id ? `/${slug}/p/${sala.product_id}` : null;

  let conteudo: ReactNode;
  if (momento === "encerrada" && acessoInicial !== "apresentador") {
    const podeVer = sala.gravar && sala.gravacao_para === "compradores" && ["aluno", "equipe", "aberta"].includes(acessoInicial);
    conteudo = podeVer ? (
      <GravacaoDaLive
        titulo={sala.titulo}
        loja={nomeDaLoja}
        quando={quandoPorExtenso(sala.iniciada_em ?? sala.comeca_em)}
        gravacoes={await gravacoesDaSala(admin, sala)}
        linkDeVolta={linkDeVolta}
      />
    ) : (
      <main className="lv-entrada" style={{ gridTemplateColumns: "1fr", textAlign: "center", justifyItems: "center" }}>
        <section>
          <small className="lv-sobre">{nomeDaLoja}</small>
          <h1 className="mb-titulo">{sala.categoria === "reuniao" ? "Esta reunião já terminou" : "Esta live já terminou"}</h1>
          <p className="lv-quando">
            {sala.categoria === "reuniao"
              ? "Obrigado por participar."
              : sala.gravar && sala.gravacao_para === "compradores"
                ? "A gravação fica para quem garantiu a vaga: entre na área de membros com o seu e-mail."
                : "Fique de olho na loja para a próxima."}
          </p>
          {sala.categoria === "reuniao" ? null : (
            <div className="lv-form" style={{ margin: "24px auto 0" }}>
              <a className="lv-botao" href={linkDeVolta}>
                Ir para a área de membros
              </a>
            </div>
          )}
        </section>
      </main>
    );
  } else if (momento === "cancelada") {
    conteudo = (
      <main className="lv-entrada" style={{ gridTemplateColumns: "1fr", textAlign: "center", justifyItems: "center" }}>
        <section>
          <h1 className="mb-titulo">{sala.categoria === "reuniao" ? "Esta reunião foi cancelada" : "Esta live foi cancelada"}</h1>
          <p className="lv-quando">{sala.categoria === "reuniao" ? "Quem organizou cancelou esta reunião." : "A loja cancelou esta live. Se você pagou, fale com ela."}</p>
        </section>
      </main>
    );
  } else {
    conteudo = (
      <SalaDaLive
        salaId={sala.id}
        titulo={sala.titulo}
        comecaEm={sala.comeca_em}
        esperaMin={sala.espera_min}
        duracaoMin={sala.duracao_min}
        acesso={sala.acesso}
        categoria={sala.categoria}
        participacao={sala.participacao}
        loja={{ nome: nomeDaLoja, logo }}
        capa={produto?.image_url ?? null}
        apresentador={{ nome: sala.apresentador_nome, foto: sala.apresentador_foto }}
        chaveDoApresentador={acessoInicial === "apresentador" ? apresentar : null}
        convite={acessoInicial === "convidado" ? convite : null}
        acessoInicial={motivo && acessoInicial !== "fechado" && apresentar ? "fechado" : acessoInicial}
        motivo={motivo}
        linkDoProduto={linkDoProduto}
        linkDeVolta={linkDeVolta}
        gravacaoParaQuemComprou={sala.gravacao_para === "compradores"}
        agora={horaDoServidor()}
      />
    );
  }

  return (
    <MoldeDosMembros aparencia={{ fonte, fundo, capas }} cor={cor}>
      {conteudo}
    </MoldeDosMembros>
  );
}
