import { z } from "zod";
import { civilities, permissions } from "../../data/user";

//----------------------------------------------------------------------------------------

export const subAdminSchema = z.object({
  civility: z.enum(civilities, {
    required_error: "La civilité et obligatoire",
    invalid_type_error: "La civilité est invalide",
  }),
  firstName: z
    .string({ required_error: "Le prénom est obligatoire" })
    .min(1, "Le prénom est obligatoire")
    .max(250, "250 caractères au maximum"),
  lastName: z
    .string({ required_error: "Le nom est obligatoire" })
    .min(1, "Le nom est obligatoire")
    .max(250, "250 caractères au maximum"),
  email: z
    .string({ required_error: "L'adresse mail est obligatoire" })
    .email({ message: "L'adresse mail est invalide" })
    .max(250, "250 caractères au maximum"),
  phoneNumber: z
    .string({ required_error: "Le numéro de téléphone est obligatoire" })
    .refine((value) => /^0[67]\d{8}$/.test(value), {
      message: "Le numéro de téléphone est invalide (06******** ou 07********)",
    }),
  positionId: z
    .string({ required_error: "La fonction est obligatoire" })
    .min(1, "La fonction est obligatoire")
    .max(250, "250 caractères au maximum"),
  department: z.string().max(250, "250 caractères au maximum"),
  service: z.string().max(250, "250 caractères au maximum"),

  permissions: z.array(z.enum(permissions)),
  password: z
    .string({ required_error: "Le mot de passe est obligatoire" })
    .min(8, { message: "8 caractères au minimum" })
    .refine((value) => /^(?=.*[a-z])/.test(value), {
      message: "Le mot de passe doit contenir au moins une lettre minuscule",
    })
    .refine((value) => /^(?=.*[A-Z])/.test(value), {
      message: "Le mot de passe doit contenir au moins une lettre majuscule",
    })
    .refine((value) => /^(?=.*\d)/.test(value), {
      message: "Le mot de passe doit contenir au moins un chiffre",
    })
    .refine((value) => /^(?=.*[^\da-zA-Z])/.test(value), {
      message: "Le mot de passe doit contenir au moins un caractère spécial",
    }),
});

export type SubAdminSchema = z.infer<typeof subAdminSchema>;

//----------------------------------------------------------------------------------------

export const editSubAdminSchema = z.object({
  civility: z.enum(civilities, {
    required_error: "La civilité et obligatoire",
    invalid_type_error: "La civilité est invalide",
  }),
  firstName: z
    .string({ required_error: "Le prénom est obligatoire" })
    .min(1, "Le prénom est obligatoire")
    .max(250, "250 caractères au maximum"),
  lastName: z
    .string({ required_error: "Le nom est obligatoire" })
    .min(1, "Le nom est obligatoire")
    .max(250, "250 caractères au maximum"),
  email: z
    .string({ required_error: "L'adresse mail est obligatoire" })
    .email({ message: "L'adresse mail est invalide" })
    .max(250, "250 caractères au maximum"),
  phoneNumber: z
    .string({ required_error: "Le numéro de téléphone est obligatoire" })
    .refine((value) => /^0[67]\d{8}$/.test(value), {
      message: "Le numéro de téléphone est invalide (06******** ou 07********)",
    }),
  positionId: z
    .string({ required_error: "La fonction est obligatoire" })
    .min(1, "La fonction est obligatoire")
    .max(250, "250 caractères au maximum"),
  department: z.string().max(250, "250 caractères au maximum"),
  service: z.string().max(250, "250 caractères au maximum"),

  permissions: z.array(z.enum(permissions)),
});

export type EditSubAdminSchema = z.infer<typeof editSubAdminSchema>;

//----------------------------------------------------------------------------------------

export const editSubAdminPasswordSchema = z.object({
  password: z
    .string({ required_error: "Le mot de passe est obligatoire" })
    .min(8, { message: "8 caractères au minimum" })
    .refine((value) => /^(?=.*[a-z])/.test(value), {
      message: "Le mot de passe doit contenir au moins une lettre minuscule",
    })
    .refine((value) => /^(?=.*[A-Z])/.test(value), {
      message: "Le mot de passe doit contenir au moins une lettre majuscule",
    })
    .refine((value) => /^(?=.*\d)/.test(value), {
      message: "Le mot de passe doit contenir au moins un chiffre",
    })
    .refine((value) => /^(?=.*[^\da-zA-Z])/.test(value), {
      message: "Le mot de passe doit contenir au moins un caractère spécial",
    }),
});

export type EditSubAdminPasswordSchema = z.infer<
  typeof editSubAdminPasswordSchema
>;

//----------------------------------------------------------------------------------------

export const subAdminActiveSchema = z.object({
  active: z.boolean(),
});

export type SubAdminActiveSchema = z.infer<typeof subAdminActiveSchema>;

//----------------------------------------------------------------------------------------
