import { z } from "zod"

export const passwordValidators = {
  length: {
    matcher: (password: string) =>
      password.length >= 10 && password.length <= 40,
    message: "10 to 40 characters",
  },
  hasUppercase: {
    matcher: (password: string) => /[A-Z]/.test(password),
    message: "1 uppercase letter",
  },
  hasLowercase: {
    matcher: (password: string) => /[a-z]/.test(password),
    message: "1 lowercase letter",
  },
  hasNumber: {
    matcher: (password: string) => /[0-9]/.test(password),
    message: "1 number",
  },
  hasSpecialChar: {
    matcher: (password: string) =>
      /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]+/.test(password),
    message: "1 special character",
  },
}

export const passwordValidator = (msg = "Required field") =>
  z
    .string()
    .min(1, msg)
    .refine(passwordValidators.length.matcher, {
      message: passwordValidators.length.message,
    })
    .refine(passwordValidators.hasUppercase.matcher, {
      message: passwordValidators.hasUppercase.message,
    })
    .refine(passwordValidators.hasLowercase.matcher, {
      message: passwordValidators.hasLowercase.message,
    })
    .refine(passwordValidators.hasNumber.matcher, {
      message: passwordValidators.hasNumber.message,
    })
    .refine(passwordValidators.hasSpecialChar.matcher, {
      message: passwordValidators.hasSpecialChar.message,
    })
