import { z } from 'zod';

// Login Schema
export const loginSchema = z.object({
  email: z
    .string()
    .min(1, 'L\'email est requis')
    .email('Email invalide'),
  password: z
    .string()
    .min(1, 'Le mot de passe est requis')
    .min(8, 'Le mot de passe doit contenir au moins 8 caractères'),
});

export type LoginFormData = z.infer<typeof loginSchema>;

// Register Schema
export const registerSchema = z.object({
  email: z
    .string()
    .min(1, 'L\'email est requis')
    .email('Email invalide'),
  password: z
    .string()
    .min(1, 'Le mot de passe est requis')
    .min(8, 'Le mot de passe doit contenir au moins 8 caractères')
    .regex(
      /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/,
      'Le mot de passe doit contenir au moins une majuscule, une minuscule et un chiffre'
    ),
  confirmPassword: z
    .string()
    .min(1, 'Veuillez confirmer le mot de passe'),
  firstName: z
    .string()
    .min(1, 'Le prénom est requis')
    .min(2, 'Le prénom doit contenir au moins 2 caractères'),
  lastName: z
    .string()
    .min(1, 'Le nom est requis')
    .min(2, 'Le nom doit contenir au moins 2 caractères'),
  phone: z
    .string()
    .optional()
    .refine((val) => !val || /^(\+33|0)[1-9](\d{2}){4}$/.test(val), {
      message: 'Numéro de téléphone invalide',
    }),
}).refine((data) => data.password === data.confirmPassword, {
  message: 'Les mots de passe ne correspondent pas',
  path: ['confirmPassword'],
});

export type RegisterFormData = z.infer<typeof registerSchema>;

// Ticket Code Schema
export const ticketCodeSchema = z.object({
  ticketCode: z
    .string()
    .min(1, 'Le code du ticket est requis')
    .length(10, 'Le code doit contenir exactement 10 caractères')
    .regex(/^[A-Z0-9]{10}$/, 'Le code doit contenir uniquement des lettres majuscules et des chiffres'),
});

export type TicketCodeFormData = z.infer<typeof ticketCodeSchema>;

// Profile Update Schema
export const profileUpdateSchema = z.object({
  firstName: z
    .string()
    .min(1, 'Le prénom est requis')
    .min(2, 'Le prénom doit contenir au moins 2 caractères'),
  lastName: z
    .string()
    .min(1, 'Le nom est requis')
    .min(2, 'Le nom doit contenir au moins 2 caractères'),
  phone: z
    .string()
    .optional()
    .refine((val) => !val || /^(\+33|0)[1-9](\d{2}){4}$/.test(val), {
      message: 'Numéro de téléphone invalide',
    }),
});

export type ProfileUpdateFormData = z.infer<typeof profileUpdateSchema>;

// Password Change Schema
export const passwordChangeSchema = z.object({
  currentPassword: z
    .string()
    .min(1, 'Le mot de passe actuel est requis'),
  newPassword: z
    .string()
    .min(8, 'Le nouveau mot de passe doit contenir au moins 8 caractères')
    .regex(
      /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/,
      'Le mot de passe doit contenir au moins une majuscule, une minuscule et un chiffre'
    ),
  confirmNewPassword: z
    .string()
    .min(1, 'Veuillez confirmer le nouveau mot de passe'),
}).refine((data) => data.newPassword === data.confirmNewPassword, {
  message: 'Les mots de passe ne correspondent pas',
  path: ['confirmNewPassword'],
});

export type PasswordChangeFormData = z.infer<typeof passwordChangeSchema>;
