import type { SearchParams, Market } from "./types"; export type SP = Record; const s = (v: string | string[] | undefined) => (Array.isArray(v) ? v[0] : v) ?? undefined; const n = (v: string | string[] | undefined) => { const x = Number(s(v)); return Number.isFinite(x) && x > 0 ? x : undefined; }; /** URL (fr) → SearchParams. marche=achat|location, ville, region, type=a,b, prix_min, prix_max, chambres, sdb, superficie, annee, tri, page, bbox */ export function fromUrl(sp: SP, perPage = 24): SearchParams & { page: number } { const market: Market = s(sp.marche) === "location" ? "rent" : "sale"; const page = Math.max(1, Math.floor(n(sp.page) ?? 1)); const bboxRaw = s(sp.bbox)?.split(",").map(Number); const bbox = bboxRaw && bboxRaw.length === 4 && bboxRaw.every(Number.isFinite) ? (bboxRaw as [number, number, number, number]) : undefined; const sort = s(sp.tri) as SearchParams["sort"]; return { market, q: s(sp.q), city: s(sp.ville), region: s(sp.region), category: s(sp.type)?.split(",").filter(Boolean), priceMin: n(sp.prix_min), priceMax: n(sp.prix_max), bedroomsMin: n(sp.chambres), bathroomsMin: n(sp.sdb), areaMin: n(sp.superficie), yearMin: n(sp.annee), bbox, sort: sort && ["recent", "price_asc", "price_desc", "deal", "area_desc"].includes(sort) ? sort : "recent", limit: perPage, offset: (page - 1) * perPage, page }; } export function describe(p: SearchParams, total: number): string { const what = p.market === "rent" ? "logements à louer" : "propriétés à vendre"; const where = p.city ? ` à ${p.city}` : p.region ? ` — ${p.region}` : p.q ? ` pour « ${p.q} »` : " au Québec"; return `${total.toLocaleString("fr-CA")} ${what}${where}`; }