/**
 * 验证非负整数（包含0及正整数）
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function checkNonnegativeInteger(rule, value, callback) {
  if (value) {
    value += ''
    if(/(^(0|[1-9][0-9]*)$)/.test(value)) {
      callback()
    } else {
      callback(new Error('只能输入数字,数值不能为负,且不能为小数'))
    }
  } else {
    callback()
  }
}

/**
 * 验证非负整数（包含0及正整数）
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function checkNonnegativeInt(rule, value, callback) {
  if (value) {
    value += ''
    if(/(^(0|[1-9][0-9]*)$)/.test(value)) {
      callback()
    } else {
      callback(new Error('只能输入数字,数值不能为负数'))
    }
  } else {
    callback()
  }
}

/**
 * 验证正整数（不包含0的正整数）
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function checkPositiveInteger(rule, value, callback) {
  if (value) {
    value += ''
    if(/(^[1-9]\d*$)/.test(value)) {
      callback()
    } else {
      callback(new Error('只能输入数字,数值不能为负数或0,且不能为小数'))
    }
  } else {
    callback()
  }
}

/**
 * 验证正数，且小数可2位（包含0及正整数）
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function checkPositiveDecimal(rule, value, callback) {
  if (value) {
    value += ''
    // if(/(^[1-9]([0-9]+)?(\.[0-9]{1,4})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(value)) {
    // if(/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(value)) {
    if(/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]{1,2}$)/.test(value)) {
      callback()
    } else {
      callback(new Error('只能输入数字,且数值不能为负,小数限2位'))
    }
  } else {
    callback()
  }
}
/**
 * 验证正数，且小数可4位（包含0及正整数）
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function checkPositiveDecimal4(rule, value, callback) {
  if (value) {
    value += ''
    // if(/(^[1-9]([0-9]+)?(\.[0-9]{1,4})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9]){0,3}$)/.test(value)) {
    if(/(^[1-9]([0-9]+)?(\.[0-9]{1,4})?$)|(^(0){1}$)|(^[0-9]\.[0-9]{1,4}$)/.test(value)) {
      callback()
    } else {
      callback(new Error('只能输入数字,且数值不能为负,小数限4位'))
    }
  } else {
    callback()
  }
}
/**
 * 验证手机号，座机号
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function validPhoneMobile(rule, value, callback){
  if (value){
    if (value === '') {
      callback(new Error('请输入11位手机号'));
    } else {
      let regPone = null;
      let mobile = /^1(3|4|5|6|7|8|9)\d{9}$/; //最新16手机正则
      let tel = /^(0\d{2,3}-){0,1}\d{7,8}$/; //座机
      if (value.charAt(0) == 0) {    // charAt查找第一个字符方法，用来判断输入的是座机还是手机号
        regPone = tel;
      } else {
        regPone = mobile;
      }
      if (!regPone.test(value)) {
        callback(new Error("请填写11位手机号或座机号(座机格式为 区号-座机号码)"))
      }
      callback();
    }
  }else {
    callback();
  }
}

/**
 * 验证经度输入范围在-180-180之间，且小数可15位
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function checkLon(rule, value, callback) {
  if (value) {
    value += ''
    if (value.match(/^(\-|\+)?(((\d|[1-9]\d|1[0-7]\d|0{1,3})\.\d{0,15})|(\d|[1-9]\d|1[0-7]\d|0{1,3})|180\.0{0,6}|180)$/)) {
      callback()
    } else {
      callback(new Error('经度为-180~180,小数限15位'))
    }
  } else {
    callback()
  }
}
/**
 * 验证纬度输入范围在-90~90之间，且小数可15位
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function checkLat(rule, value, callback) {
  if (value) {
    value += ''
    if (value.match(/^(\-|\+)?([0-8]?\d{1}\.\d{0,15}|90\.0{0,6}|[0-8]?\d{1}|90)$/)) {
      callback()
    } else {
      callback(new Error('纬度为-90~90,小数限15位'))
    }
  } else {
    callback()
  }
}

/**
 * 温度校验
 * @param rule
 * @param value
 * @param callback
 */
export function checkTemperature(rule, value, callback) {
  if (value !== '') {
    // 判断温度是否为数字
    if (!/^-?\d+(\.\d+)?$/.test(value)) {
      callback(new Error('温度值必须为数字'))
    } else {
      // 将温度转换为数字类型，方便后续比较大小
      const num = Number(value)

      // 判断温度的范围是否在 -50 到 50 之间
      if (num < -50 || num > 50) {
        callback(new Error('温度范围必须在-50℃ ~ 50℃之间'))
      } else {
        // 判断小数部分是否超过一位
        const reg = /(?:\.)(\d+)/
        let match = value.match(reg)
        if (match && match[1].length > 1) {
          callback(new Error('小数部分只能保留一位'))
        }
        // 判断整数部分是否超过两位，且第一位是否为0
        match = value.match(/^-?(\d+)/)
        if (match && (match[1].length > 2 || (match[1].length === 2 && match[1][0] === '0'))) {
          callback(new Error('整数部分长度不能超过2位，且第一位不能是0'))
        } else {
          callback()
        }
      }
    }
  } else {
    callback(new Error('温度值不能为空'))
  }
}

/**
 * 车牌号校验（含新能源）
 * @param rule
 * @param value
 * @param callback
 */
export function carPhoneValid (rule, value, callback) {
  const plateNumber = /^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}([A-HJ-NP-Z0-9挂学警港澳]{1}|[应急]{2}))$/
  if (plateNumber.test(value)) {
    callback()
  } else {
    callback(new Error('请输入正确的车牌号'))
  }
}

/**
 * 英文和数字校验
 * @param rule
 * @param value
 * @param callback
 */
export function englishAndNumValid(rule, value, callback) {
  if (value) {
    value += ''
    if (value.match(/^[A-Za-z0-9]{4,40}$/)) {
      callback()
    } else {
      callback(new Error('只能输入英文和数字'))
    }
  } else {
    callback()
  }
}
/**
 * 英文和数字校验18位
 * @param rule
 * @param value
 * @param callback
 */
export function englishAndshibaNumValid(rule, value, callback) {
  if (value) {
    value += ''
    if (value.match(/^[A-Za-z0-9]{0,18}$/)) {
      callback()
    } else {
      callback(new Error('只能输入0~18位英文和数字'))
    }
  } else {
    callback()
  }
}

export function englishOnly(rule, value, callback) {
  if (value) {
    value += ''
    if (value.match(/^[a-zA-Z]{2,40}$/)) {
      callback()
    } else {
      callback(new Error('请输入英文,且至少两个字符'))
    }
  } else {
    callback()
  }
}

