import type { Business } from "@/lib/types";

interface FetchLiveBidsResponse {
  ok: boolean;
  error?: string;
  needsConnection?: boolean;
  imported?: number;
  opportunities?: Business["opportunities"];
  naicsCodes?: string[];
  state?: string | null;
}

/** Pull live SAM.gov solicitations and merge into opportunity list */
export async function fetchLiveFederalBids(
  business: Business,
  options?: { apiKey?: string; daysBack?: number; limit?: number },
): Promise<FetchLiveBidsResponse> {
  const response = await fetch("/api/sam/opportunities", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      input: business.input,
      existingOpportunities: business.opportunities,
      samGov: business.integrations?.samGov,
      apiKey: options?.apiKey,
      daysBack: options?.daysBack ?? 90,
      limit: options?.limit ?? 20,
    }),
  });

  const data = (await response.json()) as FetchLiveBidsResponse & {
    opportunities?: Business["opportunities"];
  };

  if (!response.ok || !data.ok || !data.opportunities) {
    return {
      ok: false,
      error: data.error ?? "Could not fetch live federal bids.",
      needsConnection: data.needsConnection,
    };
  }

  return data;
}

export function applyLiveBidsToBusiness(
  business: Business,
  opportunities: Business["opportunities"],
  fetchMeta?: { imported?: number; naicsCodes?: string[] },
): Business {
  const revenuePotential = opportunities.reduce((s, o) => s + o.estimatedValue, 0);
  const federalCount = opportunities.filter((o) => o.type === "government_contract").length;

  return {
    ...business,
    opportunities,
    metrics: {
      ...business.metrics,
      opportunitiesFound: opportunities.length,
      revenuePotential,
      topPriorityToday:
        federalCount > 0
          ? opportunities
              .filter((o) => o.type === "government_contract")
              .sort((a, b) => b.urgencyScore - a.urgencyScore)[0]?.title ?? business.metrics.topPriorityToday
          : business.metrics.topPriorityToday,
    },
    integrations: business.integrations?.samGov
      ? {
          ...business.integrations,
          samGov: {
            ...business.integrations.samGov,
            lastFetchedAt: new Date().toISOString(),
            lastFetchCount: fetchMeta?.imported ?? federalCount,
            lastError: undefined,
          },
        }
      : business.integrations,
    updatedAt: new Date().toISOString(),
  };
}
