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

type PeriodActionBody = {
  action?: unknown;
  start_date?: unknown;
  end_date?: unknown;
  period_label?: unknown;
  period_id?: unknown;
  due_date?: unknown;
  reason?: unknown;
};

function asText(value: unknown) {
  return typeof value === "string" ? value.trim() : "";
}

export async function GET() {
  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.read")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const { data: periods, error } = await supabase
    .from("commission_periods")
    .select("id,period_label,start_date,end_date,status,closed_at,approved_at,created_at,updated_at")
    .eq("company_id", ctx.companyId)
    .order("start_date", { ascending: false });

  if (error) {
    return NextResponse.json({ error: "Falha ao listar períodos de comissão." }, { status: 500 });
  }

  return NextResponse.json({ periods: periods ?? [] });
}

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);
  const body = (await req.json().catch(() => null)) as PeriodActionBody | null;
  const action = asText(body?.action);
  const startDate = asText(body?.start_date);
  const endDate = asText(body?.end_date);
  const periodLabel = asText(body?.period_label);
  const periodId = asText(body?.period_id);
  const dueDate = asText(body?.due_date);
  const reason = asText(body?.reason);

  if (action === "close") {
    if (!canCompany(ctx, user.id, "commissions.close")) {
      return NextResponse.json({ error: "Sem permissão para fechar período." }, { status: 403 });
    }
    const { data, error } = await supabase.rpc("close_commission_period", {
      p_start_date: startDate,
      p_end_date: endDate,
      p_period_label: periodLabel || null,
      p_company_id: ctx.companyId,
    });
    if (error) {
      return NextResponse.json({ error: error.message || "Falha ao fechar período." }, { status: 400 });
    }
    return NextResponse.json({ ok: true, result: data });
  }

  if (action === "approve") {
    if (!canCompany(ctx, user.id, "commissions.approve")) {
      return NextResponse.json({ error: "Sem permissão para aprovar período." }, { status: 403 });
    }
    const { data, error } = await supabase.rpc("approve_commission_period", {
      p_period_id: periodId,
      p_company_id: ctx.companyId,
    });
    if (error) {
      return NextResponse.json({ error: error.message || "Falha ao aprovar período." }, { status: 400 });
    }
    return NextResponse.json({ ok: true, result: data });
  }

  if (action === "generate_payouts") {
    if (!canCompany(ctx, user.id, "commissions.pay")) {
      return NextResponse.json({ error: "Sem permissão para gerar payouts." }, { status: 403 });
    }
    const { data, error } = await supabase.rpc("generate_commission_payouts_for_period", {
      p_period_id: periodId,
      p_due_date: dueDate || null,
      p_company_id: ctx.companyId,
    });
    if (error) {
      return NextResponse.json({ error: error.message || "Falha ao gerar payouts." }, { status: 400 });
    }
    return NextResponse.json({ ok: true, result: data });
  }

  if (action === "reopen") {
    if (!canCompany(ctx, user.id, "commissions.approve")) {
      return NextResponse.json({ error: "Sem permissão para reabrir período." }, { status: 403 });
    }
    const { data, error } = await supabase.rpc("reopen_commission_period", {
      p_period_id: periodId,
      p_reason: reason,
      p_company_id: ctx.companyId,
    });
    if (error) {
      return NextResponse.json({ error: error.message || "Falha ao reabrir período." }, { status: 400 });
    }
    return NextResponse.json({ ok: true, result: data });
  }

  return NextResponse.json({ error: "Ação inválida." }, { status: 400 });
}
