/**
 * 生成数字校验器
 * @param {number} precision 小数位数
 * @param {*} span 取值范围
 * @param {*} bound 边界取值（开区间OR闭区间）
 * @returns
 */
export const genNumbervalidator = (precision = 2, span = [0, 99999999.99], bound = [0, 1]) => {
  return (rule, value, callback) => {
    // console.log(`output->value, span[0]`, bound, value, span[0], span[1])
    let numReg = /^-?\d+$/
    if (precision) numReg = new RegExp(
      `^(([1-9][0-9]*)|(([0]\\.\\d{1,${precision}}|[1-9][0-9]*\\.\\d{1,${precision}})))$`)

    if (isNaN(value)) {
      return callback(new Error(`仅允许输入数字`))
    }

    // 整数非0开头
    const zeroNumReg = new RegExp(`^((0{2,})|(0[1-9]{1,}))`)
    if (zeroNumReg.test(value)) {
      return callback(new Error(`请输入正确的格式(非0开头)`))
    }

    // 区间
    let boundaryValid = (value > span[0] && value < span[1]) // 左开右开
    if (bound[0] && bound[1]) boundaryValid = (value >= span[0] && value <= span[1]) // 左闭右闭
    else if (bound[0]) boundaryValid = (value > span[0] && value <= span[1]) // 左开右闭（默认）
    else if (bound[1]) boundaryValid = (value >= span[0] && value < span[1]) // 左闭右开
    if (!boundaryValid) {
      return callback(new Error(`请输入${span[0]}~${span[1]}范围内${precision != 0 ? '数字': '整数'}`))
    } else if (!numReg.test(value)) {
      return callback(new Error(precision != 0 ? `最多支持${precision}位小数` : `请输入${span[0]}~${span[1]}范围内整数`))
    } else {
      callback()
    }

  }
}
/**
 * 生成用户名校验器（字母数字 + 自定义param）
 * @param {*} span 长度范围
 * @param {*} param 自定义param
 * @returns
 */
export const genUserNameValidator = (span, param = '') => {
  return (rule, value, callback) => {
    const regExp = new RegExp(`^[A-Za-z0-9_${param}]{${span[0]},${span[1]}}$`)
    if (!value) return callback() // 非必填
    if (regExp.test(value)) {
      callback()
    } else {
      return callback(new Error(`请输入${span[0]}~${span[1]}位的数字、字母` + (param ? `(支持${param})` : '')))
    }
  }
}
/**
 * 生成名称校验器（中文字母数字 + 自定义param）
 * @param {*} span 长度范围
 * @param {*} param 自定义param
 * @returns
 */
export const genNameValidator = (span, param = '') => {
  return (rule, value, callback) => {
    const regExp = new RegExp(`^[\\u4E00-\\u9FA5A-Za-z0-9·${param}]{${span[0]},${span[1]}}$`)
    if (!value) return callback() // 非必填
    if (regExp.test(value)) {
      callback()
    } else {
      return callback(new Error(`请输入${span[0]}~${span[1]}位的汉字、数字、字母` + (param ? `(支持${param})` : '')))
    }
  }
}

/**
 * 生成任意字符校验器
 * @param {*} span 长度范围
 * @returns
 */
export const genIdValidator = (span) => {
  return (rule, value, callback) => {
    const regExp = new RegExp(`^.{${span[0]},${span[1]}}$`)
    if (!value) return callback() // 非必填
    if (regExp.test(value)) {
      callback()
    } else {
      callback(new Error(`请输入${span[0]}~${span[1]}位字符`))
    }
  }
}

/**
 * 生成非中文校验器
 * @param {*} span 长度范围
 * @returns
 */
export const genNoChineseValidator = (span) => {
  return (rule, value, callback) => { // 字母数字符号（非中文）
    const regExp = new RegExp(`^[^\u4e00-\u9fff]{${span[0]},${span[1]}}$`)
    if (!value) return callback() // 非必填
    if (regExp.test(value)) {
      callback()
    } else {
      callback(new Error(`请输入${span[0]}~${span[1]}位数字、字母、符号`))
    }
  }
}

/**
 * 生成数组校验器
 * @param {*} isRequired 是否必填
 * @param {*} span 长度范围
 * @param {*} message 错误信息
 * @returns
 */
export const genArrayValidator = (isRequired, span, message) => {
  return (rule, value, callback) => { // 数组校验
    if (!isRequired && !value) return callback() // 非必填
    if (value?.length < span[0] || value?.length > span[1]) {
      return callback(new Error(message || `请输入完整`))
    } else {
      callback()
    }
  }
}

//经度
export const validatorLongitude = (rule, value, callback) => {
  const reg = /^(\-|\+)?(((\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,15}|180)$/
  if (value === "") {
    callback(new Error('请输入经度'));
  } else {
    if (!reg.test(value)) {
      callback(new Error('范围:-180~180(保留小数点后十五位)'));
    }
    callback();
  }
}
//纬度
export const validatorLatitude = (rule, value, callback) => {
  const reg = /^(\-|\+)?([0-8]?\d{1}\.\d{0,15}|90\.0{0,15}|[0-8]?\d{1}|90)$/
  if (value === "") {
    callback(new Error('请输入纬度'));
  } else {
    if (!reg.test(value)) {
      callback(new Error('范围:-90~90(保留小数点后十五位)'));
    }
    callback();
  }
}
