import { z } from 'zod';
import { DEAL_TYPES } from '@/lib/deal-types';
import type { DealType } from '@/lib/deal-types';

const SLUG = z
  .string()
  .regex(/^[a-z0-9-]+$/)
  .max(80);
const SLUG_CSV = z.string().regex(/^[a-z0-9-]+(,[a-z0-9-]+)*$/);

export const DealsBrowseParamsSchema = z.object({
  type: z.enum(['', ...DEAL_TYPES]).default(''),
  cat: SLUG.optional(),
  tagSlugs: SLUG_CSV.optional(),
  priceMin: z.coerce.number().int().min(0).max(100000).optional(),
  priceMax: z.coerce.number().int().min(0).max(100000).optional(),
  sort: z.enum(['hot', 'newest', 'biggest-discount', 'ending-soon']).default('hot'),
  page: z.coerce.number().int().min(1).max(500).default(1),
  preset: z.enum(['whats-left']).optional(),
  locale: z.enum(['he', 'en']).optional(),
});

export type DealsBrowseParams = z.infer<typeof DealsBrowseParamsSchema>;

export interface ParsedDealsBrowseParams {
  type: '' | DealType;
  catSlug?: string;
  tagSlugs?: string[];
  priceMin?: number;
  priceMax?: number;
  sort: 'hot' | 'newest' | 'biggest-discount' | 'ending-soon';
  page: number;
  preset?: 'whats-left';
  locale: 'he' | 'en';
}

export function parseDealsBrowseParams(input: unknown): ParsedDealsBrowseParams {
  const parsed = DealsBrowseParamsSchema.safeParse(input);
  const data = parsed.success ? parsed.data : DealsBrowseParamsSchema.parse({});
  const out: ParsedDealsBrowseParams = {
    type: data.type,
    sort: data.sort,
    page: data.page,
    locale: data.locale ?? 'he',
  };
  if (data.cat) out.catSlug = data.cat;
  if (data.tagSlugs) out.tagSlugs = data.tagSlugs.split(',');
  if (data.priceMin !== undefined) out.priceMin = data.priceMin;
  if (data.priceMax !== undefined) out.priceMax = data.priceMax;
  if (data.preset) out.preset = data.preset;
  return out;
}
