import type { Product } from '@/components/store/config/defaultStoreConfig';

export type StoreSearchMatchType = 'exact' | 'partial' | 'fuzzy' | 'alternative' | 'none';

export type StoreSearchResponse = {
	query: string;
	normalizedQuery: string;
	suggestedQuery: string | null;
	matchType: StoreSearchMatchType;
	results: Product[];
	alternatives: Product[];
	total: number;
	unavailableProductName: string | null;
};

export function emptyStoreSearch(query = ''): StoreSearchResponse {
	return {
		query,
		normalizedQuery: '',
		suggestedQuery: null,
		matchType: 'none',
		results: [],
		alternatives: [],
		total: 0,
		unavailableProductName: null
	};
}

export function searchResponseProducts(response: StoreSearchResponse | null): Product[] {
	if (!response) return [];

	return response.results.length > 0 ? response.results : response.alternatives;
}

export async function fetchStoreSearch(
	query: string,
	limit: number,
	signal?: AbortSignal
): Promise<StoreSearchResponse> {
	const res = await fetch(`/api/store/search?q=${encodeURIComponent(query)}&limit=${limit}`, { signal });

	if (!res.ok) throw new Error(`La búsqueda respondió ${res.status}`);

	const data = (await res.json()) as Partial<StoreSearchResponse>;
	return {
		...emptyStoreSearch(query),
		...data,
		query: data.query ?? query,
		results: Array.isArray(data.results) ? data.results : [],
		alternatives: Array.isArray(data.alternatives) ? data.alternatives : [],
		total: Number(data.total ?? 0)
	};
}
