
/*
  * 手机号校验
*/
export const regphone = /^(?:(?:\+|00)86)?1\d{10}$/
export function phone(rule, value, callback) {
  if (rule.required && !value) {
    return callback(new Error('不能为空'))
  }
  if (value && !regphone.test(value)) {
    callback(new Error('手机号码格式不正确'))
  } else {
    callback()
  }
}

/*
  * 电话号码正则表达式（支持手机号码，3-4位区号，7-8位直播号码，1－4位分机号）
  * 400电话支持
*/

// 电话号码正则表达式（支持手机号码，3-4位区号，7-8位直播号码，1－4位分机号）
// const regFormat = /((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)/
// // 400电话支持
// const reg400 = /^400(-\d{3,4}){2}$/
export function checkLinktel(rule, value, callback) {
  if (rule.required && !value) {
    return callback(new Error('不能为空'))
  }
  // if (!regFormat.test(value) && !reg400.test(value)) {
  //   callback(new Error('联系电话格式不正确'))
  // } else {
  callback()
  // }
}

/*
  * 手机号/联系电话同时校验/可输入中文
  * 例：185******9251或123-456-789
  * 例：123-456-789转123-456-789
*/
export function phoneAndText(rule, value, callback) {
  if (value && rule.required && !value) {
    return callback(new Error('不能为空'))
  }
  // 手机号||电话||400
  if (value.match(/(\+?86-?)?1(3|4|6|5|7|8|9)\d{9}/) || value.match(/((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))/) || value.match(/400(-\d{3,4}){2}/)) {
    // 校验通过
    callback()
  } else {
    // 校验未通过
    callback(new Error('联系电话格式不正确'))
  }
}

/*
  * 邮箱
*/
export function email(rule, value, callback) {
  const mal = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  if (rule.required && !value) {
    return callback(new Error('不能为空'))
  }
  if (value && !mal.test(value)) {
    callback(new Error('邮箱格式不正确'))
  } else {
    callback()
  }
}

/*
  * 银行卡号/银行账户
*/
export function bankCardNumber(rule, value, callback) {
  const mal = /^[0-9]\d{9,29}$/
  if (rule.required && !value) {
    return callback(new Error('不能为空'))
  }
  if (value && !mal.test(value)) {
    callback(new Error('银行账户格式不正确'))
  } else {
    callback()
  }
}

