import { cookies } from "next/headers";
import { NextResponse } from "next/server";

import { nomeDoCookieDaCompra } from "@/lib/digitais/compra";
import { conferirChave, lerAcessoParaUsar, origemDoPedido, usarAcesso } from "@/lib/digitais/servidor/acessos";
import { COOKIE_DA_SESSAO } from "@/lib/loja/visao.server";
import { createAdminClient } from "@/lib/supabase-admin";

/*
 * Baixar um arquivo ou abrir um link que o comprador recebeu.
 *
 * Três jeitos de provar que o acesso é seu: a chave da compra (o navegador que
 * comprou), a chave da entrega (o link do e-mail, mandado no corpo) ou a
 * sessão do portal da loja (área de membros). Cada uma só abre o que é dela.
 */
export async function POST(request: Request) {
  const semCache = { headers: { "cache-control": "no-store" } };
  try {
    const corpo = (await request.json().catch(() => null)) as { acessoId?: unknown; chaveDaEntrega?: unknown; slug?: unknown } | null;
    const acessoId = typeof corpo?.acessoId === "string" ? corpo.acessoId : "";
    const admin = createAdminClient();
    const acesso = await lerAcessoParaUsar(admin, acessoId);
    if (!acesso) return NextResponse.json({ error: "Acesso não encontrado." }, { status: 404, ...semCache });

    const jar = await cookies();
    let dono = false;

    /* 1. O navegador que comprou. A compra é achada pelo acesso ou, se ele
       nasceu antes da ligação com o pedido da loja, pelo pedido interno. */
    let compraDoAcesso = acesso.catalog_order_id;
    if (!compraDoAcesso && acesso.order_id) {
      const { data: ligada } = await admin
        .from("catalog_orders")
        .select("id")
        .eq("approved_order_id", acesso.order_id)
        .eq("user_id", acesso.user_id)
        .order("created_at", { ascending: false })
        .limit(1);
      compraDoAcesso = ((ligada ?? []) as Array<{ id: string }>)[0]?.id ?? null;
    }
    if (compraDoAcesso) {
      const chave = jar.get(nomeDoCookieDaCompra(compraDoAcesso))?.value ?? "";
      const conferida = chave ? await conferirChave(admin, chave, "compra") : null;
      dono = Boolean(conferida && conferida.catalogOrderId === compraDoAcesso);
    }

    /* 2. O link do e-mail. */
    if (!dono && typeof corpo?.chaveDaEntrega === "string") {
      const conferida = await conferirChave(admin, corpo.chaveDaEntrega, "entrega");
      dono = Boolean(conferida && conferida.lojaId === acesso.user_id && conferida.orderId && conferida.orderId === acesso.order_id);
    }

    /* 3. A área de membros (sessão do portal da loja). */
    if (!dono && typeof corpo?.slug === "string") {
      const sessao = jar.get(COOKIE_DA_SESSAO)?.value ?? "";
      if (sessao) {
        const { data } = await admin.rpc("client_portal_get_session", { p_slug: corpo.slug, p_session_token: sessao });
        const clienteId = String((data as { client?: { id?: string } } | null)?.client?.id ?? "");
        dono = Boolean(clienteId) && clienteId === acesso.client_id;
      }
    }

    if (!dono) return NextResponse.json({ error: "Este acesso não é deste navegador. Entre pela área de membros da loja." }, { status: 403, ...semCache });

    const uso = await usarAcesso(admin, acesso, origemDoPedido(request));
    /* fechado: o acesso em si fechou (pausado, vencido, sem downloads): a tela marca a linha. */
    if (!uso.ok) return NextResponse.json({ error: uso.motivo, fechado: uso.status === 403 }, { status: uso.status, ...semCache });
    return NextResponse.json({ ok: true, url: uso.url }, semCache);
  } catch (erro) {
    console.error("[digitais] usar", erro);
    return NextResponse.json({ error: "Não foi possível abrir agora. Tente de novo." }, { status: 500, ...semCache });
  }
}
