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

type AdjustmentBody = {
  event_id?: unknown;
  amount?: unknown;
  reason?: unknown;
};

function toNumber(value: unknown) {
  if (typeof value === "number" && Number.isFinite(value)) return value;
  if (typeof value === "string") {
    const normalized = Number(value.replace(",", "."));
    return Number.isFinite(normalized) ? normalized : Number.NaN;
  }
  return Number.NaN;
}

export async function POST(req: Request) {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();

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

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "commissions.adjust")) {
    return NextResponse.json({ error: "Sem permissão para ajustar comissão." }, { status: 403 });
  }

  const body = (await req.json().catch(() => null)) as AdjustmentBody | null;
  const eventId = typeof body?.event_id === "string" ? body.event_id.trim() : "";
  const amount = toNumber(body?.amount);
  const reason = typeof body?.reason === "string" ? body.reason.trim() : "";

  if (!eventId) {
    return NextResponse.json({ error: "Selecione o evento que será ajustado." }, { status: 400 });
  }

  if (!Number.isFinite(amount) || amount === 0) {
    return NextResponse.json({ error: "Informe um valor de ajuste diferente de zero." }, { status: 400 });
  }

  if (!reason) {
    return NextResponse.json({ error: "Informe o motivo do ajuste." }, { status: 400 });
  }

  const { data, error } = await supabase.rpc("adjust_commission_event", {
    p_event_id: eventId,
    p_amount: amount,
    p_reason: reason,
    p_company_id: ctx.companyId,
  });

  if (error) {
    return NextResponse.json({ error: error.message || "Falha ao registrar ajuste de comissão." }, { status: 400 });
  }

  return NextResponse.json({
    ok: true,
    result: data,
    message: "Ajuste de comissão registrado com sucesso.",
  });
}
