import { NextResponse } from "next/server";
import { canCompany, getCompanyContext, resolveCompanyPublicProfileId } from "@/lib/company-context";
import { createAdminClient, createClient } from "@/lib/supabase-server";
import { origemPublicaDoAdmin } from "@/lib/origem-publica";
import { normalizePublicBaseUrl } from "@/lib/public-catalog-url";
import { anoEmSaoPaulo, lerOpcoes } from "@/lib/catalogo-pdf/opcoes";
import { ErroDoCatalogo, resumoDaLoja } from "@/lib/catalogo-pdf/servidor/carregar";
import { FilaCheia, JaGerando, pedirCatalogo } from "@/lib/catalogo-pdf/servidor/fila";
import { gerarCatalogo } from "@/lib/catalogo-pdf/servidor/gerar";

/**
 * Catálogo em PDF da loja.
 *
 * GET devolve o que a tela precisa para montar as escolhas (categorias,
 * quantos produtos, a cara da loja). POST põe um catálogo na fila e volta com
 * o número dele; quem acompanha e entrega o PDF é `/api/catalogo-pdf/[id]`.
 *
 * Quem vê os produtos da loja pode gerar o catálogo dela. A leitura usa a
 * chave de serviço DEPOIS de conferir a permissão, sempre presa à loja da
 * empresa de quem pediu (o mesmo das rotas de leitura do financeiro).
 */

async function quemPede() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return { erro: NextResponse.json({ error: "Não autenticado." }, { status: 401 }) };
  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "catalog.products.read")) {
    return { erro: NextResponse.json({ error: "Sem permissão para gerar o catálogo da loja." }, { status: 403 }) };
  }
  return { erro: null, empresa: ctx.companyId, dono: resolveCompanyPublicProfileId(ctx, user.id) };
}

export async function GET(req: Request) {
  const pedido = await quemPede();
  if (pedido.erro) return pedido.erro;
  try {
    const resumo = await resumoDaLoja(createAdminClient(), pedido.dono, normalizePublicBaseUrl(origemPublicaDoAdmin(req)));
    return NextResponse.json({ loja: resumo }, { headers: { "Cache-Control": "no-store" } });
  } catch (erro) {
    if (erro instanceof ErroDoCatalogo) return NextResponse.json({ error: erro.message, codigo: erro.codigo }, { status: 409 });
    console.error("[catalogo-pdf] resumo", erro);
    return NextResponse.json({ error: "Não foi possível abrir a sua loja agora. Tente de novo em instantes." }, { status: 500 });
  }
}

export async function POST(req: Request) {
  const pedido = await quemPede();
  if (pedido.erro) return pedido.erro;
  const corpo = await req.json().catch(() => null);
  const opcoes = lerOpcoes(corpo, anoEmSaoPaulo());
  const admin = createAdminClient();
  const origemPublica = normalizePublicBaseUrl(origemPublicaDoAdmin(req));
  const { dono } = pedido;
  try {
    const id = await pedirCatalogo(pedido.empresa, (aoProgredir) => gerarCatalogo({ admin, donoId: dono, origemPublica, opcoes, aoProgredir }));
    return NextResponse.json({ id }, { status: 202 });
  } catch (erro) {
    if (erro instanceof JaGerando) {
      return NextResponse.json({ error: "Já tem um catálogo da sua loja sendo gerado. Ele aparece aqui quando ficar pronto.", id: erro.id }, { status: 409 });
    }
    if (erro instanceof FilaCheia) {
      return NextResponse.json({ error: "Muitos catálogos sendo gerados agora. Tente de novo em um minuto." }, { status: 429 });
    }
    console.error("[catalogo-pdf] pedido", erro);
    return NextResponse.json({ error: "Não foi possível começar o catálogo agora. Tente de novo em instantes." }, { status: 500 });
  }
}
