import { z } from "zod";
import { formatDate } from "@/lib/utils";
import { v4 as uuidv4 } from "uuid";
import { priorityType, taskStatus } from "@/server/task/domain/models";
import moment from "moment";
const baseTaskSchema = z.object({
projectId: z
.string({ message: "Proyecto inválido" })
.uuid({ message: "Selecciona un proyecto" }),
floorName: z
.string({ message: "Piso inválido" })
.min(1, { message: "Selecciona un piso" }),
areaName: z
.string({ message: "Área inválida" })
.min(1, { message: "Selecciona un área" }),
projectName: z
.string({ message: "Proyecto inválido" })
.min(1, { message: "Selecciona un proyecto" }),
userId: z
.string({ message: "Selecciona un usuario " })
.min(1, { message: "Usuario invalido" }),
areaId: z
.string({ message: "Area no valida" })
.uuid({ message: "Selecciona un area" }),
priority: z.enum(priorityType, { message: "Selecciona una prioridad" }),
startDate: z.string(),
expireDate: z.string().optional(),
comments: z.string(),
});
const withCustomRefinements = (schema: z.ZodType<any>) =>
schema
.refine(
(data) => {
if (data.comments && data.comments.length > 0) {
return data.comments.length >= 5 && data.comments.length <= 120;
}
return true; // Si está vacío o no está presente, no aplicar validación
},
{
message:
"El mensaje debe contener entre 5 y 120 caracteres si está presente",
path: ["comments"],
}
)
.refine(
(data) => {
if (data.expireDate) {
return formatDate(data.expireDate) >= formatDate(data.startDate!);
}
return true;
},
{
message:
"La fecha de expiración debe ser igual o posterior a la fecha de inicio",
path: ["expireDate"],
}
)
export const createTaskSchema = withCustomRefinements(
baseTaskSchema.extend({
id: z
.string()
.uuid()
.default(() => uuidv4()),
})
);
export const updateTaskSchema = withCustomRefinements(
baseTaskSchema
.extend({
id: z.string().uuid({ message: "Tarea inválida" }),
areaId: z.string().uuid(),
status: z.enum(taskStatus).optional(),
})
.partial()
);