import { z } from 'zod';

// Login s temporary password schema
export const loginSchema = z.object({
  username: z
    .string({
      required_error: 'Username je povinný',
      invalid_type_error: 'Username musí byť text',
    })
    .min(3, 'Username musí mať aspoň 3 znaky')
    .max(50, 'Username môže mať maximálne 50 znakov'),
  password: z
    .string({
      required_error: 'Heslo je povinné',
      invalid_type_error: 'Heslo musí byť text',
    })
    .min(1, 'Heslo nemôže byť prázdne'),
  rememberMe: z.boolean().optional().default(false),
});

// Set new password schema (krok 2)
export const setPasswordSchema = z
  .object({
    newPassword: z
      .string({
        required_error: 'Nové heslo je povinné',
      })
      .min(8, 'Heslo musí mať aspoň 8 znakov')
      .max(100, 'Heslo môže mať maximálne 100 znakov')
      .regex(/[a-z]/, 'Heslo musí obsahovať aspoň jedno malé písmeno')
      .regex(/[A-Z]/, 'Heslo musí obsahovať aspoň jedno veľké písmeno')
      .regex(/[0-9]/, 'Heslo musí obsahovať aspoň jedno číslo')
      .regex(
        /[^a-zA-Z0-9]/,
        'Heslo musí obsahovať aspoň jeden špeciálny znak'
      ),
    confirmPassword: z.string({
      required_error: 'Potvrdenie hesla je povinné',
    }),
  })
  .refine((data) => data.newPassword === data.confirmPassword, {
    message: 'Heslá sa nezhodujú',
    path: ['confirmPassword'],
  });

// Link email schema (krok 3)
export const linkEmailSchema = z.object({
  email: z
    .string({
      required_error: 'Email je povinný',
    })
    .email('Neplatný formát emailu')
    .max(255, 'Email môže mať maximálne 255 znakov'),
  emailPassword: z
    .string({
      required_error: 'Heslo k emailu je povinné',
    })
    .min(1, 'Heslo k emailu nemôže byť prázdne'),
});


// Create user schema (admin only) - temp password sa generuje automaticky
// Ak je poskytnutý email, môže byť poskytnuté aj emailPassword pre automatické nastavenie JMAP
export const createUserSchema = z.object({
  username: z
    .string({
      required_error: 'Username je povinný',
    })
    .min(3, 'Username musí mať aspoň 3 znaky')
    .max(50, 'Username môže mať maximálne 50 znakov')
    .regex(
      /^[a-zA-Z0-9_-]+$/,
      'Username môže obsahovať iba písmená, čísla, pomlčky a podčiarkovníky'
    ),
  email: z.string().email('Neplatný formát emailu').max(255).optional(),
  emailPassword: z.string().min(1).optional(),
  firstName: z.string().max(100).optional(),
  lastName: z.string().max(100).optional(),
  role: z.enum(['admin', 'team_leader', 'member']).optional(),
});

// Update user schema
export const updateUserSchema = z.object({
  firstName: z.string().max(100).optional(),
  lastName: z.string().max(100).optional(),
  email: z.string().email('Neplatný formát emailu').max(255).optional(),
});

// Change role schema (admin only)
export const changeRoleSchema = z.object({
  userId: z.string().uuid('Neplatný formát user ID'),
  role: z.enum(['admin', 'team_leader', 'member'], {
    required_error: 'Rola je povinná',
    invalid_type_error: 'Neplatná rola',
  }),
});
