/**
 * 表单验证工具 - Vue 3 兼容
 * 包含：手机号、邮箱、身份证号 验证规则
 */

// 验证手机号（中国大陆）
export const validatePhone = (_rule, value) => {
    console.log('validatePhone', value);
  const phoneRegex = /^1[3-9]\d{9}$/;
  if (!value) {
    return Promise.reject('手机号不能为空');
  }
  if (!phoneRegex.test(value)) {
    return Promise.reject('请输入正确的手机号');
  }
  return Promise.resolve();
};

// 验证邮箱
export const validateEmail = (_rule, value) => {
  const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  if (!value) {
    return Promise.reject('邮箱不能为空');
  }
  if (!emailRegex.test(value)) {
    return Promise.reject('请输入正确的邮箱地址');
  }
  return Promise.resolve();
};

// 验证身份证号码（支持 15 位和 18 位，含校验）
export const validateIdCard = (_rule, value) => {
  const idCardRegex = /(^\d{15}$)|(^\d{18}$)|(^\d{18}X$)/i;

  if (!value) {
    return Promise.reject('身份证号不能为空');
  }

  if (!idCardRegex.test(value)) {
    return Promise.reject('身份证号格式不正确');
  }

  // 更严格的 18 位身份证校验（含最后一位校验码）
  if (value.length === 18) {
    const Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; // 加权因子
    const Vi = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; // 校验码

    let sum = 0;
    for (let i = 0; i < 17; i++) {
      sum += parseInt(value[i], 10) * Wi[i];
    }
    const checkCode = Vi[sum % 11];
    if (checkCode !== value[17].toUpperCase()) {
      return Promise.reject('身份证号校验失败，请输入正确的身份证号');
    }
  }

  // 可选：验证生日部分（仅做基础判断）
  let year, month, day;
  if (value.length === 15) {
    year = '19' + value.substring(6, 8);
    month = value.substring(8, 10);
    day = value.substring(10, 12);
  } else {
    year = value.substring(6, 10);
    month = value.substring(10, 12);
    day = value.substring(12, 14);
  }

  const isValidDate = !isNaN(new Date(year, month - 1, day));
  if (!isValidDate) {
    return Promise.reject('身份证号中的出生日期不合法');
  }

  const currentYear = new Date().getFullYear();
  const birthYear = parseInt(year, 10);
  if (birthYear < 1900 || birthYear > currentYear) {
    return Promise.reject('出生年份不合法');
  }

  return Promise.resolve();
};
