import { z } from "zod"; import { MEAL_TYPES, RECIPE_TAGS } from "@app/shared-types"; /** * "Vad ska vi äta?" (spec §18) + "Jag är sugen på" (spec §19). * Alla parametrar är valfria – motorn använder hushållets kontext som standard. */ export const whatToEatQuerySchema = z.object({ mealType: z.enum(MEAL_TYPES).default("dinner"), /** Filtrera kandidater på en recept-tagg (t.ex. "baking" för Baka-fliken) * i stället för måltidstyp. mealType används fortfarande för poängsättning. */ tag: z.enum(RECIPE_TAGS).optional(), persons: z.coerce.number().int().min(1).max(20).optional(), maxMinutes: z.coerce.number().int().min(5).max(600).optional(), maxCostMinorPerPortion: z.coerce.number().int().min(0).max(100_000).optional(), /** Fritext eller röst-transkription: "krämigt", "asiatiskt", "under 500 kcal" … */ craving: z.string().max(300).optional(), /** Titel-/beskrivningssök: filtrerar kandidaterna på namn (t.ex. "pannkaka"). */ search: z.string().max(120).optional(), /** Filtrera på en högtid/säsong (recept-holidayTag-slug, t.ex. "jul"). */ holiday: z.string().max(60).optional(), includeLeftovers: z.coerce.boolean().default(true), limit: z.coerce.number().int().min(1).max(20).default(5), /** Personaliseringsvy: smak, hälsa eller lager. Kräver personalization-samtycke. */ view: z.enum(["default", "taste", "health", "pantry", "swap"]).default("default"), }); export type WhatToEatQuery = z.infer;