import type { DealCardDeal } from '@/components/ui/domain/DealCard';
import type { DealType } from '@/lib/deal-types';
import type { SearchSort } from '@/lib/enums/search-sort';
import type { VendorSearchResult } from '@/server/catalog/public/search';

export interface SearchParams {
  q: string;
  locale?: string;
  catSlug?: string;
  tagSlugs?: string[];
  minPrice?: number;
  maxPrice?: number;
  /** Dynamic catalog ceiling — omit maxPrice from query when maxPrice >= priceCeiling. */
  priceCeiling?: number;
  minDiscount?: number;
  /** Deal type filter — send only when exactly one type selected. */
  type?: DealType;
  sort?: SearchSort;
  page?: number;
  pageSize?: number;
}

export interface SearchResponse {
  ok: boolean;
  results: DealCardDeal[];
  vendors: VendorSearchResult[];
  total?: number;
  page?: number;
  pageSize?: number;
  totalPages?: number;
  error?: string;
}

export async function searchDeals(params: SearchParams): Promise<SearchResponse> {
  const url = new URL('/api/deals/search', window.location.origin);
  if (params.q) url.searchParams.set('q', params.q);
  if (params.locale) url.searchParams.set('locale', params.locale);
  if (params.catSlug) url.searchParams.set('cat', params.catSlug);
  if (params.tagSlugs && params.tagSlugs.length > 0)
    url.searchParams.set('tagSlugs', params.tagSlugs.join(','));
  if (params.minPrice != null && params.minPrice > 0)
    url.searchParams.set('minPrice', String(params.minPrice));
  if (
    params.maxPrice != null &&
    params.priceCeiling != null &&
    params.maxPrice < params.priceCeiling
  )
    url.searchParams.set('maxPrice', String(params.maxPrice));
  if (params.minDiscount != null) url.searchParams.set('minDiscount', String(params.minDiscount));
  if (params.type) url.searchParams.set('type', params.type);
  if (params.sort && params.sort !== 'relevance') url.searchParams.set('sort', params.sort);
  if (params.page && params.page > 1) url.searchParams.set('page', String(params.page));
  url.searchParams.set('pageSize', String(params.pageSize ?? 12));

  const resp = await fetch(url.toString(), {
    method: 'GET',
    headers: { Accept: 'application/json' },
  });

  if (!resp.ok) return { ok: false, results: [], vendors: [], error: `HTTP ${resp.status}` };
  const json = (await resp.json()) as SearchResponse;
  return {
    ok: json.ok,
    results: json.results ?? [],
    vendors: json.vendors ?? [],
    total: json.total ?? 0,
    page: json.page,
    pageSize: json.pageSize,
    totalPages: json.totalPages ?? 0,
    error: json.error,
  };
}

// ─── Suggest (autocomplete) ──────────────────────────────────────────────────

export interface DealSuggestion {
  id: string;
  title: string;
  vendorName: string;
  discountedPrice: number;
  discountPercent: number;
  imageSrc: string;
  dealType: DealType;
  slug?: string;
}

export interface EntitySuggestion {
  slug: string;
  name: string;
}

export interface VendorSuggestion {
  id: string;
  displayName: string;
  logoUrl: string;
  city: string;
}

export interface SuggestData {
  deals: DealSuggestion[];
  categories: EntitySuggestion[];
  tags: EntitySuggestion[];
  vendors: VendorSuggestion[];
}

export interface SuggestParams {
  q: string;
  locale?: string;
  limit?: number;
}

export interface SuggestResponse {
  ok: boolean;
  data?: SuggestData;
}

export async function suggestDeals(params: SuggestParams): Promise<SuggestResponse> {
  const url = new URL('/api/deals/suggest', window.location.origin);
  url.searchParams.set('q', params.q);
  if (params.locale) url.searchParams.set('locale', params.locale);
  if (params.limit) url.searchParams.set('limit', String(params.limit));

  const resp = await fetch(url.toString(), {
    method: 'GET',
    headers: { Accept: 'application/json' },
  });

  if (!resp.ok) return { ok: false };

  const json = (await resp.json()) as { ok: false } | ({ ok: true } & SuggestData);
  if (!json.ok) return { ok: false };
  const { ok, ...data } = json;
  return { ok, data: data as SuggestData };
}
