/**
 * Created by PanJiaChen on 16/11/18.
 */
/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

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

export function validnumber(rule, value, callback) {
  if (value === '' || value === undefined || value === null) {
    if(rule.required){
      callback(new Error('请输入正整数'))
    }else{
      callback()
    }
  } else {
    const reg = (/^[+]{0,1}(\d+)$/)
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正整数'))
    } else {
      if(Number.parseInt(value)==0){
        callback(new Error('请输入正整数，0不是正整数'))
      }else{
        callback()
      }
    }
  }
}

export function validPrice(rule, value, callback) {
  if (value === '' || value === undefined || value === null) {
    if(rule.required){
      callback(new Error('请输入必填项'))
    }else{
      callback()
    }
  } else {
    const reg = (/(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/)
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正确的价格,支持两位小数'))
    } else {
      callback()
    }
  }
}

export function validYear(rule, value, callback) {
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    const reg = (/[0-9]{4}/)
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正确的年份'))
    } else {
      callback()
    }
  }
}

export function validEmail(rule, value, callback) {
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    const reg = (/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正确的邮箱'))
    } else {
      callback()
    }
  }
}

export function validEmails(rule, value, callback) {
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    var ruleItem = value.split(';')
    for (var i in ruleItem) {
      const reg = (/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)
      if ((!reg.test(ruleItem[i])) && ruleItem[i] !== '') {
        callback(new Error(ruleItem[i] + '格式错误，请输入正确的邮箱，多个邮箱时用";"分隔'))
      }
    }
    callback()
  }
}

export function validNumberAndWord(rule, value, callback) {
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    const reg = (/^([a-zA-Z0-9_\.\-])+$/)
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('只能为数字和字母'))
    } else {
      callback()
    }
  }
}

export function checkMaxVal(rule, value, callback) {
  if (value < 0 || value > 100000000) {
    callback(new Error('请输入[0,100000000]之间的数字'))
  } else {
    callback()
  }
}

export function checkMaxIntVal(rule, value, callback) {
  if (value < 0 || value > 2147483647) {
    callback(new Error('请输入[0,2147483647]之间的数字'))
  } else {
    callback()
  }
}

export function validator(rule, value, callback) {
  if (!(/^1[3456789]\d{9}$/.test(value)) && value) {
    callback(new Error('请输入正确的手机号码!'))
  }else{
    callback()
  }
}

export function validatorTel(rule, value, callback) {
  if(!value){
    callback()
  }else{
    if (!(/^1[3456789]\d{9}$/.test(value))) {
      callback(new Error('请输入正确的手机号!'))
    }else{
      callback()
    }
  }
}

export function IdentityCodeValid(rule, value, callback) {
// 该方法由佚名网友提供;
  if(value.length === 0){
    callback()
  }
  if (value.length === 15) {
    if (isValidityBrithBy15IdCard(value)) {
      callback()
    } else {
      callback(new Error('请输入有效的身份证'))
    }
  } else if (value.length === 18) {
    var a_idCard = value.split('')// 得到身份证数组
    if (isValidityBrithBy18IdCard(value) && isTrueValidateCodeBy18IdCard(a_idCard)) {
      callback()
    } else {
      callback(new Error('请输入有效的身份证'))
    }

  } else {
    callback(new Error('请输入有效的身份证'))
  }
}

 function isTrueValidateCodeBy18IdCard(a_idCard) {
  var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]// 加权因子;
  var ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]// 身份证验证位值，10代表X;
  var sum = 0 // 声明加权求和变量
  if (a_idCard[17].toLowerCase() == 'x') {
    a_idCard[17] = 10// 将最后位为x的验证码替换为10方便后续操作
  }
  for (var i = 0; i < 17; i++) {
    sum += Wi[i] * a_idCard[i]// 加权求和
  }
  var valCodePosition = sum % 11// 得到验证码所位置
  if (a_idCard[17] == ValideCode[valCodePosition]) {
    return true
  }
  return false
}

function isValidityBrithBy18IdCard(idCard18) {
  var year = idCard18.substring(6, 10)
  var month = idCard18.substring(10, 12)
  var day = idCard18.substring(12, 14)
  var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day))
  // 这里用getFullYear()获取年份，避免千年虫问题
  if (temp_date.getFullYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 || temp_date.getDate() != parseFloat(day)) {
    return false
  }
  return true
}

function isValidityBrithBy15IdCard(idCard15) {
  var year = idCard15.substring(6, 8)
  var month = idCard15.substring(8, 10)
  var day = idCard15.substring(10, 12)
  var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day))
  // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
  if (temp_date.getYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 || temp_date.getDate() != parseFloat(day)) {
    return false
  }
  return true
}

export function isblank(rule, value, callback) {
  if (value && value.replace(/\s+/g,"") === '') {
    callback(new Error('不能为空'))
  }else{
    callback()
  }
}

/**
 * 是否存在空格
 * @param rule
 * @param value
 * @param callback
 */
export function isHasblank(rule, value, callback) {
  if (value && value.indexOf(' ') >0) {
    callback(new Error('不能有空格'))
  }else{
    callback()
  }
}

//验证是否1-99之间
export function isOneToNinetyNine(rule, value, callback) {
    if (!value) {
        return callback(new Error('输入不可以为空'));
    }
    setTimeout(() => {
        if (!Number(value)) {
            callback(new Error('请输入正整数'));
        } else {
            const re = /^[1-9][0-9]{0,1}$/;
            const rsCheck = re.test(value);
            if (!rsCheck) {
                callback(new Error('请输入正整数，值为【1,99】'));
            } else {
                callback();
            }
        }
    }, 0);
}
