import { z } from "zod";

const appModuleSchema = z.enum([
  "dashboard",
  "alertes",
  "etat_civil",
  "contrats",
  "absences",
  "visites_medicales",
  "sanctions",
  "fiches_paie",
  "impressions",
  "autres",
  "parametres",
]);

export const authUserUpdateSchema = z
  .object({
    role: z.enum(["admin", "rh", "responsable", "lecture"]).optional(),
    is_active: z.boolean().optional(),
  })
  .refine(
    (value) => value.role !== undefined || value.is_active !== undefined,
    {
      message: "At least one field must be provided",
    },
  );

export type AuthUserUpdateInput = z.infer<typeof authUserUpdateSchema>;

export const authUserPermissionsUpdateSchema = z.object({
  allSectors: z.boolean(),
  sectorIds: z.array(z.coerce.number().int().positive()).max(200),
  allEstablishments: z.boolean(),
  establishmentIds: z.array(z.coerce.number().int().positive()).max(200),
  allCategories: z.boolean(),
  categories: z.array(z.string().trim().min(1).max(150)).max(200),
  allContractTypes: z.boolean(),
  contractTypeIds: z.array(z.coerce.number().int().positive()).max(200),
  permissions: z
    .array(
      z.object({
        module: appModuleSchema,
        canRead: z.boolean(),
        canWrite: z.boolean(),
      }),
    )
    .length(11)
    .superRefine((items, context) => {
      const modules = new Set(items.map((item) => item.module));

      if (modules.size !== items.length) {
        context.addIssue({
          code: z.ZodIssueCode.custom,
          message: "Chaque module doit apparaître une seule fois",
        });
      }

      for (const item of items) {
        if (item.canWrite && !item.canRead) {
          context.addIssue({
            code: z.ZodIssueCode.custom,
            message: `Le droit d'écriture implique la lecture pour ${item.module}`,
          });
        }
      }
    }),
});

export type AuthUserPermissionsUpdateInput = z.infer<
  typeof authUserPermissionsUpdateSchema
>;
