/**
 * Schémas de validation avec Zod pour l'authentification
 */
import { z } from 'zod';

// Schéma pour l'inscription
export const registerSchema = z.object({
  body: z.object({
    email: z
      .string({
        required_error: 'L\'email est requis',
      })
      .email('Format d\'email invalide'),
    password: z
      .string({
        required_error: '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({
      required_error: 'La confirmation du mot de passe est requise',
    }),
    firstName: z
      .string({
        required_error: 'Le prénom est requis',
      })
      .min(2, 'Le prénom doit contenir au moins 2 caractères')
      .max(100, 'Le prénom ne peut pas dépasser 100 caractères'),
    lastName: z
      .string({
        required_error: 'Le nom est requis',
      })
      .min(2, 'Le nom doit contenir au moins 2 caractères')
      .max(100, 'Le nom ne peut pas dépasser 100 caractères'),
    phone: z
      .string()
      .optional()
      .refine(
        (val) => !val || /^(\+33|0)[1-9](\d{2}){4}$/.test(val.replace(/\s/g, '')),
        'Format de téléphone invalide'
      ),
    address: z.string().optional(),
    city: z.string().optional(),
    postalCode: z
      .string()
      .optional()
      .refine(
        (val) => !val || /^\d{5}$/.test(val),
        'Le code postal doit contenir 5 chiffres'
      ),
  }).refine((data) => data.password === data.confirmPassword, {
    message: 'Les mots de passe ne correspondent pas',
    path: ['confirmPassword'],
  }),
});

// Schéma pour la connexion
export const loginSchema = z.object({
  body: z.object({
    email: z
      .string({
        required_error: 'L\'email est requis',
      })
      .email('Format d\'email invalide'),
    password: z.string({
      required_error: 'Le mot de passe est requis',
    }),
  }),
});

// Schéma pour la demande de réinitialisation de mot de passe
export const forgotPasswordSchema = z.object({
  body: z.object({
    email: z
      .string({
        required_error: 'L\'email est requis',
      })
      .email('Format d\'email invalide'),
  }),
});

// Schéma pour la réinitialisation de mot de passe
export const resetPasswordSchema = z.object({
  body: z.object({
    token: z.string({
      required_error: 'Le token est requis',
    }),
    password: z
      .string({
        required_error: '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({
      required_error: 'La confirmation du mot de passe est requise',
    }),
  }).refine((data) => data.password === data.confirmPassword, {
    message: 'Les mots de passe ne correspondent pas',
    path: ['confirmPassword'],
  }),
});

// Schéma pour le changement de mot de passe
export const changePasswordSchema = z.object({
  body: z.object({
    currentPassword: z.string({
      required_error: 'Le mot de passe actuel est requis',
    }),
    newPassword: z
      .string({
        required_error: 'Le nouveau 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({
      required_error: 'La confirmation du mot de passe est requise',
    }),
  }).refine((data) => data.newPassword === data.confirmPassword, {
    message: 'Les mots de passe ne correspondent pas',
    path: ['confirmPassword'],
  }),
});

export default {
  registerSchema,
  loginSchema,
  forgotPasswordSchema,
  resetPasswordSchema,
  changePasswordSchema,
};
