const messages = {
  default: "%s验证失败",
  required: "%s是必填项",
  enum: "%s必须是%s之一",
  whitespace: "%s不能为空",
  // date: {
  //   format: '%s date %s is invalid for format %s',
  //   parse: '%s date could not be parsed, %s is invalid ',
  //   invalid: '%s date %s is invalid',
  // },
  types: {
    string: "%s不是有效的字符串",
    method: "%s不是有效的函数",
    array: "%s不是有效的数组",
    object: "%s不是有效的对象",
    number: "%s不是有效的数字",
    date: "%s不是有效的日期",
    boolean: "%s不是有效的布尔值",
    integer: "%s不是有效的整数",
    float: "%s不是有效的浮点数",
    regexp: "%s不是有效的正则表达式",
    email: "%s不是有效的邮箱",
    url: "%s不是有效的 url",
    hex: "%s不是有效的十六进制",
  },
  string: {
    len: "%s长度必须是%s",
    min: "%s最小长度为%s",
    max: "%s最大长度为%s",
    range: "%s长度必须在%s和%s之间",
  },
  number: {
    len: "%s必须等于%s",
    min: "%s不小于%s",
    max: "%s不大于%s",
    range: "%s必须在%s和%s之间",
  },
  array: {
    len: "%s的数量必须是%s",
    min: "%s的数量不小于%s",
    max: "%s的数量不大于%s",
    range: "%s的数量必须在%s和%s之间",
  },
  pattern: {
    mismatch: "%s的值 %s 不匹配模式 %s",
  },
  clone: function clone() {
    const cloned = JSON.parse(JSON.stringify(this));
    cloned.clone = this.clone;
    return cloned;
  },
  //
  compare: "%s 和 %s 输入必须一致",
  true: "%s必须选中",
  remote: "%s远程验证失败",
};

const validators = {
  compare(rule, value, callback, source, options) {
    const errors = [];
    if (value && value !== rule.data[rule.compare]) {
      const message = format(options.messages.compare, rule.title, rule.schema.properties[rule.compare].title);
      errors.push(new Error(message));
    }
    callback(errors);
  },
  true(rule, value, callback, source, options) {
    const errors = [];
    if (!value) {
      const message = format(options.messages.true, rule.title);
      errors.push(new Error(message));
    }
    callback(errors);
  },
  remote(rule, value, callback, source, options) {
    const errors = [];
    const message = format(options.messages.remote, rule.title);
    if (!value) {
      callback(errors);
    } else {
      const config = {
        url: rule.url,
        method: rule.method ?? "GET",
      };
      const data = { [rule.field]: value };
      if (config.method === "GET") {
        config.params = data;
      } else {
        config.data = data;
      }
      request
        .request(config)
        .then((response) => {
          if (response.status === 200) {
            if (response.data.code) {
              if (response.data.code !== 200) {
                errors.push(new Error(1 + response.data.message));
              }
            }
          } else {
            errors.push(new Error(2 + response.data));
          }
          callback(errors);
        })
        .catch((o) => {
          errors.push(o.response?.data?.message ?? message ?? o.message);
          callback(errors);
        });
    }
  },
};

export { messages };