import { isApiError } from "@/lib/errors" import type { SearchResponse, SearchSort } from "@/lib/search/types" import { httpJson } from "./http" export interface SearchCatalogParams { q?: string selectedGames?: string[] min?: string max?: string onlyOnline?: boolean minRating?: string sort?: SearchSort limit?: number offset?: number signal?: AbortSignal } export async function searchCatalog(params: SearchCatalogParams): Promise { const searchParams = new URLSearchParams() if (params.q) searchParams.set("q", params.q) for (const game of params.selectedGames ?? []) { searchParams.append("selectedGames", game) } if (params.min) searchParams.set("min", params.min) if (params.max) searchParams.set("max", params.max) if (params.onlyOnline !== undefined) searchParams.set("onlyOnline", String(params.onlyOnline)) if (params.minRating && params.minRating !== "0") searchParams.set("minRating", params.minRating) if (params.sort && params.sort !== "composite") searchParams.set("sort", params.sort) if (params.limit !== undefined) searchParams.set("limit", String(params.limit)) if (params.offset !== undefined) searchParams.set("offset", String(params.offset)) try { return await httpJson(`/api/v1/search?${searchParams.toString()}`, { cache: "no-store", signal: params.signal, }) } catch (error) { if (error instanceof Error && error.message === "UNAUTHORIZED") { throw error } if (isApiError(error)) { throw new Error(`Search API request failed: ${error.code} ${error.msg}`) } throw error } }