import { NextResponse } from "next/server";

import { codigoDigitado } from "@/lib/digitais/certificado";
import { textoDaCargaHoraria } from "@/lib/digitais/curso";
import { enderecoDoCertificado, lerCertificado } from "@/lib/digitais/servidor/certificados";
import { clienteDaSessao } from "@/lib/digitais/servidor/curso";
import { pdfDoCertificado } from "@/lib/digitais/servidor/pdf-do-certificado";
import { lerAjustesDigitais } from "@/lib/digitais/servidor/vitrine";
import { createAdminClient } from "@/lib/supabase-admin";

/*
 * O PDF do certificado. Baixa só o dono, entrado na área de membros desta
 * loja; a página pública mostra o mesmo certificado para qualquer pessoa.
 */

/* A logo da loja no topo do PDF: PNG ou JPG pequeno, por https, sem travar se falhar. */
async function lerLogo(endereco: string | null): Promise<{ bytes: Uint8Array; tipo: "png" | "jpg" } | null> {
  if (!endereco || !/^https:\/\//i.test(endereco)) return null;
  try {
    const resposta = await fetch(endereco, { signal: AbortSignal.timeout(4000) });
    if (!resposta.ok) return null;
    const bytes = new Uint8Array(await resposta.arrayBuffer());
    if (bytes.byteLength > 2 * 1024 * 1024) return null;
    if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) return { bytes, tipo: "png" };
    if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) return { bytes, tipo: "jpg" };
    return null;
  } catch {
    return null;
  }
}

function texto(mensagem: string, status: number) {
  return new NextResponse(mensagem, { status, headers: { "content-type": "text/plain; charset=utf-8", "cache-control": "no-store" } });
}

export async function GET(request: Request, { params }: { params: Promise<{ codigo: string }> }) {
  try {
    const { codigo: bruto } = await params;
    const slug = String(new URL(request.url).searchParams.get("slug") || "").trim().toLowerCase();
    const codigo = codigoDigitado(decodeURIComponent(bruto));
    if (!slug || !codigo) return texto("Certificado inválido.", 400);

    const admin = createAdminClient();
    const { data: perfil } = await admin
      .from("profiles")
      .select("id,catalog_name,store_name,primary_color,catalog_logo_url,logo_url")
      .eq("slug", slug)
      .maybeSingle();
    const loja = perfil as {
      id: string;
      catalog_name: string | null;
      store_name: string | null;
      primary_color: string | null;
      catalog_logo_url: string | null;
      logo_url: string | null;
    } | null;
    if (!loja) return texto("Loja não encontrada.", 404);

    const [certificado, clienteId, ajustes] = await Promise.all([
      lerCertificado(admin, loja.id, codigo),
      clienteDaSessao(admin, slug),
      lerAjustesDigitais(admin, loja.id),
    ]);
    if (!certificado || certificado.revogadoEm) return texto("Certificado não encontrado.", 404);
    if (!clienteId || clienteId !== certificado.clienteId) return texto("Entre na área de membros com o seu e-mail para baixar o certificado.", 403);

    const nomeDaLoja = String(loja.catalog_name || loja.store_name || "Loja");
    const [endereco, logo] = await Promise.all([
      enderecoDoCertificado(admin, { lojaId: loja.id, slug, codigo: certificado.codigo }),
      lerLogo(loja.catalog_logo_url || loja.logo_url),
    ]);
    const bytes = await pdfDoCertificado({
      loja: nomeDaLoja,
      cor: ajustes.area.cor || String(loja.primary_color || "#4F46E5"),
      aluno: certificado.aluno,
      curso: certificado.curso,
      cargaHoraria: textoDaCargaHoraria(certificado.cargaHorariaMin),
      emitidoEm: certificado.emitidoEm,
      codigo: certificado.codigo,
      endereco,
      assinatura: certificado.assinatura,
      logo,
    });
    const nomeDoArquivo = `certificado-${certificado.codigo}.pdf`;
    return new NextResponse(Buffer.from(bytes), {
      headers: {
        "content-type": "application/pdf",
        "content-disposition": `attachment; filename="${nomeDoArquivo}"`,
        "cache-control": "private, no-store",
        "x-content-type-options": "nosniff",
      },
    });
  } catch (erro) {
    console.error("[digitais] pdf do certificado", erro);
    return texto("Não foi possível gerar o PDF agora. Tente de novo.", 500);
  }
}
