/**
 * 密码强度逐项校验工具
 * @description 提供分步密码校验,精确指出每一项不符合的要求
 */

/**
 * 密码校验规则配置
 */
export const PASSWORD_RULES = {
  minLength: 8,
  maxLength: 32,
  requireLowercase: true,
  requireUppercase: true,
  requireNumber: true,
  requireSpecialChar: true,
  allowChinese: false
}

/**
 * 允许的特殊字符列表(用于显示给用户)
 * 实际上所有非字母数字字符都可以,这里列出常用的
 */
export const ALLOWED_SPECIAL_CHARS = '!@#$%^&*()_+-=[]{}|;:\'",.<>?/\\`~'

/**
 * 校验结果接口
 * @typedef {Object} ValidationResult
 * @property {boolean} valid - 是否通过校验
 * @property {Array<string>} errors - 错误信息数组(i18n key)
 * @property {Object} details - 每项规则的详细校验结果
 */

/**
 * 密码逐项校验函数
 * @param {string} password - 待校验的密码
 * @returns {ValidationResult} 校验结果对象
 */
export function validatePassword(password) {
  const result = {
    valid: true,
    errors: [],
    details: {
      length: false,
      hasLowercase: false,
      hasUppercase: false,
      hasNumber: false,
      hasSpecialChar: false,
      noChinese: false
    }
  }

  // 1. 检查长度
  if (password.length < PASSWORD_RULES.minLength) {
    result.errors.push('passwordError.tooShort')
    result.valid = false
  } else if (password.length > PASSWORD_RULES.maxLength) {
    result.errors.push('passwordError.tooLong')
    result.valid = false
  } else {
    result.details.length = true
  }

  // 2. 检查是否包含中文
  const chineseRegex = /[\u4e00-\u9fa5]/
  if (chineseRegex.test(password)) {
    result.errors.push('passwordError.containsChinese')
    result.valid = false
  } else {
    result.details.noChinese = true
  }

  // 3. 检查小写字母
  const lowercaseRegex = /[a-z]/
  if (!lowercaseRegex.test(password)) {
    result.errors.push('passwordError.noLowercase')
    result.valid = false
  } else {
    result.details.hasLowercase = true
  }

  // 4. 检查大写字母
  const uppercaseRegex = /[A-Z]/
  if (!uppercaseRegex.test(password)) {
    result.errors.push('passwordError.noUppercase')
    result.valid = false
  } else {
    result.details.hasUppercase = true
  }

  // 5. 检查数字
  const numberRegex = /[0-9]/
  if (!numberRegex.test(password)) {
    result.errors.push('passwordError.noNumber')
    result.valid = false
  } else {
    result.details.hasNumber = true
  }

  // 6. 检查特殊字符
  const specialCharRegex = /[\W_]/
  if (!specialCharRegex.test(password)) {
    result.errors.push('passwordError.noSpecialChar')
    result.valid = false
  } else {
    result.details.hasSpecialChar = true
  }

  return result
}

/**
 * 实时校验密码强度(适用于input输入时)
 * @param {string} password - 当前输入的密码
 * @returns {Object} 强度分析结果
 */
export function checkPasswordStrength(password) {
  const validation = validatePassword(password)

  // 计算强度分数(0-100)
  const maxScore = 6
  const passedRules = Object.values(validation.details).filter(v => v).length
  const score = Math.round((passedRules / maxScore) * 100)

  // 强度等级
  let level = 'weak'
  if (score >= 85) level = 'strong'
  else if (score >= 50) level = 'medium'

  return {
    score,
    level,
    validation
  }
}

/**
 * 获取友好的错误提示(用于Message组件)
 * @param {Array<string>} errorKeys - 错误的i18n key数组
 * @param {Function} t - vue-i18n的$t函数
 * @returns {string} 格式化的错误提示文本
 */
export function formatPasswordErrors(errorKeys, t) {
  if (!errorKeys || errorKeys.length === 0) {
    return ''
  }

  // 翻译所有错误信息
  const errorMessages = errorKeys.map(key => t(key))

  // 格式化为列表形式
  if (errorMessages.length === 1) {
    return errorMessages[0]
  }

  return errorMessages.map((msg, index) => `${index + 1}. ${msg}`).join('\n')
}
