import { z } from "zod/v4";

/**
  Esquema del DTO para Criteria.fromPrimitives(...)
  No aplica defaults ni correciones: solo valida.
*/
export const FilterPrimitiveSchema = z.object({
  // Campos mínimos ya normalizados por el conversor
  field: z.string(),
  operator: z.string(),
  value: z.string(),
});

export const CriteriaSchema = z.object({
  q: z.string().optional(),

  filters: z.array(FilterPrimitiveSchema).optional(),

  // Preferimos omitido; si viene, no puede ser cadena vacía
  orderBy: z.string().min(1).optional(),

  order: z.enum(["asc", "desc"]).optional(),

  // Ya son números (normalizados); validaciones lógicas
  pageSize: z.number().int().min(1, { message: "pageSize must be a positive integer" }).optional(),
  pageNumber: z
    .number()
    .int()
    .min(0, { message: "pageNumber must be a non-negative integer" })
    .optional(),
});

export type CriteriaDTO = z.infer<typeof CriteriaSchema>;
