import { defaultSamDateRange, searchSamByNaicsList } from "@/lib/sam-gov/client";
import { getNaicsForIndustry, parseStateCode } from "@/lib/sam-gov/naics-map";
import { mergeSamOpportunities, samRecordToOpportunity } from "@/lib/sam-gov/transform";
import type { OnboardingInput, Opportunity } from "@/lib/types";

export interface FetchSamOpportunitiesParams {
  apiKey: string;
  input: OnboardingInput;
  existingOpportunities?: Opportunity[];
  daysBack?: number;
  limit?: number;
}

export interface FetchSamOpportunitiesResult {
  imported: number;
  total: number;
  naicsCodes: string[];
  state: string | null;
  postedFrom: string;
  postedTo: string;
  opportunities: Opportunity[];
  newOpportunities: Opportunity[];
}

export async function fetchSamOpportunitiesForBusiness(
  params: FetchSamOpportunitiesParams,
): Promise<FetchSamOpportunitiesResult> {
  const naicsCodes = getNaicsForIndustry(params.input.industryCategory ?? params.input.industry);
  const state = parseStateCode(params.input.location);
  const { postedFrom, postedTo } = defaultSamDateRange(params.daysBack ?? 90);

  const { records, naicsUsed } = await searchSamByNaicsList(params.apiKey, naicsCodes, {
    postedFrom,
    postedTo,
    state,
    perCodeLimit: Math.min(params.limit ?? 15, 25),
  });

  const opportunities = (records ?? []).map((record) =>
    samRecordToOpportunity(
      record,
      params.input,
      record.naicsCode ?? naicsCodes[0],
      state,
    ),
  );

  opportunities.sort((a, b) => b.urgencyScore - a.urgencyScore);

  const merged = params.existingOpportunities
    ? mergeSamOpportunities(params.existingOpportunities, opportunities)
    : opportunities;

  return {
    imported: opportunities.length,
    total: merged.length,
    naicsCodes: naicsUsed,
    state: state ?? null,
    postedFrom,
    postedTo,
    opportunities: merged,
    newOpportunities: opportunities,
  };
}

/** Lightweight SAM.gov API key validation */
export async function testSamGovApiKey(apiKey: string): Promise<{ ok: true } | { ok: false; error: string }> {
  const { postedFrom, postedTo } = defaultSamDateRange(7);
  const url = new URL("https://api.sam.gov/opportunities/v2/search");
  url.searchParams.set("api_key", apiKey);
  url.searchParams.set("ncode", "561730");
  url.searchParams.set("postedFrom", postedFrom);
  url.searchParams.set("postedTo", postedTo);
  url.searchParams.set("limit", "1");
  url.searchParams.set("offset", "0");
  url.searchParams.append("ptype", "o");

  try {
    const response = await fetch(url.toString(), {
      headers: { Accept: "application/json" },
      cache: "no-store",
    });
    const data = (await response.json()) as { errorCode?: string; errorMessage?: string };

    if (!response.ok || data.errorCode) {
      return {
        ok: false,
        error: data.errorMessage ?? `SAM.gov rejected the API key (${response.status}).`,
      };
    }
    return { ok: true };
  } catch {
    return { ok: false, error: "Could not reach SAM.gov — check your network and try again." };
  }
}