/*
  * 身份证号验证(国内：支持1/2代(15位/18位数字))
*/
// 身份证号, 支持1/2代(15位/18位数字)
export const malRex = /(^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0[1-9]|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/
// // 香港身份证
// const malHKRex = /^[a-zA-Z]\d{6}\([\dA]\)$/
// // 澳门身份证
// const malAomenRex = /^[1|5|7]\d{6}[(\d)]{3}$/
// // 台湾身份证
// const malTaiwanRex = /^[a-zA-Z][0-9]{9}$/
export function makeSureId(rule, value, callback) {
  if (rule.required && !value) {
    return callback(new Error('不能为空'))
  }
  if (value && !malRex.test(value)) {
    callback(new Error('身份证号码格式不正确'))
  } else {
    callback()
  }
}
// 护照（包含香港、澳门）
const passportRex = /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/
// 护照不强制校验
// const passportRex = /^[a-zA-Z0-9]\d{8,10}$/
/*
  * 匹配护照（包含香港、澳门）与国内身份证 支持1/2代(15位/18位数字)
*/
export function passportOrMakeId(rule, value, callback) {
  if (!value) {
    return callback(new Error('不能为空'))
  }
  // 护照正则  身份证正则
  if (!passportRex.test(value) && !malRex.test(value)) {
    callback(new Error('身份证号码或护照号码格式不正确'))
  } else {
    callback()
  }
}

/*
  * 验空限制长度50个字符
*/
export const characters1_50_Regular = /\S{2,50}/
export function characters1_50(rule, value, callback) {
  if (!value) {
    return callback(new Error('不能为空'))
  }
  if (!characters1_50_Regular.test(value)) {
    callback(new Error('请输入2～50位的字符'))
  } else {
    callback()
  }
}

/*
  * 验空
*/
export function characters1_auto(rule, value, callback) {
  if (!value && value !== 0) {
    return callback(new Error('不能为空'))
  } else {
    callback()
  }
}

/*
  * 验证码
*/
export function randCode(rule, value, callback) {
  const mal = /^[a-zA-Z0-9]{4}$/
  if (!value) {
    return callback(new Error('不能为空'))
  }
  if (!mal.test(value)) {
    callback(new Error('请输入由字母+数字组成的4位字符验证码'))
  } else {
    callback()
  }
}

/*
  * 手机验证码校验
*/
export function phoneRandCode(rule, value, callback) {
  const mal = /^[0-9]{4}$/
  if (!value) {
    return callback(new Error('不能为空'))
  }
  if (!mal.test(value)) {
    callback(new Error('请输入4位数字的手机验证码'))
  } else {
    callback()
  }
}

/*
  *匹配中文，英文字母和数字及_:—
*/
export function En_Ch_NumTest(rule, value, callback) {
  const regName = /^[\u4e00-\u9fa5a-zA-Z0-9_-]*$/
  if (value === '') {
    callback(new Error('不能为空'))
  } else if (!regName.test(value)) {
    callback(new Error('请输入为中文，英文字母和数字及"_","-"的字符'))
  } else {
    callback()
  }
}

/*
  * 联系人名称校验（中文姓名，英文姓名）
  const zh = /^(?:[\u4e00-\u9fa5·]{2,20})$/
*/

export function linkerName(rule, value, callback) {
  if (!value) {
    return callback(new Error('不能为空'))
  }
  const zh = /^[\p{Unified_Ideograph}]{2,20}$/u
  const en = /(^[a-zA-Z]{1}[a-zA-Z\s]{0,20}[a-zA-Z]{1}$)/
  if (en.test(value) || zh.test(value)) {
    callback()
  } else {
    callback(new Error('请输入2位以上的中文姓名或英文的姓名'))// 联系人名称为2位以上中文
  }
}

/*
  * 登录名
*/
export function userName(rule, value, callback) {
  const mal = /^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{4,20}$/ // 必须为数字+字母组合的
  // const mal = /^[\u4e00-\u9fa5a-zA-Z0-9_-]{4,20}$/ // 匹配中文，英文字母和数字及_:—
  if (!value) {
    return callback(new Error('不能为空'))
  }
  if (!mal.test(value)) {
    callback(new Error('登录名必须为数字+字母的4~20位字符'))
    // callback(new Error('请输入为中文，英文字母和数字及"_","-"、4~20位的字符'))
  } else {
    callback()
  }
}

/*
  * 密码校验
*/
export function passWord(rule, value, callback) {
  if (!value) {
    callback(new Error('不能为空'))
  } else {
    // var reg = /^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{8,16}$/ // 简单密码
    // var reg = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,16}$/ // 复杂密码1
    var reg = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,.\/])[A-Za-z\d~!@#$%^&*()_+`\-={}:";'<>?,.\/]{8,16}$/ // 复杂密码2
    if (!reg.test(value)) {
      // callback(new Error('密码必须为数字,字母组合的8-16位(如:123456qw)'))// 简单密码
      callback(new Error('密码必须为数字,字母+特殊符号组合的8-16位(如:123456qw...)')) // 复杂密码
    } else {
      callback()
    }
  }
}

/*
  * 验证预算金额
*/
export function validatorMoney(rule, value, callback) {
  if (value > 1000000) {
    callback(new Error('预算金额不能超过100万元'))
  } else {
    callback()
  }
}

/*
  * 邮编
*/
export function checkCode(rule, value, callback) {
  const mal = /^[0-9]{6}$/
  if (value && !mal.test(value)) {
    callback(new Error('请输入正确邮政编码格式'))
  } else {
    callback()
  }
}

/*
  * 正整数（不能为0或负数）
*/
export function checkRate(rule, value, callback) {
  const re = /^[1-9]{1}[0-9]*$/
  if (!re.test(value)) {
    callback(new Error('请输入正整数'))
  } else {
    callback()
  }
}

