import { z } from 'zod';

/**
 * Schema user. `role` tidak di-hardcode ke daftar tertentu — validasi
 * "apakah role ini nyata" dilakukan server (Rule::exists('roles')).
 * Client cukup wajibkan terisi + cocok dengan salah satu role yang
 * tersedia (diterima lewat argumen `roles`), supaya tidak ada lagi
 * "Role wajib dipilih" palsu saat memilih role kustom.
 */
const baseUserSchema = (roles: string[]) => ({
    name: z.string().min(1, 'Nama wajib diisi').max(255, 'Maksimal 255 karakter'),
    email: z.string().min(1, 'Email wajib diisi').email('Format email tidak valid'),
    role: roles.length
        ? z.enum(roles as [string, ...string[]], {
              error: 'Role wajib dipilih',
          })
        : z.string().min(1, 'Role wajib dipilih'),
});

export const createUserSchema = (roles: string[]) =>
    z.object({
        ...baseUserSchema(roles),
        password: z.string().min(8, 'Password minimal 8 karakter'),
    });

export const updateUserSchema = (roles: string[]) =>
    z.object({
        ...baseUserSchema(roles),
        password: z
            .string()
            .min(8, 'Password minimal 8 karakter')
            .or(z.literal(''))
            .optional(),
    });

export type CreateUserFormValues = z.infer<ReturnType<typeof createUserSchema>>;
export type UpdateUserFormValues = z.infer<ReturnType<typeof updateUserSchema>>;
