import { z } from "zod";

/***
 * Cantidad
 * – admite decimales hasta 2 cifras
 * – el campo `amount` puede ser null
 */
export const makeAmountSchema = ({ maxScale = 2, nullable = false } = {}) => {
  const amount = z.number().refine((v) => Number.isFinite(v), "Amount must be a finite number");

  return z.object({
    amount: nullable ? amount.nullable() : amount,
    scale: z.number().int().nonnegative().max(maxScale, `Scale cannot exceed ${maxScale}`),
  });
};

/**
 * Porcentaje ≥ 0 ≤ 100
 * – admite decimales hasta 2 cifras
 * – el campo `amount` puede ser null
 */
export const makePercentageSchema = ({ maxScale = 2, min = 0, max = 100, nullable = true } = {}) =>
  makeAmountSchema({ maxScale, nullable }).extend({
    amount: z
      .number()
      .min(min, `El porcentaje debe ser ≥ ${min}`)
      .max(max, `El porcentaje no puede superar ${max}`)
      .nullable(),
  });
