/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.indexOf(str.trim()) >= 0
}

/**
 * @param {string} url
 * @returns {Boolean}
 */
export function validURL(url) {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/**
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email) {
  const reg = /^(([^<>()\[\]\\.,;:\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,}))$/
  return reg.test(email)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function isString(str) {
  return typeof str === 'string' || str instanceof String;
}

/**
 * @param {Array} arg
 * @returns {Boolean}
 */
export function isArray(arg) {
  if (typeof Array.isArray === 'undefined') {
    return Object.prototype.toString.call(arg) === '[object Array]'
  }
  return Array.isArray(arg)
}
/**
 * 密码的正则表达式 最少8个字符，最多20个字符，至少一个字母，一个数字和一个特殊字符：
 * @param {string} password
 * @returns {Boolean}
 */
export function validPwd(value) {
  const reg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,26}$/;
  return reg.test(value)
}


// vue身份证检验方法
const numberUtils = {
  checkIdCardNumber: (rule, idcard, callback) => {
    if (idcard === undefined || idcard === '' || idcard === null) {
      return callback(new Error('请输入身份证号码'));
    }
    var area = {
      11: '北京',
      12: '天津',
      13: '河北',
      14: '山西',
      15: '内蒙古',
      21: '辽宁',
      22: '吉林',
      23: '黑龙江',
      31: '上海',
      32: '江苏',
      33: '浙江',
      34: '安徽',
      35: '福建',
      36: '江西',
      37: '山东',
      41: '河南',
      42: '湖北',
      43: '湖南',
      44: '广东',
      45: '广西',
      46: '海南',
      50: '重庆',
      51: '四川',
      52: '贵州',
      53: '云南',
      54: '西藏',
      61: '陕西',
      62: '甘肃',
      63: '青海',
      64: '宁夏',
      65: '新疆',
      71: '台湾',
      81: '香港',
      82: '澳门',
      91: '国外'
    };
    var ereg;
    var idcard_array = idcard.split('');
    // @ts-ignore
    if (area[parseInt(idcard.substr(0, 2))] === null)
      return callback(new Error('身份证地区非法'));
    switch (idcard.length) {
      case 18:
        if (parseInt(idcard.substr(6, 4)) % 4 == 0 || (parseInt(idcard.substr(6, 4)) % 100 == 0 && parseInt(idcard.substr(6, 4)) % 4 == 0)) {
          ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;
          //闰年出生日期的合法性正则表达式
        } else {
          ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;
          //平年出生日期的合法性正则表达式
        }
        if (ereg.test(idcard)) {
          var S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 +
            (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 +
            (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 +
            (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 +
            (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 +
            (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 +
            (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 +
            parseInt(idcard_array[7]) * 1 +
            parseInt(idcard_array[8]) * 6 +
            parseInt(idcard_array[9]) * 3;
          var Y = S % 11;
          var M = 'F';
          var JYM = '10X98765432';
          M = JYM.substr(Y, 1);
          if (M == idcard_array[17])
            return callback();
          else
            return callback(new Error('身份证号码校验错误'));
        } else
          return callback(new Error('身份证号码出生日期超出范围或含有非法字符'));
      default:
        return callback(new Error('身份证号码位数不对'));
    }
  },
  checkPhone: (rule, value, callback) => {
    let reg = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/
    if (!value) {
      return callback(new Error('手机号码不能为空'));
    } else if (!reg.test(value)) {
      return callback(new Error('手机号格式不正确'));
    } else {
      callback()
    }
  }
}
export default numberUtils;

