import vaildateCom from "./vaildateCom";
import { ComConstant } from './constant'
//是否为空
export function isEmpty(v) {
  return v == null || v == undefined || v.length == 0;
}

//如果包含三位一逗号，则剔除
export function removeComma(v) {
  return (v + '').replace(new RegExp(',', 'g'), '');
}

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

/**
 * 字符串是否是字母组成
 * @param {string} str
 * @returns {Boolean}
 */
export function validAlphabets(str) {
  const reg = vaildateCom['alphabets']
  return reg.test(str)
}

/**
 * 字符串是否由小写字母组成
 * @param {string} str
 * @returns {Boolean}
 */
export function validLowerCase(str) {
  const reg = vaildateCom['lowerCase']
  return reg.test(str)
}

/**
 * 字符串是否由大写字母组成
 * @param {string} str
 * @returns {Boolean}
 */
export function validUpperCase(str) {
  const reg = vaildateCom['UpperCase']
  return reg.test(str)
}

/**
 * 带有前缀的 p 字符串
 * @param {*} v 字符串
 * @param {*} p 前缀
 * @returns 
 */
export function prefixseq(v, p) {
  var expression = eval("/^" + p + "/");
  var regular = new RegExp(expression);
  return isEmpty(v) || regular.test(v);
}

/**
 * 判断字符串是否是https?:|mailto:|tal: 开头的
 * @param {string} path 
 * @returns {Boolean}
 */
export function isExternal(path) {
  const reg = vaildateCom['external']
  return reg.test(path)
}

/**
 * 网址
 * @param {string} url
 * @returns {Boolean}
 */
export function validURL(url) {
  const reg = vaildateCom['url']
  return reg.test(url)
}

/**
 * email
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email) {
  const reg = vaildateCom['email']
  return reg.test(email)
}

/**
 * 电话号码验证
 * @param {string} v
 * @returns {Boolean}
 */
export function isPhone(v) {
  var patrn = vaildateCom['phone'];
  if (!patrn.exec(v)) {
    return false;
  }
  return true;
}

const { IdType } = ComConstant
/**
 *  根据证件类型和证件号码校验格式
 * @param {*} type 
 * @param {*} value 
 */
export function validateIdTypeNo(type, value) {
  switch (type) {
    case IdType.SFZ:
      return isIDNumber(value)
    case IdType.LSSFZ:
      return isIDNumber(value)
    case IdType.HKB:
      return isIDNumber(value)
    case IdType.DYDSFZ:
      return isIDNumber(value)
    case IdType.ZGHZ:
      return checkPassport(value)
    case IdType.YYZZ:
      return isCreditCode(value)
    case IdType.ZZJGDMZ:
      return isComOrgId(value)
    default:
      return true;
  }
}

/**
 * 身份证号校验
 * @param {string} v
 * @returns 
 */
export function isIDNumber(v) {
  let reg = vaildateCom['iDNumber']
  if (reg.test(v)) {
    return true;
  } else {
    return false;
  }
}

/**
 * 护照校验
 * @param {*} v 
 * @returns 
 */
export function checkPassport(v) {
  const len = validURL.length;
  // var reg  = /^((SE|DE|PE|MA){1}\\d{7}|[GSKE]{1}\\d{8})$/;//护照正则
  const reg = vaildateCom['passport'];// 护照正则
  if (len == 0) {
    return false;
  }
  if (!reg.test(v)) {
    return false;
  }
  return true;
}
/**
 * IP地址判断
 * @param {string} v
 * @returns 
 */
export function isIpAddr(v) {
  var patrnIp4 = vaildateCom['patrnIp4'];
  var patrnIp6 = vaildateCom['patrnIp6'];
  if (!patrnIp4.exec(v) && !patrnIp6.exec(v)) {
    return false;
  }
  return true;
}

/**
 * 统一社会信用代码校验
 * @param num 证件号码
 * @returns true-正确, false-不正确
 */
export function isCreditCode(num) { //验证组织机构代码

  if ((num.length == 15)) {
    return isBusinessLicense15(num);
  }

  var patrn = /^[0-9A-Z]+$/;
  if ((num.length != 18) || (patrn.test(num) == false)) {
    return false;
  } else {
    var Annum;
    var Annumvalue;
    var total = 0;
    var weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
    var str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
    for (var i = 0; i < num.length - 1; i++) {
      Annum = num.substring(i, i + 1);
      Annumvalue = str.indexOf(Annum);
      total = total + Annumvalue * weightedfactors[i];
    }
    var logicchecknum = 31 - total % 31;
    if (logicchecknum == 31) {
      logicchecknum = 0;
    }
    var Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
    var Array_Str = Str.split(',');
    logicchecknum = Array_Str[logicchecknum];
    var checknum = num.substring(17, 18);
    if (logicchecknum != checknum) {
      return false;
    } else {
      return true;
    }
  }
}

