import _ from "lodash"
import commonDeclare from "./commonDeclare"
import commonApi from "./commonApi"
export default {
  mixins: [commonApi,commonDeclare],
  data: function () {
    return {
      defFlag:true
    }
  },
  mounted() {
    if(!this.isInDisplay){
      // this.ruleWatcher()
      this.changeFormValidateDisabled(true);
      this.ruleCheck()
    }
  },
  methods: {
    openWatch(flag){
      this.defFlag = !!flag
    },
    ruleWatcher() {
      if(!this.defaultRules)
        return
      const that = this;
      Object.keys(that.defaultRules).forEach(key => {
        let func = function(){
          if(that.defFlag){
            that.defaultRules[key].apply(that)
          }
        }
        that.$watch("model." + key, _.debounce(func, 1000))
      })
    },
    ruleCheck() {
      if(!this.pattern)
        return
      const keySet = new Set(Object.keys(this.pattern).concat(Object.keys(this.checkRules).concat(Object.keys(this.defaultRules))))
      const res = {};
      const that = this;
      for (let key of keySet.keys()) {
        const rule = []
        if(that.pattern[key]){
          rule.push(...that.pattern[key])
        }
        const triggerType = that.getTriggerType(key)
        if(that.checkRules[key]){
          for (let j = 0; j < that.checkRules[key].length; j++) {
            const check = that.checkRules[key][j];
            rule.push({
              validator: check.bind(that),
              trigger: triggerType
            })
          }
        }
        if (that.defaultRules[key]) {
          rule.push({
            validator: that.defaultRules[key].bind(that),
            trigger: triggerType
          })
        }
        if(rule.length > 0) {
          res[key] = rule;
        }
      }
      that.rules = res;
    },
    getTriggerType(prop) {
      const fields = this.$refs.modelForm.fields;
      for (let i = 0; i < fields.length; i++) {
        const field = fields[i];
        if (field.prop === prop) {
          if (field.$children[1].$children[0].$el.className.startsWith("el-select")) {
            return "change";
          }
          return "blur";
        }
      }
    },
    changeFormValidateDisabled(flag) {
      const fields = this.$refs.modelForm.fields
      for (let i = 0; i < fields.length; i++) {
          const field = fields[i];
          field.validateDisabled = flag
      }
    }
  },
  computed:{
    isInDisplay(){
      return this.$store.state.Status.mode === 'display'
    }
  }
}