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 { criarPassagemDoEditor, lojaLocalValida, VALIDADE_DA_PASSAGEM_S } from "@/lib/loja/passagem-do-editor";

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

/**
 * O endereço da loja aberta como editor da página inicial (Catálogo >
 * Produtos > Página inicial). A loja é sempre a da empresa de quem está
 * logado: o corpo do pedido não escolhe loja nenhuma.
 *
 * A passagem leva a origem por onde ESTE pedido chegou (é a janela do painel
 * que vai conter o quadro), para a loja só conversar com ela.
 */
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.products.write")) {
    return NextResponse.json({ error: "Sem permissão para mexer na página inicial da loja." }, { status: 403 });
  }

  const dono = resolveCompanyPublicProfileId(ctx, user.id);
  const { data: perfil } = await supabase.from("profiles").select("id,slug,catalog_theme").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. Defina o link da loja em Catálogo > Personalização." }, { status: 409 });
  }

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

  /* Onde a loja atende para o navegador: o endereç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 (a loja de desenvolvimento roda na 3005). */
  const corpo = (await req.json().catch(() => null)) as { lojaLocal?: unknown; pagina?: 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 });

  /* Uma página extra (migration 197) abre no endereço dela. A página tem de
     ser desta loja: o id que veio no corpo só escolhe entre as páginas dela. */
  let caminho = `/${encodeURIComponent(slug)}`;
  const paginaPedida = String(corpo?.pagina ?? "").trim();
  if (paginaPedida) {
    if (!/^[0-9a-f-]{36}$/i.test(paginaPedida)) return NextResponse.json({ error: "Página inválida." }, { status: 400 });
    const { data: pagina } = await supabase
      .from("catalog_paginas")
      .select("slug")
      .eq("id", paginaPedida)
      .eq("user_id", dono)
      .maybeSingle();
    const slugDaPagina = String((pagina as { slug?: string | null } | null)?.slug || "");
    if (!slugDaPagina) return NextResponse.json({ error: "Essa página não existe mais." }, { status: 404 });
    caminho = `${caminho}/pagina/${encodeURIComponent(slugDaPagina)}`;
  }

  const origemDoPainel = origemDoPedido(req);
  const passagem = criarPassagemDoEditor({ dono, slug, origemDoPainel }, chave);
  const endereco = `${base}${caminho}?editar=${encodeURIComponent(passagem)}`;

  return NextResponse.json(
    {
      endereco,
      origemDaLoja: new URL(base).origin,
      enderecoPublico: `${base}${caminho}`,
      slug,
      dono,
      tema: (perfil as { catalog_theme?: string | null } | null)?.catalog_theme || "default",
      venceEm: Date.now() + VALIDADE_DA_PASSAGEM_S * 1000,
    },
    { headers: { "Cache-Control": "no-store" } }
  );
}
