import type { FormRules } from 'element-plus';

/**
 * 邮箱验证规则
 * @returns 邮箱校验规则
 */
export const emailRules = (): FormRules => {
  return {
    email: [
      { required: true, message: '请输入邮箱地址', trigger: ['blur', 'change'] },
      { type: 'email', message: '请输入正确的邮箱格式', trigger: ['blur', 'change'] }
    ]
  };
};

/**
 * 手机号验证规则（支持动态传入表单数据，适配国家码校验）
 * @param loginForm 表单数据（包含countryCode和phone）
 * @returns 手机号校验规则
 */
export const phoneRules = (loginForm: { countryCode: string; phone: string }): FormRules => {
  return {
    phone: [
      {
        validator: (rule, value, callback) => {
          // 验证国家码必填
          if (!loginForm.countryCode) {
            return callback(new Error('请选择国家/地区码'));
          }
          // 验证手机号必填
          if (!value) {
            return callback(new Error('请输入手机号码'));
          }
          // 中国大陆手机号格式验证（仅+86时生效）
          if (loginForm.countryCode === '+86' && !/^1[3-9]\d{9}$/.test(value)) {
            return callback(new Error('请输入正确的中国大陆手机号'));
          }
          callback();
        },
        trigger: ['blur', 'change']
      }
    ]
  };
};

/**
 * 密码验证规则（通用，后续可扩展）
 * @returns 密码校验规则
 */
// 传参改为：表单对象（响应式） + 密码字段名（默认password）
export const passwordRules = (form: any, passwordField = 'password'): FormRules => {
  return {
    password: [
      { required: true, message: '请输入密码', trigger: ['blur', 'change'] },
      { min: 6, message: '密码长度不能少于6位', trigger: ['blur', 'change'] }
    ],
    confirmPassword: [{
      required: true,
      message: '请确认密码',
      trigger: 'blur'
    }, {
      validator: (rule, value, callback) => {
        if (!value) {
          callback(new Error('请确认密码'));
          return;
        }
        // 实时读取表单对象的最新密码值（核心：form是响应式引用）
        if (value !== form[passwordField]) {
          callback(new Error('两次输入的密码不一致'));
        } else {
          callback();
        }
      },
      trigger: ['blur', 'change']
    }]
  };
};

export const codeRules = (length: number = 6): FormRules => {
  return {
    code: [
      // 1. 必填校验
      {
        required: true,
        message: '请输入验证码',
        trigger: ['change', 'blur']
      },
      // 2. 长度校验（匹配组件的length属性）
      {
        min: length,
        max: length,
        message: `验证码必须输入${length}位`,
        trigger: ['change', 'blur']
      },
      // 3. 仅数字校验
      {
        pattern: /^\d+$/,
        message: '验证码只能输入数字',
        trigger: ['change', 'blur']
      }
    ]
  };
};