<template>
  <el-input :class="{ 'greenClass': isGreen && isDisplay, 'yellowClass': isYellow && isDisplay, 'redClass': isRed && isDisplay }"
    v-storeModify :id="id" ref="form-item" v-model="model" v-bind="attrs" v-on="$listeners" v-bind:disabled="isDisable">
    <template v-slot:suffix>
      <slot name="suffix"></slot>
    </template>
  </el-input>
</template>

<script>
export default {
  inject: ["root"],
  props: {
    value: {
      type: [String, Number],
      default: undefined
    },
    disabled: {
      type: Boolean,
      default: false
    },
    id: {
      type: String,
      default: undefined
    }
  },
  data() {
    return {
      isRed: false,
      isGreen: false,
      isYellow: false
    }
  },
  directives: {
    storeModify: {
      update(el, bind, vnode) {
        let _this = vnode.context
        let key = vnode.parent.data.model.expression
        let keyArray = key.split('.')
        let curKey = keyArray.pop()
        let resultKey = keyArray.join(".")

        let deepData = _this.getProperty(resultKey, _this.root)
        if (deepData && Array.isArray(deepData.modifySet)) {
          if (deepData.modifySet.includes(curKey)) {
            _this.isRed = true
          }
        }
        if (deepData && Array.isArray(deepData.ebankSet)) {
          if (deepData.ebankSet.includes(curKey)) {
            _this.isYellow = true

          }
        }
        if (deepData && Array.isArray(deepData.incSet)) {
          if (deepData.incSet.includes(curKey)) {
            _this.isGreen = true
          }
        }
        el.onchange = (...args) => {
          if (deepData.modifySet) {
            if (Array.isArray(deepData.modifySet)) {
              if (deepData.modifySet.includes(curKey)) {
                return
              }
              deepData.modifySet.push(curKey)
            }
          } else {
            deepData.modifySet = [curKey]
          }
        }
      }
    }
  },
  computed: {
    model: {
      get() {
        return this.value
      },
      set(newVal) {
        this.$emit('input', newVal)
      }
    },
    mode() {
      return this.$store.state.Status.mode
    },
    isDisable: {
      get() {
        return this.mode === 'display' || this.disabled
      }
    },
    isDisplay: {
      get() {
        return this.mode === 'display'
      }
    },
    highlight() {
      return this.$store.state.Status.highlights.indexOf(this.id) !== -1
    },
    highlightChanges() {
      return this.$store.state.Status.highlightChanges.indexOf(this.id) !== -1
    },
    attrs() {
      if (this.mode === 'display' || this.disabled) {
        let { placeholder, ...rest } = this.$attrs
        return rest
      }
      return this.$attrs
    }
  },
  methods: {
    isIncludeType(data) {
      if (data && Array.isArray(data.modifySet)) {
        if (data.modifySet.includes(curKey)) {
          _this.isRed = true
        }
      }
      if (data && Array.isArray(data.ebankSet)) {
        if (data.ebankSet.includes(curKey)) {
          _this.isYellow = true

        }
      }
      if (data && Array.isArray(data.incSet)) {
        if (data.incSet.includes(curKey)) {
          _this.isGreen = true
        }
      }
    },
    getProperty(str, value) {
      let keys = str?.split('.')
      for (let key of keys) {
        if (value) {
          value = value[key]
        }
      }
      return value
    }
  }
}
</script>

<style lang="less" scoped>
.greenClass /deep/ .el-input__inner {
  border-color: green;
  border-width: medium;
}

.greenClass /deep/ .el-textarea__inner {
  border-color: green;
  border-width: medium;
}

.yellowClass /deep/ .el-input__inner {
  border-color: blue;
  border-width: medium;
}

.yellowClass /deep/ .el-textarea__inner {
  border-color: blue;
  border-width: medium;
}

.redClass /deep/ .el-input__inner {
  border-color: red;
  border-width: medium;
}

.redClass /deep/ .el-textarea__inner {
  border-color: red;
  border-width: medium;
}

/*
.el-input.change-light .el-input__inner{
  border-color: #E6A23C;
}
.el-textarea.change-light .el-textarea__inner {
  border-color: #E6A23C;
} */</style>