export interface FederalPeerAward {
  piid: string;
  recipientName: string;
  awardAmount: number;
  state: string | null;
  agency: string;
}

export async function fetchPeerAwardsByNaics(
  naicsCode: string,
  stateCode?: string,
  limit = 6,
): Promise<FederalPeerAward[]> {
  const filters: Record<string, unknown> = {
    time_period: [{ start_date: "2022-01-01", end_date: "2026-12-31" }],
    award_type_codes: ["A", "B", "C", "D"],
    naics_codes: [naicsCode],
    award_amounts: [{ lower_bound: 25000, upper_bound: 750000 }],
  };

  if (stateCode) {
    filters.place_of_performance_locations = [{ country: "USA", state: stateCode }];
  }

  const response = await fetch("https://api.usaspending.gov/api/v2/search/spending_by_award/", {
    method: "POST",
    headers: { "Content-Type": "application/json", Accept: "application/json" },
    body: JSON.stringify({
      filters,
      fields: ["Award ID", "Recipient Name", "Award Amount", "Awarding Agency", "Place of Performance State Code"],
      limit: Math.min(limit * 2, 20),
      page: 1,
      sort: "Award Amount",
      order: "desc",
    }),
    next: { revalidate: 86400 },
  });

  if (!response.ok) return [];

  const data = (await response.json()) as {
    results?: Array<Record<string, string | number | null>>;
  };

  const seen = new Set<string>();
  const peers: FederalPeerAward[] = [];

  for (const row of data.results ?? []) {
    const name = String(row["Recipient Name"] ?? "");
    if (!name || seen.has(name)) continue;
    seen.add(name);
    peers.push({
      piid: String(row["Award ID"] ?? ""),
      recipientName: name,
      awardAmount: Number(row["Award Amount"] ?? 0),
      state: row["Place of Performance State Code"] ? String(row["Place of Performance State Code"]) : null,
      agency: String(row["Awarding Agency"] ?? "Federal agency"),
    });
    if (peers.length >= limit) break;
  }

  return peers;
}
