<template>
  <el-input :class="{'redClass':red && isDisable}"  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 {
      red: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.red = 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
      }
    },
    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:{
    getProperty(str, value) {
      let keys = str?.split('.')
      for (let key of keys) {
        if (value) {
          value = value[key]
        }
      }
      return value
    }
  }
}
</script>

<style lang="less" scoped>
 .redClass /deep/ .el-input__inner{
  border-color: red;
}

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