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

import AvisoDosMembros from "@/components/digitais/membros/AvisoDosMembros";
import EntrarNosMembros from "@/components/digitais/membros/EntrarNosMembros";
import PaginaDoCurso, { type MarcaNaTela } from "@/components/digitais/membros/PaginaDoCurso";
import FontesDaLoja from "@/components/FontesDaLoja";
import { aulaParaContinuar, contarProgresso } from "@/lib/digitais/progresso-do-curso";
import { estruturaParaAluno, lerCursoDaLoja, progressoDoAluno, quemAssiste } from "@/lib/digitais/servidor/curso";
import { ajustesDosDigitais, corDaArea } from "@/lib/digitais/servidor/ajustes-do-pedido";
import { miniatura, TAMANHO } from "@/lib/foto";
import { carregarLoja } from "@/lib/loja/dados-da-loja";
import { lerClienteLogado } from "@/lib/loja/visao.server";
import { normalizeWhatsappForLink } from "@/lib/phone";
import { createAdminClient } from "@/lib/supabase-admin";

/*
 * O curso na área de membros. Abre para quem comprou (sessão do portal, ou o
 * navegador da compra, ou o link do e-mail) e para a prévia da equipe. Vale
 * mesmo com a loja pausada ou o curso fora da vitrine: quem comprou assiste.
 */

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

type Props = { params: Promise<{ slug: string; produtoId: string }> };

export async function generateMetadata(props: Props): Promise<Metadata> {
  const { slug } = await props.params;
  const dados = await carregarLoja(slug);
  const nome = dados?.profile?.catalog_name || dados?.profile?.store_name || "Loja";
  return { title: { absolute: `Conteúdo | ${nome}` }, robots: { index: false, follow: false } };
}

export default async function PaginaDoCursoNaArea(props: Props) {
  const { slug, produtoId } = await props.params;
  const dados = await carregarLoja(slug);
  const perfil = dados?.profile;
  if (!dados || !perfil) return notFound();
  const lojaId = String(perfil.id);

  const admin = createAdminClient();
  const [ajustes, curso, cliente] = await Promise.all([ajustesDosDigitais(lojaId), lerCursoDaLoja(admin, lojaId, produtoId), lerClienteLogado(slug)]);
  if (!curso) return notFound();
  const nomeDaLoja = String(perfil.catalog_name || perfil.store_name || "Loja");
  const nomeDaArea = ajustes.area.nome || nomeDaLoja;
  const cor = corDaArea(ajustes, perfil);
  const escuro = ajustes.area.fundo !== "claro";
  const whatsapp = normalizeWhatsappForLink(perfil.whatsapp) || null;
  const pessoa = cliente ? { nome: cliente.name || "" } : null;

  const quem = await quemAssiste(admin, { slug, lojaId, produtoId: curso.id });
  if (!quem) {
    if (!cliente) {
      return (
        <>
          <FontesDaLoja perfil={perfil} />
          <EntrarNosMembros
            slug={slug}
            nomeDaArea={nomeDaArea}
            nomeDaLoja={nomeDaLoja}
            cor={cor}
            escuro={escuro}
            titulo="Entre para assistir"
            destino={`/${slug}/membros/curso/${curso.id}`}
          />
        </>
      );
    }
    return (
      <>
        <FontesDaLoja perfil={perfil} />
        <AvisoDosMembros
          slug={slug}
          nomeDaArea={nomeDaArea}
          cor={cor}
          escuro={escuro}
          pessoa={pessoa}
          titulo="Este conteúdo não está nas suas compras"
          texto={`Você entrou como ${cliente.name || "cliente"}. Se comprou com outro e-mail, saia e entre com ele.`}
          acao={curso.ativo ? { rotulo: "Conhecer o conteúdo", href: `/${slug}/p/${curso.id}` } : null}
          whatsapp={whatsapp}
        />
      </>
    );
  }
  if (quem.tipo === "fechado") {
    return (
      <>
        <FontesDaLoja perfil={perfil} />
        <AvisoDosMembros slug={slug} nomeDaArea={nomeDaArea} cor={cor} escuro={escuro} pessoa={pessoa} titulo="O conteúdo está fechado para você" texto={quem.motivo} whatsapp={whatsapp} />
      </>
    );
  }

  const equipe = quem.tipo === "equipe";
  const [modulos, progresso] = await Promise.all([
    estruturaParaAluno(admin, { lojaId, produtoId: curso.id, inicio: quem.tipo === "aluno" ? quem.inicio : null, equipe }),
    quem.tipo === "aluno" ? progressoDoAluno(admin, quem.clienteId, curso.id) : Promise.resolve(new Map()),
  ]);
  const ordem = modulos.flatMap((m) => m.aulas);
  const contagem = contarProgresso(ordem, progresso);
  const continuar = aulaParaContinuar(ordem, progresso);
  const tituloDe = (id: string) => ordem.find((a) => a.id === id)?.titulo ?? "";
  const marcas: Record<string, MarcaNaTela> = {};
  for (const aula of ordem) {
    const p = progresso.get(aula.id);
    if (p) marcas[aula.id] = { concluida: p.concluida, posicaoS: p.posicaoS, duracaoS: p.duracaoS };
  }

  return (
    <>
      <FontesDaLoja perfil={perfil} />
      <PaginaDoCurso
        slug={slug}
        nomeDaArea={nomeDaArea}
        nomeDaLoja={nomeDaLoja}
        cor={cor}
        foto={ajustes.area.banner}
        escuro={escuro}
        pessoa={pessoa}
        previa={equipe}
        curso={{
          id: curso.id,
          nome: curso.nome,
          capa: miniatura(curso.capa, TAMANHO.produto) || curso.capa,
          professor: curso.config.curso?.professor ?? null,
          duracaoS: curso.config.curso?.conteudo.duracaoS ?? 0,
          materiais: curso.config.curso?.conteudo.materiais ?? 0,
        }}
        modulos={modulos}
        marcas={marcas}
        contagem={contagem}
        continuar={continuar ? { ...continuar, titulo: tituloDe(continuar.id) } : null}
        proximaAbre={continuar ? null : ordem.find((a) => !a.aberta)?.abre ?? null}
        expiraEm={quem.tipo === "aluno" ? quem.expiraEm : null}
        whatsapp={whatsapp}
      />
    </>
  );
}
