import { cookies } from "next/headers";
import { NextResponse } from "next/server";
import { createAdminClient } from "@/lib/supabase-admin";
import { cobrarPedidoDaLoja, normalizeText, type PaymentSubmitBody } from "@/lib/cobranca-da-loja.server";

type SessionPayload = {
  client?: {
    id: string;
  } | null;
};

export async function POST(request: Request) {
  try {
    const cookieStore = await cookies();
    const token = cookieStore.get("ks_client_portal")?.value || "";
    if (!token) {
      return NextResponse.json({ error: "Faça login para continuar." }, { status: 401 });
    }

    const body = (await request.json().catch(() => null)) as PaymentSubmitBody | null;

    const slug = normalizeText(body?.slug);
    const orderId = normalizeText(body?.orderId);
    if (!slug || !orderId) {
      return NextResponse.json({ error: "Pedido invalido." }, { status: 400 });
    }

    const admin = createAdminClient();
    const sessionResult = await admin.rpc("client_portal_get_session", {
      p_slug: slug,
      p_session_token: token,
    });
    const sessionPayload = (sessionResult.data || null) as SessionPayload | null;
    if (sessionResult.error || !sessionPayload?.client?.id) {
      return NextResponse.json({ error: "Sessao invalida. Faca login novamente." }, { status: 401 });
    }

    const { data: order, error: orderError } = await admin
      .from("catalog_orders")
      .select("id,user_id,client_id,number,total,currency,status,customer_name,cart_payload,payment_status")
      .eq("id", orderId)
      .maybeSingle();

    /* So paga quem fez o pedido. A sessao vale para uma loja e um cliente; o
       pedido tem de ser desse mesmo cliente, senao qualquer login de qualquer
       loja gerava cobranca para o pedido de outra pessoa, bastando o numero.
       A resposta e a mesma de pedido inexistente, para nao confirmar que ele
       existe. */
    if (orderError || !order?.id || String(order.client_id || "") !== String(sessionPayload.client.id)) {
      return NextResponse.json({ error: "Pedido nao encontrado." }, { status: 404 });
    }

    if (order.status === "canceled") {
      return NextResponse.json({ error: "Este pedido foi cancelado." }, { status: 400 });
    }

    /*
      Aqui o visitante anonimo ganha nome.

      Ate este instante aquele navegador era so uma chave aleatoria olhando a
      vitrine. Quem paga esta logado, entao e a unica hora em que da para
      amarrar as duas pontas — e e o que faz a rota da visita aparecer depois na
      ficha do cliente, em vez de morrer como um numero solto.
    */
    const chaveDoVisitante = normalizeText(cookieStore.get("ktl_visitante")?.value);
    if (chaveDoVisitante) {
      await admin
        .from("store_visitor_pings")
        .update({ client_id: sessionPayload.client.id })
        .eq("user_id", order.user_id)
        .eq("visitor_key", chaveDoVisitante);
    }

    /* A cobranca em si (qual provedor, Pix, cartao ou boleto) mora em
       lib/cobranca-da-loja.server.ts, que a compra dos produtos digitais
       tambem usa. */
    return await cobrarPedidoDaLoja({
      request,
      admin,
      body,
      slug,
      order,
      clienteId: String(sessionPayload.client.id),
    });
  } catch (error) {
    const message = error instanceof Error ? error.message : "Nao foi possivel processar o pagamento.";
    return NextResponse.json({ error: message }, { status: 500 });
  }
}
