/*  验证必填项 */
export const validateRequired = (rule, value, callback) => {
  const reg = /^\s*$/;
  if (!value || reg.test(value)) {
    callback(new Error('必填项'));
  } else {
    callback();
  }
};

/* 是否合法IP地址 */
export function validateIP(rule, value, callback) {
  if (!value || value === 'undefined') {
    callback();
  } else {
    const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
    if (!reg.test(value) && value !== '') {
      callback(new Error('请输入正确的IP地址'));
    } else {
      callback();
    }
  }
}

/*  是否手机号码或者固话 */
export function validatePhoneTwo(rule, value, callback) {
  const reg = /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/;
  if (!value || value === 'undefined') {
    callback();
  } else if (!reg.test(value) && value !== '') {
    callback(new Error('请输入正确的电话号码或者固话号码'));
  } else {
    callback();
  }
}
/*  是否固话 */
export function validateTelphone(rule, value, callback) {
  const reg = /0\d{2}-\d{7,8}/;
  if (!value || value === 'undefined') {
    callback();
  } else if (!reg.test(value) && value !== '') {
    callback(new Error('请输入正确的固话（格式：区号+号码,如010-1234567）'));
  } else {
    callback();
  }
}
/*  是否手机号码 */
export function validatePhone(rule, value, callback) {
  const reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
  if (!value || value === 'undefined') {
    return Promise.resolve();
  }
  if (!reg.test(value) && value !== '') {
    return Promise.reject(new Error('请输入正确的电话号码'));
  }
  return Promise.resolve();
}
/*  是否身份证号码 */
export function validateIdNo(rule, value, callback) {
  const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  if (!value || value === 'undefined') {
    callback();
  } else if (!reg.test(value) && value !== '') {
    callback(new Error('请输入正确的身份证号码'));
  } else {
    callback();
  }
}
/*  是否邮箱 */
export function validateEMail(rule, value, callback) {
  const reg = /^([a-zA-Z0-9]+[-_.]?)+@[a-zA-Z0-9]+.[a-z]+$/;
  if (!value || value === 'undefined') {
    callback();
  } else if (!reg.test(value)) {
    callback(new Error('请输入正确的邮箱地址'));
  } else {
    callback();
  }
}
/* 验证内容是否英文数字以及下划线 */
export function isPassword(rule, value, callback) {
  const reg = /^[_a-zA-Z0-9]+$/;
  if (!value || value === 'undefined') {
    callback();
  } else if (!reg.test(value)) {
    callback(new Error('密码仅由英文字母，数字以及下划线组成'));
  } else {
    callback();
  }
}

/* 自动检验数值的范围 */
export function checkMaxNumber(rule, value, callback) {
  const re = /^[1-9][0-9]{0,1}$/;
  const rsCheck = re.test(value);
  if (!value || value === 'undefined') {
    callback();
  } else if (rule.isInteger && !rsCheck) {
    callback(new Error(`请输入[${rule.min}, ${rule.max}]之间的正整数`));
  } else if (!Number(value)) {
    callback(new Error(`请输入[${rule.min}, ${rule.max}]之间的数字`));
  } else if (value < rule.min || value > rule.max) {
    callback(new Error(`请输入[${rule.min}, ${rule.max}]之间的数字`));
  } else {
    callback();
  }
}

// 验证数字输入框最大数值,32767
export function checkMaxVal(rule, value, callback) {
  if (value < 0 || value > 32767) {
    callback(new Error('请输入[0,32767]之间的数字'));
  } else {
    callback();
  }
}
// 验证是否1-99之间
export function isOneToNinetyNine(rule, value, callback) {
  if (!value) {
    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);
}

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

// 验证是否大于0的整数
export const isIntegerNotZero = (rule, value, callback) => {
  if (!value) {
    callback();
  }
  if (!Number(value)) {
    callback(new Error('请输入大于0的正整数'));
  } else {
    const re = /^[1-9][0-9]{0,}$/;
    const rsCheck = re.test(value);
    if (!rsCheck) {
      callback(new Error('请输入大于0的正整数'));
    } else {
      callback();
    }
  }
};

/**
 * 验证 数字区间
 * rule.min: 0
 * rule.max: 100
 */
export const isNumberSection = (rule, value, callback) => {
  if (['', undefined, null].includes(value)) {
    callback();
  }
  if (!Number(value)) {
    callback(new Error('请输入数字'));
  } else if (rule.min > +value || rule.max < +value) {
    callback(new Error(rule.message || `请输入${rule.min}-${rule.max}区间的数字`));
  } else {
    callback();
  }
};

//  验证是否整数,非必填
export function isIntegerNotMust(rule, value, callback) {
  if (!value) {
    return Promise.resolve();
  }
  if (!Number(value)) {
    return Promise.reject(new Error('请输入正整数'));
  }
  const re = /^[0-9]*[1-9][0-9]*$/;
  const rsCheck = re.test(value);
  if (!rsCheck) {
    return Promise.reject(new Error('请输入正整数'));
  }
  return Promise.resolve();
}

//  验证是否是[0-1]的小数
export function isDecimal(rule, value, callback) {
  if (!value) {
    callback(new Error('输入不可以为空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('请输入[0,1]之间的数字'));
    } else if (value < 0 || value > 1) {
      callback(new Error('请输入[0,1]之间的数字'));
    } else {
      callback();
    }
  }, 100);
}

