/**
 * 校验手机号
 * @param {*} rule
 * @param {*} value 手机号
 * @param {*} callback 校验回调
 */
export const validateMobile = (rule, value, callback) => {
  if (value === "") {
    callback(new Error("请输入联系方式"));
  } else if (!/^1(3|4|5|6|7|8|9)[0-9]\d{8}$/.test(value)) {
    callback(new Error("请输入正确的联系方式"));
  } else {
    callback();
  }
};

/**
 *校验验证码 输入的值和图形码进行比较
 * @param {*} value string 输入的值
 * @param {*} callback 校验的回调函数
 * @param {*} checkCode object imgCode：图形码，code输入的验证码
 * @param {*} fun 请求图形码的函数
 */
export const valiReportCode = (value, callback, checkCode, fun) => {
  if (checkCode.imgCode) {
    if (value != checkCode.code) {
      callback(new Error("请输入正确的验证码"));
    } else {
      callback();
    }
  } else {
    fun();
    callback(new Error("请输入正确的验证码"));
  }
};

/**
 * 身份证15位编码规则：dddddd yymmdd xx p dddddd：6位地区编码 yymmdd: 出生年(两位年)月日，如：910215 xx:
 * 顺序编码，系统产生，无法确定 p: 性别，奇数为男，偶数为女
 *
 * 身份证18位编码规则：dddddd yyyymmdd xxx y dddddd：6位地区编码 yyyymmdd:
 * 出生年(四位年)月日，如：19910215 xxx：顺序编码，系统产生，无法确定，奇数为男，偶数为女 y: 校验码，该位数值可通过前17位计算获得
 *
 * 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ] 验证位
 * Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ] 如果验证码恰好是10，为了保证身份证是十八位，那么第十八位将用X来代替
 * 校验位计算公式：Y_P = mod( ∑(Ai×Wi),11 ) i为身份证号码1...17 位; Y_P为校验码Y所在校验码数组位置
 */

export const isIdCard = (rule, value, callback) => {
  // 15位和18位身份证号码的正则表达式
  var regIdCard =
    /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;

  // 如果通过该验证，说明身份证格式正确，但准确性还需计算
  if (regIdCard.test(value)) {
    if (value.length == 18) {
      var idCardWi = new Array(
        7,
        9,
        10,
        5,
        8,
        4,
        2,
        1,
        6,
        3,
        7,
        9,
        10,
        5,
        8,
        4,
        2
      ); // 将前17位加权因子保存在数组里
      var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 这是除以11后，可能产生的11位余数、验证码，也保存成数组
      var idCardWiSum = 0; // 用来保存前17位各自乖以加权因子后的总和
      for (var i = 0; i < 17; i++) {
        idCardWiSum += value.substring(i, i + 1) * idCardWi[i];
      }

      var idCardMod = idCardWiSum % 11; // 计算出校验码所在数组的位置
      var idCardLast = value.substring(17); // 得到最后一位身份证号码

      // 如果等于2，则说明校验码是10，身份证号码最后一位应该是X
      if (idCardMod == 2) {
        if (idCardLast == "X" || idCardLast == "x") {
          callback();
        } else {
          callback("输入的证件号码不正确！");
        }
      } else {
        // 用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
        if (idCardLast == idCardY[idCardMod]) {
          callback();
        } else {
          callback("输入的证件号码不正确！");
        }
      }
    } else {
      return true;
    }
  } else {
    callback("输入的证件号码格式不正确！");
  }
};

/**
 * 校验组织机构代码
 * 全国组织机构代码由八位数字（或大写拉丁字母）本体代码和一位数字（或大写拉丁字母）校验码组成
 */
export const checkOrgCode = (rule, value, callback) => {
  var ws = [3, 7, 9, 10, 5, 8, 4, 2];
  var str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  var reg = /^([0-9A-Z]){8}-[0-9|X]$/; // /^[A-Za-z0-9]{8}-[A-Za-z0-9]{1}$/
  var sum = 0;
  for (var i = 0; i < 8; i++) {
    sum += str.indexOf(value.charAt(i)) * ws[i];
  }
  var c9 = 11 - (sum % 11);
  c9 = c9 == 10 ? "X" : c9;
  alert(c9 + " -- " + value.charAt(9));
  if (!reg.test(value) || c9 == value.charAt(9)) {
    callback("请输入有效的组织机构代码！");
  } else {
    callback();
  }
};

/**
 *验证营业执照是否合法：营业执照长度须为15位数字，前14位为顺序码，
 *最后一位为根据GB/T 17710 1999(ISO 7064:1993)的混合系统校验位生成算法
 *计算得出。此方法即是根据此算法来验证最后一位校验位是否政正确。如果
 *最后一位校验位不正确，则认为此营业执照号不正确(不符合编码规则)。
 *以下说明来自于网络:
 *我国现行的营业执照上的注册号都是15位的，不存在13位的，从07年开始国
 *家进行了全面的注册号升级就全部都是15位的了，如果你看见的是13位的注
 *册号那肯定是假的。
 *15位数字的含义，代码结构工商注册号由14位数字本体码和1位数字校验码
 *组成，其中本体码从左至右依次为：6位首次登记机关码、8位顺序码。
 *   一、前六位代表的是工商行政管理机关的代码，国家工商行政管理总局用
 *           “100000”表示，省级、地市级、区县级登记机关代码分别使用6位行
 *             政区划代码表示。设立在经济技术开发区、高新技术开发区和保税区
 *             的工商行政管理机关（县级或县级以上）或者各类专业分局应由批准
 *             设立的上级机关统一赋予工商行政管理机关代码，并报国家工商行政
 *             管理总局信息化管理部门备案。
 *   二、顺序码是7-14位，顺序码指工商行政管理机关在其管辖范围内按照先
 *             后次序为申请登记注册的市场主体所分配的顺序号。为了便于管理和
 *              赋码，8位顺序码中的第1位（自左至右）采用以下分配规则：
 *　　          1）内资各类企业使用“0”、“1”、“2”、“3”；
 *　　          2）外资企业使用“4”、“5”；
 *　　          3）个体工商户使用“6”、“7”、“8”、“9”。
 *   顺序码是系统根据企业性质情况自动生成的。
 *   顺序码是系统根据企业性质情况自动生成的。
 *三、校验码是最后一位，校验码用于检验本体码的正确性
 */
export const isValidBusCode = (rule, value, callback) => {
  //return true;
  var ret = false;
  if (value.length == 15) {
    var s = [];
    var p = [];
    var a = [];
    var m = 10;
    p[0] = m;
    for (var i = 0; i < value.length; i++) {
      a[i] = parseInt(value.substring(i, i + 1), m);
      s[i] = (p[i] % (m + 1)) + a[i];
      if (0 == s[i] % m) {
        p[i + 1] = 10 * 2;
      } else {
        p[i + 1] = (s[i] % m) * 2;
      }
    }
    if (1 == s[14] % m) {
      callback();
    } else {
      //营业执照编号错误!
      ret = false;
      callback("输入的营业执照编号错误!");
    }
  } //如果营业执照为空
  else if ("" == value) {
    callback("请填写营业执照编号！");
    ret = false;
  } else {
    ret = false;
    callback("输入的营业执照格式不对，必须是15位数的！");
  }
  return ret;
};

// 邮政编码验证
export const isPostalCode = (rule, value, callback) => {
  var pattern = /^[0-9]{6}$/;
  if (value != "") {
    if (!pattern.exec(value)) {
      callback("请输入正确的邮政编码");
    } else {
      callback();
    }
  } else {
    callback("请填写邮政编码");
  }
};
