import { createAdminClient } from "@/lib/supabase-admin";
import { lembrar } from "@/lib/lembranca";
import { slugDePagina } from "@/lib/navegacao-da-loja";
import { produtoEnxuto, SELECT_DA_GRADE } from "./dados-da-loja";
import { comEstoqueV2 } from "@/lib/estoque-v2-da-loja.server";

/**
 * Uma página extra da loja (/<slug>/pagina/<pagina>, migration 197): a linha
 * de catalog_paginas e as seções dela (catalog_sections com pagina_id), com
 * os produtos das seções de produtos escolhidos no mesmo formato da home.
 *
 * Lembrada por dois minutos, na mesma lembrança da loja: a chave começa pelo
 * slug, então o aviso do painel (/api/loja/revalidar) apaga a página junto
 * com o resto da loja. Página escondida (rascunho) só sai para o editor.
 */

// eslint-disable-next-line @typescript-eslint/no-explicit-any
type Linha = any;

export type PaginaExtra = {
  id: string;
  titulo: string;
  slug: string;
  seo_titulo: string | null;
  seo_descricao: string | null;
  og_imagem: string | null;
  visivel: boolean;
  noindex: boolean;
  mostrar_titulo: boolean;
  publicada_em: string | null;
  updated_at: string | null;
  sections: Linha[];
  sectionProducts: Linha[];
};

async function buscarPaginaExtra(dono: string, paginaSlug: string, comEscondida: boolean): Promise<PaginaExtra | null> {
  const slug = slugDePagina(paginaSlug);
  if (!dono || !slug || slug !== String(paginaSlug || "").toLowerCase()) return null;
  const supabase = createAdminClient();

  let consulta = supabase
    .from("catalog_paginas")
    .select("id,titulo,slug,seo_titulo,seo_descricao,og_imagem,visivel,noindex,mostrar_titulo,publicada_em,updated_at")
    .eq("user_id", dono)
    .eq("slug", slug);
  if (!comEscondida) consulta = consulta.eq("visivel", true);
  const { data: pagina, error } = await consulta.maybeSingle();
  if (error || !pagina) return null;

  const { data: secoes } = await supabase
    .from("catalog_sections")
    .select("*")
    .eq("user_id", dono)
    .eq("pagina_id", pagina.id)
    .eq("active", true)
    .order("position", { ascending: true });
  const lista = Array.isArray(secoes) ? (secoes as Linha[]) : [];

  const produtos = lista.length
    ? await supabase
        .from("catalog_section_products")
        .select(`*, product:products(${SELECT_DA_GRADE})`)
        .in("section_id", lista.map((secao) => String(secao.id)))
        .order("position", { ascending: true })
    : { data: [] as Linha[] };
  const linhasDosProdutos = Array.isArray(produtos.data) ? (produtos.data as Linha[]) : [];
  /* Estoque v2: o selo "Esgotado" pela conta do banco (fora do v2, intacto). */
  const produtosMarcados = await comEstoqueV2(
    supabase,
    dono,
    linhasDosProdutos.map((linha) => (linha.product && typeof linha.product === "object" ? produtoEnxuto(linha.product as Linha) : null))
  );

  return {
    id: String(pagina.id),
    titulo: String(pagina.titulo || ""),
    slug: String(pagina.slug || ""),
    seo_titulo: pagina.seo_titulo ?? null,
    seo_descricao: pagina.seo_descricao ?? null,
    og_imagem: pagina.og_imagem ?? null,
    visivel: pagina.visivel === true,
    noindex: pagina.noindex === true,
    mostrar_titulo: pagina.mostrar_titulo !== false,
    publicada_em: pagina.publicada_em ?? null,
    updated_at: pagina.updated_at ?? null,
    sections: lista,
    sectionProducts: linhasDosProdutos.map((linha, indice) => ({
      ...linha,
      product: produtosMarcados[indice] ?? null,
    })),
  };
}

/** A página visível, lembrada por dois minutos. */
export function carregarPaginaExtra(slugDaLoja: string, dono: string, paginaSlug: string): Promise<PaginaExtra | null> {
  const loja = String(slugDaLoja || "").trim().toLowerCase();
  const chave = `${loja}/pagina/${String(paginaSlug || "").toLowerCase()}`;
  return lembrar(chave, () => buscarPaginaExtra(dono, paginaSlug, false));
}

/** No editor: lida agora, e também a escondida (o lojista monta antes de mostrar). */
export function carregarPaginaExtraAgora(dono: string, paginaSlug: string): Promise<PaginaExtra | null> {
  return buscarPaginaExtra(dono, paginaSlug, true);
}