/**
 * 15位营业执照码校验
 * @param code 营业执照代码
 * @returns true-正确, false-不正确
 */
export function isBusinessLicense15(ints) {
  let ti = 0;
  let si = 0;
  let cj = 0;
  let pj = 10;
  let lastNum = '';
  for (let i = 0; i < ints.length; i++) {
    ti = parseInt(ints[i]);
    si = pj + ti;
    cj = (0 == si % 10 ? 10 : si % 10) * 2;
    pj = cj % 11;
    if (i == ints.length - 1) {
      lastNum = si % 10
    }
  }
  if (lastNum == 1) {
    return true
  } else {
    return false
  }
}

/**
 * 组织机构号码校验
 * @param code 组织机构代码
 * @returns true-正确, false-不正确
 */
export function isComOrgId(code) {
  if (code.length != 10) {
    return false;
  }
  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(code.charAt(i)) * ws[i];
  }
  var c9 = 11 - (sum % 11);
  c9 = c9 == 10 ? 'X' : c9
  // alert(c9 + " -- " + code.charAt(9));
  if (!reg.test(code) || c9 != code.charAt(9)) {
    // alert("不是有效的组织机构代码！");
    return false;
  } else {
    return true;
  }
}

/**
 * 是否是字符串
 * @param {string} str
 * @returns {Boolean}
 */
export function isString(str) {
  if (typeof str === 'string' || str instanceof String) {
    return true
  }
  return false
}

/**
 * 是否是数组
 * @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)
}

/**
 * 是否是整数
 * @param  v
 * @returns {Boolean}
 */
export function isInteger(v) {
  // if (isEmpty(v)) return false;
  // var f = parseFloat(v);
  // return (!isNaN(f) && f.toString() == v && Math.round(f) == f);
  //es6中
  return Number.isInteger(v)
}

/**
 * 是否是数字
 * @param {*} v 
 * @returns 
 */
export function isNumber(v) {
  var regPos = vaildateCom['regPos']; //非负浮点数
  var regNeg = vaildateCom['regNeg']; //负浮点数
  if (regPos.test(val) && regNeg.test(val)) {
    return true;
  } else {
    return false;
  }
}

/**
 * 正整数
 * 注：是大于零的整数，不包含0
 * @param {*} v 
 * @returns 
 */
export function positiveInteger(v) {
  var v = removeComma(v);
  return isEmpty(v) || !/[^\d]/.test(v) && parseFloat(v) > 0;
}
/**
 * 非负整数
 * 注：是除了负整数以外的整数，是0和正整数的集合
 * @param {*} v 
 * @returns 
 */
export function digits(v) {
  var v = removeComma(v);
  return isEmpty(v) || !/[^\d]/.test(v);
}


/**
 * 正数
 * @param {*} v 
 * @returns 
 */
export function positive(v) {
  var v = removeComma(v);
  return !isEmpty(v) && parseFloat(v) > 0;
}

/**
 * 非负数
 * @param {*} v 
 * @returns 
 */
export function nonnegative(v) {
  var v = removeComma(v);
  return !isEmpty(v) && parseFloat(v) >= 0;
}

/**
 * 判断两个字符是否相等(忽略大小写)
 * @param {*} v 
 * @param {*} p 
 * @returns 
 */
export function equal_ignore_case(v, p) {
  return v.toLowerCase() == p.toLowerCase();
}

/**
 * 判断两个字符是否相等
 * @param {*} v 
 * @param {*} p 
 * @returns 
 */
export function equals(v, p) {
  return v.toLowerCase() == p.toLowerCase();
}

/**
 * 字符串是否包含全角字符
 * @param {*} v
 * @returns 
 */
export function isSsbccase(v) {
  for (var i = 0; i < v.length; i++) {
    var strCode = v.charCodeAt(i);
    if ((strCode > 65248) || (strCode == 12288)) {
      return false;
    }
  }
  return true;
}

/**
 * 英文字母或正数
 * @param {*} v
 * @returns 
 */
export function alphanum(v) {
  var patrn = /^[A-Za-z0-9]+$/;
  if (!patrn.exec(v)) {
    return false;
  }
  return true;
}

/**
 * 是否是中文
 * @param {*} v 
 * @returns 
 */
export function chenese(v) {
  return isEmpty(v) || /^[\u0391-\uFFE5]+$/.test(v);
}

/**
 * 数字+字母+特殊字符
 * @param {*} v 
 * @returns 
 */
export function noChenese(v) {
  var reg = vaildateCom['chenese']; //非负浮点数
  return isEmpty(v) || reg.test(v);
}