import { z } from "zod";

function securePassword(password: string, ctx: z.RefinementCtx): void {
    const lowercase = password.toLowerCase();
    const uppercase = password.toUpperCase();

    if(lowercase === password)
    {
        ctx.addIssue({
            code: z.ZodIssueCode.custom,
            message: "Votre mot de passe doit contenir au moins une majuscule",
        });
    }
    if(uppercase === password)
    {
        ctx.addIssue({
            code: z.ZodIssueCode.custom,
            message: "Votre mot de passe doit contenir au moins une minuscule",
        });
    }
    if(!/[0-9]/.test(password))
    {
        ctx.addIssue({
            code: z.ZodIssueCode.custom,
            message: "Votre mot de passe doit contenir au moins un chiffre",
        });
    }
    if(!" !\"#$%&'()*+,-./:;<=>?@[]^_`{|}~".split("").some(e => password.includes(e)))
    {
        ctx.addIssue({
            code: z.ZodIssueCode.custom,
            message: "Votre mot de passe doit contenir au moins un caractère spécial",
        });
    }
}

export const schema = z.object({
    username: z.string({ required_error: "Nom d'utilisateur obligatoire" }).min(3, "Votre nom d'utilisateur doit contenir au moins 3 caractères").max(32, "Votre nom d'utilisateur doit contenir au plus 32 caractères").superRefine((user, ctx) => {
        const test = z.string().email().safeParse(user);
        if(test.success)
        {
            ctx.addIssue({
                code: z.ZodIssueCode.invalid_string,
                validation: 'email',
                message: "Votre nom d'utilisateur ne peut pas être une addresse mail",
            });
        }
    }),
    email: z.string({ required_error: "Email obligatoire" }).email("Adresse mail invalide"),
    password: z.string({ required_error: "Mot de passe obligatoire" }).min(8, "Votre mot de passe doit contenir au moins 8 caractères").max(128, "Votre mot de passe doit contenir au moins 8 caractères").superRefine(securePassword),
    data: z.object({

    }).partial().nullish(),
});

export type Registration = z.infer<typeof schema>; 