/**
 * 用户名
 * @param username
 */
export function isUsername(username) {
  return /^[A-Za-z_\-\u4e00-\u9fa5]{1}[A-Za-z0-9_\-.\u4e00-\u9fa5]{4,19}$/.test(username);
}

/**
 * 手机号码
 * @param mobile
 */
export function isMobile(mobile) {
  return /^(1)\d{10}$/.test(mobile);
}

/**
 * 邮箱
 * @param email
 */
export function isEmail(email) {
  return /^\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}$/.test(email);
}

/**
 * URL地址
 * @param str
 */
export function isURL(str) {
  return /^http[s]?:\/\/.*/.test(str);
}

/**
 * 校验身份证
 * @param idCard
 */
export function isIdCard(idCard) {
  let checkID = function (val) {
    if (checkCode(val)) {
      var date = val.substring(6, 14);
      if (checkDate(date)) {
        if (checkProv(val.substring(0, 2))) {
          return true;
        }
      }
    }
    return false;
  };
  // 省级地址码校验
  let checkProv = function (val) {
    let pattern = /^[1-9][0-9]/;
    let provs = {
      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: '澳门'
    };
    if (pattern.test(val)) {
      if (provs[val]) {
        return true;
      }
    }
    return false;
  };
  // 出生日期码校验
  let checkDate = function (val) {
    let pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
    if (pattern.test(val)) {
      let year = val.substring(0, 4);
      let month = val.substring(4, 6);
      let date = val.substring(6, 8);
      let date2 = new Date(year + '-' + month + '-' + date);
      if (date2 && date2.getMonth() === parseInt(month) - 1) {
        return true;
      }
    }
    return false;
  };
  // 校验码校验
  let checkCode = function (val) {
    let p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
    let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    let parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
    let code = val.substring(17);
    if (p.test(val)) {
      let sum = 0;
      for (let i = 0; i < 17; i++) {
        sum += val[i] * factor[i];
      }
      if (parity[sum % 11] + '' === code.toUpperCase()) {
        return true;
      }
    }
    return false;
  };
  return checkID(idCard);
}

/**
 * 验证pad还是pc
 */
export function isPc() {
  let userAgentInfo = navigator.userAgent;
  let agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod'];
  let flag = true;
  for (var v = 0; v < agents.length; v++) {
    if (userAgentInfo.indexOf(agents[v]) > 0) {
      flag = false;
      break;
    }
  }
  return flag;
}

/**
 * 判断是否为空
 * @param val
 */
export function validateNull(val) {
  if (typeof val === 'boolean') {
    return false;
  }
  if (typeof val === 'number') {
    return false;
  }
  if (isArray(val)) {
    if (val.length === 0) {
      return true;
    }
  } else if (val instanceof Object) {
    if (JSON.stringify(val) === '{}') {
      return true;
    }
  } else {
    if (val === 'null' || val === null || val === 'undefined' || val === undefined || val === '') {
      return true;
    }
    return false;
  }
  return false;
}

/**
 * 判断是否是对象
 * @param o
 */
export function isObject(o) {
  return Object.prototype.toString.call(o).slice(8, -1) === 'Object';
}

/**
 * 判断是否是数组
 * @param o
 */
export function isArray(o) {
  return Object.prototype.toString.call(o).slice(8, -1) === 'Array';
}

/**
 * 检查是否是数字（包含小数），支持整数、带小数点的数字以及以点开头的小数（如 .5），不允许带 + 或 - 号
 * @param val
 */
export function isNumber(val) {
  if (val === null || val === undefined || val === '') return false;
  // 若已为数字类型且为有限数值，则必须为非负数（不允许负数）
  if (typeof val === 'number' && isFinite(val)) return val >= 0;
  // 字符串形式的数字：仅允许不带符号的整数或小数（例如 123, 123.45, .5），不允许 + 或 -
  return /^(?:\d+(?:\.\d+)?|\.\d+)$/.test(String(val).trim());
}

/**
 * 检查是否是整数（支持 number 类型和字符串形式的整数）
 * 例如：123, -42, +7, "0" 都返回 true；"3.0", 3.5, ".5", "abc" 返回 false
 * @param val
 */
export function isInteger(val) {
  // 不允许带有 + 或 - 符号（对字符串和 number 都不允许负数或带符号）
  if (val === null || val === undefined || val === '') return false;
  // 若为 number 类型且为有限数值，则必须是整数且非负
  if (typeof val === 'number' && isFinite(val)) return Number.isInteger(val) && val >= 0;
  // 字符串形式的整数：仅允许不带符号的纯数字（允许前后空白）
  return /^\d+$/.test(String(val).trim());
}
