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 }, { data: history, error }] = await Promise.all([
    admin.from("suppliers").select("id,name").eq("company_id", auth.ctx.companyId).eq("id", id).maybeSingle(),
    admin
      .from("supplier_activity_log")
      .select("id,entity_type,entity_id,action,description,payload,created_at")
      .eq("company_id", auth.ctx.companyId)
      .eq("supplier_id", id)
      .order("created_at", { ascending: false }),
  ]);

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

  return NextResponse.json({
    ok: true,
    supplier: { id: String(supplier.id), name: String(supplier.name || "") },
    history: (history ?? []).map((item) => ({
      id: String(item.id),
      entityType: String(item.entity_type || ""),
      entityId: item.entity_id ? String(item.entity_id) : null,
      action: String(item.action || ""),
      description: String(item.description || ""),
      payload: item.payload ?? {},
      createdAt: item.created_at,
    })),
  });
}
