/**
 * 身份证号码验证接口
 */
interface IDCardValidationResult {
    isValid: boolean
    message?: string
  }
  
  /**
   * 验证身份证号码
   * @param id 身份证号码
   * @returns boolean
   */
  export const isValidIDCard = (id: string): boolean => {
    if (!id) return false
    
    // 15 位身份证验证
    if (id.length === 15) {
      return isValidIDCard15(id)
    }
    
    // 18 位身份证验证
    if (id.length === 18) {
      return isValidIDCard18(id)
    }
    
    return false
  }
  
  /**
   * 验证银行卡号
   * @param cardNumber 银行卡号
   * @returns boolean
   */
  export const isValidBankCard = (cardNumber: string): boolean => {
    // 银行卡号只检查长度和是否为数字
    return /^\d{16,19}$/.test(cardNumber)
  }
  
  /**
   * 验证15位身份证号码
   * @param id 15位身份证号码
   * @returns boolean
   */
  function isValidIDCard15(id: string): boolean {
    // 只检查是否为 15 位纯数字
    const regex = /^\d{15}$/
    if (!regex.test(id)) return false
  
    // 校验出生日期
    const year = parseInt(id.substr(6, 2))
    const month = parseInt(id.substr(8, 2))
    const day = parseInt(id.substr(10, 2))
  
    // 使用当前年份来做年份范围的检查
    const currentYear = new Date().getFullYear()
    const fullYear = year + (year >= 50 ? 1900 : 2000)
  
    // 日期校验
    const birthDate = new Date(fullYear, month - 1, day)
    return (
      birthDate.getFullYear() === fullYear &&
      birthDate.getMonth() === month - 1 &&
      birthDate.getDate() === day
    )
  }
  
  /**
   * 验证18位身份证号码
   * @param id 18位身份证号码
   * @returns boolean
   */
  function isValidIDCard18(id: string): boolean {
    // 只检查是否为 18 位的数字或X结尾
    const regex = /^\d{17}(\d|X)$/
    if (!regex.test(id)) return false
  
    // 校验出生日期
    const year = parseInt(id.substr(6, 4))
    const month = parseInt(id.substr(10, 2))
    const day = parseInt(id.substr(12, 2))
    const birthDate = new Date(year, month - 1, day)
  
    return (
      birthDate.getFullYear() === year &&
      birthDate.getMonth() === month - 1 &&
      birthDate.getDate() === day
    )
  }
  
  /**
   * 掩码处理身份证号码
   * @param idNumber 身份证号码
   * @returns string 掩码后的身份证号码
   */
  export const maskIdNumber = (idNumber: string): string => {
    if (!idNumber) return idNumber
  
    // 处理18位身份证
    if (idNumber.length === 18) {
      return idNumber.replace(/^(\d{6})(\d{8})(\d{4})$/, '$1********$3')
    }
  
    // 处理15位身份证
    if (idNumber.length === 15) {
      return idNumber.replace(/^(\d{6})(\d{6})(\d{3})$/, '$1******$3')
    }
  
    return idNumber
  }
  
  /**
   * 数字转中文大写
   * @param num 需要转换的数字
   * @returns string 转换后的中文大写
   */
  export const convertToChineseUppercase = (num: number): string => {
    const units = ['个', '十', '百', '千', '万', '十万', '百万', '千万', '亿']
    const digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
  
    if (num === 0) return digits[0]
  
    let result = ''
    let unitIndex = 0
    let zeroFlag = false
  
    while (num > 0) {
      const digit = num % 10
      if (digit > 0) {
        result = digits[digit] + (units[unitIndex] || '') + result
        zeroFlag = false
      } else if (!zeroFlag) {
        result = digits[0] + result
        zeroFlag = true
      }
      num = Math.floor(num / 10)
      unitIndex++
    }
  
    return result
      .replace(/零+/g, '零')
      .replace(/零$/, '')
      .replace(/个$/, '')
  }
  
  /**
   * 验证身份证号码并返回详细信息
   * @param id 身份证号码
   * @returns IDCardValidationResult
   */
  export const validateIDCard = (id: string): IDCardValidationResult => {
    if (!id) {
      return {
        isValid: false,
        message: '身份证号码不能为空'
      }
    }
  
    if (id.length !== 15 && id.length !== 18) {
      return {
        isValid: false,
        message: '身份证号码长度不正确'
      }
    }
  
    const isValid = isValidIDCard(id)
    return {
      isValid,
      message: isValid ? undefined : '身份证号码格式不正确'
    }
  }
  
  /**
   * 验证银行卡号并返回详细信息
   * @param cardNumber 银行卡号
   * @returns { isValid: boolean, message?: string }
   */
  export const validateBankCard = (cardNumber: string): { isValid: boolean; message?: string } => {
    if (!cardNumber) {
      return {
        isValid: false,
        message: '银行卡号不能为空'
      }
    }
  
    const isValid = isValidBankCard(cardNumber)
    return {
      isValid,
      message: isValid ? undefined : '银行卡号格式不正确'
    }
  }