//  验证是否是[1-10]的小数,即不可以等于0
export function isBtnOneToTen(rule, value, callback) {
  if (typeof value === 'undefined') {
    callback(new Error('输入不可以为空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('请输入正整数，值为[1,10]'));
    } else if (
      !(
        value === '1' ||
        value === '2' ||
        value === '3' ||
        value === '4' ||
        value === '5' ||
        value === '6' ||
        value === '7' ||
        value === '8' ||
        value === '9' ||
        value === '10'
      )
    ) {
      callback(new Error('请输入正整数，值为[1,10]'));
    } else {
      callback();
    }
  }, 100);
}
//  验证是否是[1-100]的小数,即不可以等于0
export function isBtnOneToHundred(rule, value, callback) {
  if (!value) {
    callback(new Error('输入不可以为空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('请输入整数，值为[1,100]'));
    } else if (value < 1 || value > 100) {
      callback(new Error('请输入整数，值为[1,100]'));
    } else {
      callback();
    }
  }, 100);
}
//  验证是否是[0-100]的小数
export function isBtnZeroToHundred(rule, value, callback) {
  if (!value) {
    callback(new Error('输入不可以为空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('请输入[1,100]之间的数字'));
    } else if (value < 0 || value > 100) {
      callback(new Error('请输入[1,100]之间的数字'));
    } else {
      callback();
    }
  }, 100);
}

//  验证端口是否在[0,65535]之间
export function isPort(rule, value, callback) {
  if (!value) {
    callback(new Error('输入不可以为空'));
  }
  setTimeout(() => {
    if (value === '' || typeof value === 'undefined') {
      callback(new Error('请输入端口值'));
    } else {
      const re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
      const rsCheck = re.test(value);
      if (!rsCheck) {
        callback(new Error('请输入在[0-65535]之间的端口值'));
      } else {
        callback();
      }
    }
  }, 100);
}
//  验证端口是否在[0,65535]之间，非必填,isMust表示是否必填
export function isCheckPort(rule, value, callback) {
  if (!value) {
    callback();
  }
  setTimeout(() => {
    if (value === '' || typeof value === 'undefined') {
      //  callback(new Error('请输入端口值'));
    } else {
      const re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
      const rsCheck = re.test(value);
      if (!rsCheck) {
        callback(new Error('请输入在[0-65535]之间的端口值'));
      } else {
        callback();
      }
    }
  }, 100);
}

/*  小写字母 */
export function validateLowerCase(str) {
  const reg = /^[a-z]+$/;
  return reg.test(str);
}
/* 保留2为小数 */
export function validatetoFixedNew(str) {
  return str;
}
/*  验证key */
//  export function validateKey (str) {
//      var reg = /^[a-z_\-:]+$/;
//      return reg.test(str);
//  }

/*  大写字母 */
export function validateUpperCase(str) {
  const reg = /^[A-Z]+$/;
  return reg.test(str);
}

/*  大小写字母 */
export function validatAlphabets(str) {
  const reg = /^[A-Za-z]+$/;
  return reg.test(str);
}

/*  大小写字母数字 */
export function validatAlphabetsNumber(rule, value, callback) {
  const reg = /^[A-Za-z0-9]+$/;
  if (value && !reg.test(value)) {
    callback(new Error('请输入字母或数字'));
  } else {
    callback();
  }
}

//  验证数字和英文逗号
export function isCheckNumberComma(rule, value, callback) {
  if (!value) {
    callback();
  } else {
    const re = /^\d+(,+\d+)*$/;
    const rsCheck = re.test(value);
    if (!rsCheck) {
      callback(new Error('请输入数字或数字+英文逗号，以数字结尾'));
    } else {
      callback();
    }
  }
}
//  验证数字和-
export function isCheckNumberLine(rule, value, callback) {
  if (!value) {
    callback();
  } else {
    const re = /^\d+(-+\d+)*$/;
    const rsCheck = re.test(value);
    if (!rsCheck) {
      callback(new Error('请输入数字或数字和-，以数字结尾'));
    } else {
      callback();
    }
  }
}

// 验证数字价格
export function isCheckNumberPrice(rule, value, callback) {
  if (!value) {
    callback();
  } else if (Number.isNaN(+value)) {
    callback(new Error('请输入数字'));
  } else if (+value < 0) {
    callback(new Error('请输入大于0的数字'));
  } else {
    callback();
  }
}

// 验证价格保留小数点1位
export function isCheckPriceOneDecimal(rule, value, callback) {
  const num = +value;
  const arr = `${value}`.split('.');
  if (!value) {
    callback();
  } else if (Number.isNaN(num)) {
    callback(new Error('请输入数字'));
  } else if (num < 0) {
    callback(new Error('请输入大于0的数字'));
  } else if (arr.length === 2 && arr[1].length > 1) {
    callback(new Error('小数点保留1位'));
  } else {
    callback();
  }
}
// 验证价格保留小数点2位
export function isCheckPriceTwoDecimal(rule, value, callback) {
  const num = +value;
  const arr = `${value}`.split('.');
  if (!value) {
    callback();
  } else if (Number.isNaN(num)) {
    callback(new Error('请输入数字'));
  } else if (num < 0) {
    callback(new Error('请输入大于0的数字'));
  } else if (arr.length === 2 && arr[1].length > 2) {
    callback(new Error('小数点保留2位'));
  } else {
    callback();
  }
}

// 获取默认校验规则
export const getDefaultRule = data => {
  const isString = typeof data === 'string';
  if (isString) {
    return {
      required: true,
      message: data,
    };
  }
  return Object.assign(
    {
      required: true,
    },
    data,
  );
};

// 输入空格校验
export const validateSpaces = (rule, value, callback) => {
  // 输入不能包括空格
  if (value?.includes(' ')) {
    // eslint-disable-next-line prefer-promise-reject-errors
    return Promise.reject('输入不能为空格');
  }
  // 去掉空格后进行进一步校验
  // ...
  return Promise.resolve();
};
