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

export async function POST(
  _req: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  // 1. Autenticar usuário
  const supabase = await createClient();
  const {
    data: { user },
    error: userError,
  } = await supabase.auth.getUser();

  if (userError || !user) {
    return NextResponse.json({ error: "Não autenticado." }, { status: 401 });
  }

  // 2. Validar permissão e obter company_id
  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "financial.payables.settle")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  /* A leitura e a escrita usam o cliente admin, como as demais rotas deste
     modulo. As policies de accounts_payable filtram por
     `auth.jwt() ->> 'company_id'`, um claim que o token nao carrega — pelo
     cliente do usuario a consulta nao devolve linha nenhuma e o cancelar
     respondia "conta nao encontrada" para contas que existem.
     A protecao continua: o canCompany acima ja barrou quem nao tem
     financial.write, e todo filtro abaixo mantem o company_id do contexto. */
  const admin = createAdminClient();

  // 3. Validar parâmetro de rota
  const resolvedParams = await params;
  const accountId = typeof resolvedParams?.id === "string" ? resolvedParams.id : "";
  if (!accountId) {
    return NextResponse.json({ error: "Id inválido." }, { status: 400 });
  }

  // 4. Buscar conta a pagar e validar status PENDING
  const { data: account, error: accountError } = await admin
    .from("accounts_payable")
    .select("id,company_id,status")
    .eq("id", accountId)
    .eq("company_id", ctx.companyId)
    .maybeSingle();

  if (accountError) {
    return NextResponse.json({ error: "Falha ao buscar conta a pagar." }, { status: 500 });
  }

  if (!account) {
    return NextResponse.json({ error: "Conta a pagar não encontrada." }, { status: 404 });
  }

  if (account.status !== "PENDING") {
    return NextResponse.json({ error: "Conta a pagar não está pendente." }, { status: 400 });
  }

  // 5. Atualizar conta para CANCELED
  const { data: updated, error: updateError } = await admin
    .from("accounts_payable")
    .update({ status: "CANCELED", payment_date: null })
    .eq("id", accountId)
    .eq("company_id", ctx.companyId)
    .eq("status", "PENDING")
    .select(
      "id,description,amount,due_date,payment_date,status,bank_account_id,category_id,is_recurring"
    )
    .maybeSingle();

  if (updateError) {
    return NextResponse.json({ error: "Falha ao cancelar conta a pagar." }, { status: 500 });
  }

  if (!updated) {
    return NextResponse.json({ error: "Conta a pagar não está pendente." }, { status: 400 });
  }

  // 6. Retornar conta cancelada
  return NextResponse.json({ ok: true, account: updated });
}
