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

type Params = { params: Promise<{ id: string }> };

async function getAuth() {
  const supabase = await createClient();
  const {
    data: { user },
    error,
  } = await supabase.auth.getUser();

  if (error || !user) return { ok: false as const, status: 401, ctx: null };
  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "suppliers.read")) return { ok: false as const, status: 403, ctx: null };
  return { ok: true as const, status: 200, ctx };
}

export async function GET(_: Request, { params }: Params) {
  const auth = await getAuth();
  if (!auth.ok || !auth.ctx) {
    return NextResponse.json({ error: auth.status === 401 ? "Não autenticado." : "Sem permissão." }, { status: auth.status });
  }

  const { id } = await params;
  const admin = createAdminClient();

  const [{ data: supplier, error: supplierError }, { data: category }, { data: payables, error: payablesError }] = await Promise.all([
    admin
      .from("suppliers")
      .select("id,name,cnpj,city,email,phone,payment_terms_primary,payment_terms_secondary,status,notes,created_at,updated_at,category_id")
      .eq("company_id", auth.ctx.companyId)
      .eq("id", id)
      .is("deleted_at", null)
      .maybeSingle(),
    admin.from("supplier_categories").select("id,name").eq("company_id", auth.ctx.companyId),
    admin
      .from("accounts_payable")
      .select("amount,status")
      .eq("company_id", auth.ctx.companyId)
      .eq("supplier_id", id),
  ]);

  if (supplierError || payablesError) {
    return NextResponse.json({ error: "Falha ao carregar fornecedor." }, { status: 500 });
  }
  if (!supplier?.id) return NextResponse.json({ error: "Fornecedor não encontrado." }, { status: 404 });

  const categoryMap = new Map((category ?? []).map((item) => [String(item.id), String(item.name || "")]));
  const openItems = (payables ?? []).filter((item) => {
    const status = String(item.status || "").toUpperCase();
    return status === "PENDING" || status === "OVERDUE";
  });

  return NextResponse.json({
    ok: true,
    supplier: {
      id: String(supplier.id),
      name: String(supplier.name || ""),
      cnpj: String(supplier.cnpj || ""),
      categoryId: supplier.category_id ? String(supplier.category_id) : null,
      category: supplier.category_id ? categoryMap.get(String(supplier.category_id)) || "Sem categoria" : "Sem categoria",
      city: String(supplier.city || ""),
      email: String(supplier.email || ""),
      phone: String(supplier.phone || ""),
      paymentTermsPrimary: String(supplier.payment_terms_primary || "30 dias"),
      paymentTermsSecondary: String(supplier.payment_terms_secondary || "Boleto"),
      openBillsTotal: openItems.reduce((sum, item) => sum + Number(item.amount || 0), 0),
      openBillsCount: openItems.length,
      status: String(supplier.status || "ativo"),
      notes: typeof supplier.notes === "string" ? supplier.notes : null,
      createdAt: typeof supplier.created_at === "string" ? supplier.created_at : null,
      updatedAt: typeof supplier.updated_at === "string" ? supplier.updated_at : null,
    },
  });
}
