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

export async function GET(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 canRead = canCompany(ctx, user.id, "commissions.read");
  const canReadSelf = canCompany(ctx, user.id, "commissions.self");
  if (!canRead && !canReadSelf) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const { searchParams } = new URL(req.url);
  const requestedSellerId = searchParams.get("seller_user_id")?.trim() || "";
  const requestedStatus = searchParams.get("status")?.trim() || "";
  const selfOnly = searchParams.get("self_only") === "1";

  let query = supabase
    .from("commission_events")
    .select(
      "id,company_id,seller_user_id,order_id,payment_id,source_type,source_date,event_type,status,plan_version_id,rule_id,allocation_percent,gross_basis_amount,net_basis_amount,commission_percent,commission_amount,currency,reference_hash,reversed_event_id,notes,created_at"
    )
    .eq("company_id", ctx.companyId)
    .order("created_at", { ascending: false })
    .limit(200);

  if (selfOnly || (!canRead && canReadSelf)) {
    query = query.eq("seller_user_id", user.id);
  } else if (requestedSellerId) {
    query = query.eq("seller_user_id", requestedSellerId);
  }

  if (requestedStatus) {
    query = query.eq("status", requestedStatus);
  }

  const { data: events, error: eventsError } = await query;
  if (eventsError) {
    return NextResponse.json({ error: "Falha ao listar eventos de comissão." }, { status: 500 });
  }

  const sellerIds = Array.from(new Set((events ?? []).map((event) => event.seller_user_id).filter(Boolean)));
  const orderIds = Array.from(new Set((events ?? []).map((event) => event.order_id).filter(Boolean)));

  const [{ data: companyUsers }, { data: orders }] = await Promise.all([
    sellerIds.length
      ? supabase
          .from("company_users")
          .select("user_id,email,role")
          .eq("company_id", ctx.companyId)
          .in("user_id", sellerIds)
      : Promise.resolve({ data: [], error: null }),
    orderIds.length
      ? supabase
          .from("orders")
          .select("id,number")
          .in("id", orderIds)
      : Promise.resolve({ data: [], error: null }),
  ]);

  const sellerMap = new Map(
    ((companyUsers ?? []) as Array<{ user_id: string; email: string; role: string }>).map((seller) => [seller.user_id, seller])
  );
  const orderMap = new Map(((orders ?? []) as Array<{ id: string; number: number | null }>).map((order) => [order.id, order]));

  return NextResponse.json({
    events: (events ?? []).map((event) => ({
      ...event,
      seller_email: sellerMap.get(event.seller_user_id)?.email || null,
      seller_role: sellerMap.get(event.seller_user_id)?.role || null,
      order_number: event.order_id ? orderMap.get(event.order_id)?.number ?? null : null,
    })),
  });
}
