import * as z from "zod";
import { LOAType } from "../types/loa";

export const loaTypeSchema = z.object({
    id: z.number(),
    name: z.string(),
    max_length_days: z.number(),
});

export const loaSchema = z.object({
    member_id: z.number(),
    start_date: z.date(),
    end_date: z.date(),
    type: loaTypeSchema,
    reason: z.string(),
})
    .superRefine((data, ctx) => {
        const { start_date, end_date, type } = data;

        const today = new Date();
        today.setHours(0, 0, 0, 0);

        if (start_date < today) {
            ctx.addIssue({
            code: z.ZodIssueCode.custom,
            path: ["start_date"],
            message: "Start date cannot be in the past.",
            });
        }

        // 1. end > start
        if (end_date <= start_date) {
            ctx.addIssue({
                code: z.ZodIssueCode.custom,
                path: ["end_date"],
                message: "End date must be after start date.",
            });
        }

        // 2. calculate max
        const maxEnd = new Date(start_date);
        maxEnd.setDate(maxEnd.getDate() + type.max_length_days);

        if (end_date > maxEnd) {
            ctx.addIssue({
                code: z.ZodIssueCode.custom,
                path: ["end_date"],
                message: `This LOA type allows a maximum of ${type.max_length_days} days.`,
            });
        }
    });
