import { NextResponse } from "next/server";
import { createClient } from "@/lib/supabase-server";
import { canCompany, getCompanyContext, resolveCompanyPublicProfileId } from "@/lib/company-context";
import { enderecosDaLoja } from "@/lib/endereco-da-loja";
import { origemDoPedido } from "@/lib/origem-publica";
import { lojaLocalValida } from "@/lib/loja/passagem-do-editor";
import { criarPassagemDaPrevia, VALIDADE_DA_PREVIA_S } from "@/lib/loja/passagem-da-previa";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

/**
 * A prévia dos temas (Catálogo > Personalização): a passagem que deixa a
 * PRÓPRIA loja abrir em cada tema, para os cartões mostrarem a loja de
 * verdade. A loja é sempre a da empresa de quem está logado: o corpo do
 * pedido não escolhe loja nenhuma. Nada é gravado: escolher o tema continua
 * sendo o "Salvar alterações" da tela.
 *
 * O endereço da loja sai da mesma conta do editor da página inicial
 * (api/loja/editor): o público, nunca o 127.0.0.1:3001 interno da produção;
 * fora de produção a tela pode pedir outra porta local (?loja= na tela).
 */
export async function POST(req: Request) {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return NextResponse.json({ error: "Entre no painel de novo." }, { status: 401 });

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "catalog.store.read")) {
    return NextResponse.json({ error: "Sem permissão para ver a personalização da loja." }, { status: 403 });
  }

  const dono = resolveCompanyPublicProfileId(ctx, user.id);
  const { data: perfil } = await supabase.from("profiles").select("id,slug").eq("id", dono).maybeSingle();
  const slug = String((perfil as { slug?: string | null } | null)?.slug || "").trim().toLowerCase();
  if (!slug) {
    return NextResponse.json({ error: "A loja ainda não tem endereço." }, { status: 409, headers: { "Cache-Control": "no-store" } });
  }

  const chave = process.env.SUPABASE_SERVICE_ROLE_KEY || "";
  if (!chave) return NextResponse.json({ error: "O servidor não está pronto para a prévia." }, { status: 500 });

  const corpo = (await req.json().catch(() => null)) as { lojaLocal?: unknown } | null;
  const local = process.env.NODE_ENV !== "production" ? lojaLocalValida(corpo?.lojaLocal) : null;
  const publico = enderecosDaLoja(req).filter((base) => !base.startsWith("http://127.0.0.1"));
  const base = local || publico[publico.length - 1] || "";
  if (!base) return NextResponse.json({ error: "Não encontrei o endereço da loja." }, { status: 500 });

  const passagem = criarPassagemDaPrevia({ dono, slug, origemDoPainel: origemDoPedido(req) }, chave);

  return NextResponse.json(
    {
      /* A tela monta `${endereco}&tema=<tema>` para cada cartão. */
      endereco: `${base}/${encodeURIComponent(slug)}?previa=${encodeURIComponent(passagem)}`,
      slug,
      venceEm: Date.now() + VALIDADE_DA_PREVIA_S * 1000,
    },
    { headers: { "Cache-Control": "no-store" } }
  );
}