/*
  * 数字
*/
export function checkNum(rule, value, callback) {
  const re = /^(\-|\+)?\d+(\.\d+)?$/
  if (!String(value)) {
    callback(new Error('不能为空'))
  } else if (!re.test(value)) {
    callback(new Error('请输入数字'))
  } else {
    callback()
  }
}

/*
  * 金额（元）-限制15位数，后面最多跟2位小数
*/
export const moneyRegular = /^(([1-9][0-9]{0,14}[.][0-9]{1,2})|([1-9][0-9]{0,14})|([0][.][0-9]{1}[1-9]{1}))$/
export function checkMoney(rule, value, callback) {
  const reg = moneyRegular
  if (!reg.test(value)) {
    value = value.replace(reg)
    callback(new Error('金额格式不正确，最多保留2位小数'))
  } else {
    callback()
  }
}

/*
  * 金额（万元）-限制15位数，后面最多跟6位小数
*/
export const myriadMoneyRegular = /^[1-9]{1}\d{0,15}(.\d{1,6})?$|^0.\d{1,6}$/
export function checkMyriadMoney(rule, value, callback) {
  const reg = myriadMoneyRegular
  if (!reg.test(value)) {
    value = value.replace(reg)
    callback(new Error('金额格式不正确，最多保留6位小数'))
  } else {
    callback()
  }
}

/*
  * 合法资质编码/统一社会信用代码码
*/
export function creditCode(rule, value, callback) {
  const mal = /^[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/g
  if (!value) {
    return callback(new Error('不能为空'))
  }
  if (!mal.test(value)) {
    callback(new Error('请输入18位统一社会信用代码！数字和大写字母组合!'))
  } else {
    callback()
  }
}

/*
  * 组织机构代码不超过18位
*/
export function organizationCode(rule, value, callback) {
  const organizationCodeReg = /^[A-Za-z0-9]+$/g
  if (value.length > 18) {
    callback(new Error('请输入18位组织机构代码！数字和字母组合!'))
  } else if (!organizationCodeReg.test(value)) {
    callback(new Error('请输入18位组织机构代码！数字和字母组合!'))
  } else {
    callback()
  }
}

/*
  * 纳税号18位
*/
export function taxpayerIdentificationNumber(rule, value, callback) {
  const mal = /^[A-Z0-9]{18}$/
  if (!value) {
    return callback(new Error('不能为空'))
  }
  if (!mal.test(value)) {
    callback(new Error('请输入18位纳税识别号！数字和大写字母组合！'))
  } else {
    callback()
  }
}

/*
  * 编码校验
*/
export function validatorCode(rule, value, callback) {
  const organizationCodeReg = /^[A-Za-z0-9]+$/g
  if (value === '') {
    callback(new Error('请填写编码'))
  } else if (value.length > 50) {
    callback(new Error('编码不能超过50位'))
  } else if (!organizationCodeReg.test(value)) {
    callback(new Error('编码只能包含字母和数字'))
  } else {
    callback()
  }
}

/*
  * 不能输入非法字符
*/
export function validateInput(rule, value, callback) {
  const reg = /[`~@#$%^&*_\+=<>?{}|。\/\\[\]~@#￥%……&*——\+={}|]/g
  if (rule.required && !value) {
    return callback(new Error('不能为空'))
  } else if (value && reg.test(value)) {
    callback(new Error('不能含有非法字符'))
  } else {
    callback()
  }
}

/*
  * 不能输入汉字
*/
export function validateRoleCode(rule, value, callback) {
  const reg = /[\u4E00-\u9FA5]/g
  if (reg.test(value)) {
    callback(new Error('不能输入汉字'))
  } else {
    callback()
  }
}
/*
  * 不能输入括号中英文()（）
*/
export function validateParentheses(rule, value, callback) {
  const reg = /[（）()]/g
  if (reg.test(value)) {
    callback(new Error('不能输入括号'))
  } else {
    callback()
  }
}
/*
  * 三级联动校验
*/
export function cascaderValide(rule, value, callback) {
  if (!value) {
    callback(new Error('请选择省市地区'))
  } else {
    const arr = value.split(',')
    if (arr.length < 3) {
      callback(new Error('请选择省市地区'))
    }
  }
  callback()
}
