import { NextResponse } from "next/server";
import { canCompany, getCompanyContext } from "@/lib/company-context";
import { createAdminClient, createClient } from "@/lib/supabase-server";

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

/*
  Aprova ou recusa o cadastro que o cliente fez pela loja.

  No modo de cadastro "com aprovação" (Regras da loja), quem se cadastra
  entra pendente: não vê preço nem compra até a equipe dizer sim. Aqui a
  ficha do cliente diz sim ou não. O mesmo padrão de permissão da rota
  portal-access, e a recusa derruba as sessões abertas na hora, como o
  bloqueio faz — recusar é para valer agora, não quando a sessão expirar.
*/
export async function PATCH(request: Request) {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();

  if (!user) {
    return NextResponse.json({ error: "Nao autenticado." }, { status: 401 });
  }

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "clients.list.write")) {
    return NextResponse.json({ error: "Sem permissao." }, { status: 403 });
  }

  const body = (await request.json().catch(() => null)) as { clientId?: unknown; status?: unknown } | null;
  const clientId = typeof body?.clientId === "string" ? body.clientId.trim() : "";
  const status = body?.status === "approved" || body?.status === "rejected" ? body.status : null;

  if (!clientId) {
    return NextResponse.json({ error: "Cliente invalido." }, { status: 400 });
  }
  if (!status) {
    return NextResponse.json({ error: "Informe se o cadastro foi aprovado ou recusado." }, { status: 400 });
  }

  const admin = createAdminClient();
  const tenantIds = ctx.tenantIds?.length ? ctx.tenantIds : [ctx.ownerId ?? user.id];
  const agora = new Date().toISOString();

  const { data: updated, error } = await admin
    .from("clients")
    .update({
      portal_status: status,
      portal_reviewed_at: agora,
      portal_reviewed_by: user.id,
      updated_at: agora,
    })
    .eq("id", clientId)
    .in("user_id", tenantIds)
    .select("id,portal_status,portal_reviewed_at")
    .maybeSingle();

  if (error) return NextResponse.json({ error: error.message }, { status: 400 });
  if (!updated?.id) return NextResponse.json({ error: "Cliente nao encontrado." }, { status: 404 });

  if (status === "rejected") {
    await admin
      .from("client_portal_sessions")
      .update({ revoked_at: agora })
      .eq("client_id", clientId)
      .is("revoked_at", null);
  }

  return NextResponse.json({
    ok: true,
    portal_status: updated.portal_status,
    portal_reviewed_at: updated.portal_reviewed_at,
  });
}
