/**
 * 验证是否为空
 * @param string|array value 
 * @returns 
 */
function isEmpty(value) {
  if (value === null || value === undefined || value === "") {
    return true;
  }
  if (Array.isArray(value) && value.length === 0) {
    return true;
  }
  return false;
}

/**
 * 是否为手机号
 * @param {*} value 
 * @param {*} param1 
 * @returns 
 */
export const mobileValidator = (value, [locale]) => {
  if (isEmpty(value)) {
    return true;
  }
  if ((!locale || locale == "CN") && /^1[3456789][0-9]{9}$/.test(value)) {
    return true;
  } else if (locale == "EN" && /^\+[\d]{1,5}\s[\d]{1,14}$/.test(value)) {
    return true;
  }
  return "请输入正确的手机号";
};

/**
 * 是否为电话号码
 * @param  value 
 * @param {*} param1 
 * @returns 
 */
export const telValidator = (value, [locale]) => {
  if (isEmpty(value)) {
    return true;
  }
  if ((!locale || locale == "CN") && !/^(?:0|8)[1-9]{3,}-[0-9]{8}$/.test(value)) {
    return true;
  }
  return "电话号码格式不正确";
};

/**
 * 身份证号码是否正确
 * @param string value 
 * @returns 
 */
export const identifyValidator = (value) => {
  if (isEmpty(value)) {
    return true;
  }
  if (!/(?:^\d{15}$)|(?:^\d{18}$)|(?:^\d{17}(?:\d|X|x)$)/.test(value)) {
    return "身份证号码格式不正确";
  }
  return true;
};

/**
 * 验证小数位长度
 * @param number value 值
 * @param number param1.length 为小数位长度
 * @returns
 */
export const decimalValidator = (value, [length]) => {
  if (isEmpty(value)) {
    return true;
  }
  let regExp = new RegExp("^[0-9]+(?:.[0-9])?$");
  if (length) {
    regExp = new RegExp("^[0-9]+(?:.[0-9]{1," + length + "})?$");
  }
  if (regExp.test(value)) {
    return true;
  }
  return "小数位长度不正确";
};

/**
 * 验证是否为大写字母
 * @param string value
 * @returns
 */
export const letterUpperValidator = (value) => {
  if (isEmpty(value) || /^[A-Z]+$/.test(value)) {
    return true;
  }
  return "请填写大写字母";
};

/**
 * 验证是否为小写字母
 * @param string value
 * @returns
 */
export const letterLowerValidator = (value) => {
  if (isEmpty(value) || /^[a-z]+$/.test(value)) {
    return true;
  }
  return "请填写小写字母";
};

/**
 * 验证是否为中文
 * @param string value
 * @returns
 */
export const characterCNValidator = (value) => {
  if (isEmpty(value) || /^[\u4e00-\u9fa5]+$/.test(value)) {
    return true;
  }
  return "请输入中文";
};

/**
 * 验证是否为邮编格式
 * @param string value
 * @returns
 */
export const zipcodeValidator = (value) => {
  if (isEmpty(value) || /^[1-9]\d{5}(?!\d)$/.test(value)) {
    return true;
  }
  return "请输入正确邮编";
};

/**
 * 验证是否为传真格式
 * @param string value
 * @returns
 */
export const faxValidator = (value) => {
  if (isEmpty(value) || /^(\d{3,4}-)?\d{7,8}$/.test(value)) {
    return true;
  }
  return "请输入正确的传真格式";
};


const allValid = {
  mobile: mobileValidator,
  tel: telValidator,
  identify: identifyValidator,
  decimal: decimalValidator,
  letter_upper: letterUpperValidator,
  letter_lower: letterLowerValidator,
  character_cn: characterCNValidator,
  zipcode: zipcodeValidator,
  fax: faxValidator
};

export default allValid;
