<template>
	<c-fullbox>
		<div style="position: relative;">
			<el-input
				:id="id"
				ref="form-item"
				v-model="model"
				:style="{'border-bottom': isShowRed ? `1px solid ${isShowRed}` : ''}"
				v-bind="attrs"
				v-on="$listeners"
				v-bind:disabled="isDisable"
				:maxlength="maxlength"
				:show-word-limit="isLimitChar ? false : showWordLimit"
				:placeholder="placeholderEnable || placeholder || $t('components.请输入')"
				@change="handleChange"
			>
				<template v-slot:suffix>
					<slot name="suffix"></slot>
				</template>
			</el-input>
			<span v-if="isLimitChar" class="cus-input-count">{{curLength}}/{{maxlength}}</span>
		</div>
		<template slot="footer" v-if="isShow.show">
			<el-tooltip :content="isShow.warning" placement="bottom" effect="light" popper-class="tooltip">
				<i :class="isShow.show ? 'el-icon-warning' : ''" style="margin-left: 10px;color: red;font-size: 16px;cursor: pointer;"></i>
			</el-tooltip>
		</template>
	</c-fullbox>
</template>

<script>
import commonDepend from '~/mixin/commonDepend.js'
import markSetShowRed from '~/components/business/componentMixins/markSetShowRed.js'
export default {
	inject: {
		root: {
			default: () => null
		}
	},
	mixins: [commonDepend, markSetShowRed],
  props: {
    value: {
      type: [String, Number],
      default: undefined
    },
    disabled: {
      type: Boolean,
      default: false
    },
    id: {
      type: String,
      default: undefined
    },
    // 此对象为markset或者modifySet所在的对象,如果传了此对象可以标记当前对象下的字段为红色下划线
    markSetData: {
      type: Object,
      default: () => null
    },
		customModifykey: {
			type: String,
      default: null
		},
		isShow: {
			type: Object,
			default: () => ({
				show: false,
				warning: ''
			})
    },
    placeholder:{
      type: String,
      default: null
		},
    maxlength:{
      type: [String, Number],
      default: 1000
		},
		showWordLimit: {
			type: Boolean,
			default: false
		},
		isLimitChar: {
			type: Boolean,
			default: false
		}
  },
  computed: {
    model: {
      get () {
        return this.value
      },
      set (newVal) {
        this.$emit('input', newVal)
      }
    },
    mode () {
      return this.$store.state.Status.mode
    },
    isDisable() {
			return this.mode === 'display' || this.disabled
    },
    placeholderEnable(){
      let label = this.$parent.label || this.$parent.label
      let curLabel = ''
      if (label) {
        curLabel = this.$i18n.locale === 'en' ? this.$t('components.请输入') + ' ' +  this.$t('components.' + label) : this.$t('components.请输入') + this.$t('components.' + label)
      }
      return curLabel
    },
    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
		},
		curLength() {
			let len = 0
			if (this.isLimitChar && this.model && typeof(this.model) == 'string') {
				len = this.model.replace(/[^x00-xff]/g, 'xx').length
			} else {
				len = this.model.length || 0
			}
			return len
		}
  },
  watch: {
    disabled(newVal) {
      if (newVal) {
        this.resetValidate()
      }
		},
		isLimitChar(newVal) {
			if (newVal) {
        this.initInputValid()
      }
		},
		maxlength(newVal) {
			if (newVal) {
        this.initInputValid()
      }
		}
  },
	methods: {
		handleChange () {
			if (!this.customModifykey) {
				// 添加isModify属性
				this.changeModify()
			}
		},
		isCheckInput() {
			let prop = this.customModifykey || this.$parent.prop
			if (!prop || !this.root) {
				return false;
			}
			if (this.isLimitChar) {
				let curProp = [
					{
						validator: (rule, value, callback) => {
							if (this.curLength > this.maxlength) {
								callback(new Error('输入内容不能超过' + this.maxlength + '个字节(一个中文字符占两个字节)'))
							} else {
								callback()
							}
						},
						trigger: ['change', 'blur'],
						source:"mulrow"
					},
				]
				// 清除上次校验的问题
				this.root.$refs['modelForm'].clearValidate([prop]);
				//合并交易下必填校验
				if(this.root.rules[prop] && this.root.rules[prop].length){
					let oldProp = this.root.rules[prop].filter(item=>!item.source)
					curProp = [...oldProp,...curProp];
					this.$set(this.root.rules, prop, curProp)
				}else{
					this.$set(this.root.rules, prop, curProp)
				}
				console.log('input校验规则rules:', this.root.rules, prop)
			}
		},
		initInputValid() {
			this.$nextTick(() => {
				this.isCheckInput()
			})
		}
	},
	mounted() {
		this.initInputValid()
	}
}
</script>

<style>
/* .el-input.highl ight .el-input__inner{
  border-color: red;
}
.el-textarea.highlight .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;
} */
body > .tooltip {
	color: red;
}
body > .el-tooltip__popper.is-light{
	border: 1px solid #DFDCE6;
}
/* 改变三角形外边框 */
/* 三角形朝下的时候 */
.el-tooltip__popper[x-placement^="bottom"] .popper__arrow {
  border-bottom-color: #DFDCE6 !important;
}
</style>
<style lang="less" scoped>
.cus-input-count {
	position: absolute;
	right: 10px;
	bottom: 5px;
	z-index: 10;
	height: 16px;
	line-height: 16px;
	color: #939099;
}
</style>