import { z } from "zod"
import { SHOP_USER_ROLES } from "../enums.js"
import { SHOP_USER_PERMISSION_KEYS } from "../permissions.js"

const ShopUserPermissionKeySchema = z.enum(SHOP_USER_PERMISSION_KEYS)

export const ShopUserPermissionOverridesSchema = z.object({
    grants: z.array(ShopUserPermissionKeySchema).default([]),
    denies: z.array(ShopUserPermissionKeySchema).default([]),
}).superRefine((value, ctx) => {
    const overlaps = value.grants.filter((permission) => value.denies.includes(permission))
    if (overlaps.length > 0) {
        ctx.addIssue({
            code: "custom",
            message: `Une permission ne peut pas être à la fois autorisée et interdite: ${overlaps.join(", ")}`,
        })
    }
})

export const CreateShopUserSchema = z.object({
    email: z.email(),
    displayName: z.string().min(2).max(50),
    password: z.string().min(6),
    role: z.enum(SHOP_USER_ROLES),
    permissionOverrides: ShopUserPermissionOverridesSchema.optional(),
})

export const UpdateShopUserSchema = z.object({
    displayName: z.string().min(2).max(50).optional(),
    role: z.enum(SHOP_USER_ROLES).optional(),
    active: z.boolean().optional(),
    permissionOverrides: ShopUserPermissionOverridesSchema.optional(),
}).refine((v) => Object.keys(v).length > 0, {
    message: "At least one field is required"
})

export type CreateShopUserInput = z.infer<typeof CreateShopUserSchema>
export type UpdateShopUserInput = z.infer<typeof UpdateShopUserSchema>
