import { z } from 'zod';

/**
 * Auth Validators
 */
export const registerSchema = z
  .object({
    email: z.string().email('Email inválido'),
    username: z
      .string()
      .min(3, 'El nombre de usuario debe tener al menos 3 caracteres')
      .max(20, 'El nombre de usuario debe tener menos de 20 caracteres')
      .regex(/^[a-zA-Z][a-zA-Z0-9_]{2,19}$/, 'Debe empezar con letra. Solo letras, números y guiones bajos'),
    password: z
      .string()
      .min(8, 'La contraseña debe tener al menos 8 caracteres')
      .regex(
        /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{8,}$/,
        'La contraseña debe contener mayúsculas, minúsculas, números y al menos un carácter especial'
      ),
    confirmPassword: z.string(),
  })
  .refine((data) => data.password === data.confirmPassword, {
    message: 'Las contraseñas no coinciden',
    path: ['confirmPassword'],
  });

export const loginSchema = z.object({
  email: z.string().email('Email inválido'),
  password: z.string().min(1, 'La contraseña es requerida'),
});

export const forgotPasswordSchema = z.object({
  email: z.string().email('Email inválido'),
});

export const resetPasswordSchema = z
  .object({
    token: z.string().min(1, 'El token es requerido'),
    newPassword: z
      .string()
      .min(8, 'La contraseña debe tener al menos 8 caracteres')
      .regex(
        /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{8,}$/,
        'La contraseña debe contener mayúsculas, minúsculas, números y al menos un carácter especial'
      ),
    confirmPassword: z.string(),
  })
  .refine((data) => data.newPassword === data.confirmPassword, {
    message: 'Las contraseñas no coinciden',
    path: ['confirmPassword'],
  });

/**
 * Exercise Validators
 */
export const submitAttemptSchema = z.object({
  userAnswer: z.string().min(1, 'La respuesta es requerida'),
  timeSpentSeconds: z.number().min(0).optional(),
});

/**
 * Module Validators
 */
export const moduleUpdateSchema = z.object({
  name: z.string().min(1, 'El nombre es requerido').optional(),
  description: z.string().min(1, 'La descripción es requerida').optional(),
  introduction: z.string().optional(),
  examples: z.array(z.any()).optional(),
  exercises: z.array(z.any()).optional(),
  answers: z.array(z.any()).optional(),
});

/**
 * User Profile Validators
 */
export const updateProfileSchema = z.object({
  username: z
    .string()
    .min(3, 'El nombre de usuario debe tener al menos 3 caracteres')
    .max(20, 'El nombre de usuario debe tener menos de 20 caracteres')
    .regex(/^[a-zA-Z][a-zA-Z0-9_]{2,19}$/, 'Debe empezar con letra. Solo letras, números y guiones bajos')
    .optional(),
  email: z.string().email('Email inválido').optional(),
});

/**
 * Type Exports
 */
export type RegisterFormData = z.infer<typeof registerSchema>;
export type LoginFormData = z.infer<typeof loginSchema>;
export type ForgotPasswordFormData = z.infer<typeof forgotPasswordSchema>;
export type ResetPasswordFormData = z.infer<typeof resetPasswordSchema>;
export type SubmitAttemptFormData = z.infer<typeof submitAttemptSchema>;
export type ModuleUpdateFormData = z.infer<typeof moduleUpdateSchema>;
export type UpdateProfileFormData = z.infer<typeof updateProfileSchema>;
