<template>
  <el-select
		:id="id"
		v-model="model"
		:style="{'border-bottom': isShowRed ? `1px solid ${isShowRed}` : ''}"
		v-bind="$attrs"
		filterable
		v-bind:disabled="isDisable"
		:clearable="clearable"
		v-on="$listeners"
    :placeholder="placeholderEnable || placeholder || $t('components.请选择')"
		@change="handleChange"
		@keyup.delete.native="deleteValue"
	>
		<i v-if="isShowCopy" slot="prefix" class="el-icon-document-copy copy-icon" @click.stop="handleCopy"></i>
    <slot>
      <el-option v-for="item in dbCodeList" :key="item.value" :label="formatShowLabel(item)" :value="item.value">
      </el-option>
    </slot>
  </el-select>
</template>

<script>
import commonDepend from "~/mixin/commonDepend.js";
import markSetShowRed from '~/components/business/componentMixins/markSetShowRed.js'
import { getSelectList } from "~/service/business/codeTable";
import {mapActions} from 'vuex'
export default {
	inject: {
		root: {
			default: () => null
		}
	},

	mixins: [commonDepend, markSetShowRed],
	props: {
		value: {
			type: [String, Array, Number],
			default: undefined
		},
		disabled: {
			type: Boolean,
			default: false
		},
		clearable: {
			type: Boolean,
			default: true
		},
		id: {
			type: String,
			default: undefined
		},
		// 静态显示codeTable中的字段
		code: {
			type: Array,
			default: function () {
				return [];
			}
		},
		// 动态获取下拉列表数据的关键字
		dbCode: {
			type: String,
			default: undefined
		},
		//是否从缓存中读取,false每次调接口
		isCache: {
			type: Boolean,
			default: true
		},
		// 下拉列表显示label和value,eg:value-label
		isShowKeyAndLabel: {
			type: Boolean,
			default: false
		},
		// 下拉列表显示value,eg:value
		isShowKey: {
			type: Boolean,
			default: false
		},
		// 此对象为markset或者modifySet所在的对象,如果传了此对象可以标记当前对象下的字段为红色下划线
		markSetData: {
			type: Object,
			default: () => null
		},
		customModifykey: {
			type: String,
			default: null
		},
		// 总下拉列表数据中过滤出以下数组key
		filterKey: {
			type: Array,
			default: () => []
		},
		// 总下拉列表数据中排除以下数组key
		expKey:{
			type: Array,
			default: () => []
		},
		// 码表语言类型-可选值:英文(en)-默认;中文(cn);
		uil: {
			type: String,
			default: 'EN'
		},
		// 语言类型
		tempUil: {
			type: String,
			default: ''
		},
		placeholder:{
			type: String,
			default: null
		},
		// 排序方式--值有两种:COD和SRT
		sort: {
			type: String,
			default: 'COD'
		},
		//下拉框是否跟随页面滚动
		isFixed:{
			type: Boolean,
			default: false
		},
		isShowCopy: {
			type: Boolean,
			default: false
		}
	},
	data() {
		return {
			dbCodeList: [],
			timer: {}
		};
	},
	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
      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;
		},
	},
	watch: {
		dbCode: {
			handler(newVal) {
				this.init()
			}
		},
		filterKey: {
			handler(newVal) {
				this.init()
			}
		},
		expKey: {
			handler(newVal) {
				this.init()
			}
		},
		disabled(newVal) {
			if (newVal) {
				this.resetValidate()
			}
		}
	},
	mounted() {
		this.init();
	},
	methods: {
		...mapActions([
			'getDbCodeData'
		]),
		init() {
			if (this.dbCode) {
				let dbCode = this.dbCode.toUpperCase()
				let localCodes = localStorage.getItem("localCodes");
				let codesData = {};
				if (localCodes) {
					codesData = JSON.parse(localCodes);
				}
				let lang = this.tempUil ? this.tempUil : (this.root && this.root.lang ? this.root.lang : this.uil)
				// 判断缓存中是否存在此码表,存在去缓存,不存在重新拉取接口
				if (codesData[`${dbCode}_${lang}_${this.sort}`] && this.isCache) {
					let curList = codesData[`${dbCode}_${lang}_${this.sort}`];
					this.dbCodeList = this.filterList(curList)
				} else {
          if (!this.isCache) {
            this.getSingleDBCode()
          } else {
            this.getDBCode();
            this.timer[`${dbCode}_${lang}_${this.sort}`] = setInterval(() => {
              this.callback()
            }, 300)
          }
				}
			} else {
				this.dbCodeList = this.filterList(this.code)
			}
		},
		callback() {
			let localCodes = localStorage.getItem("localCodes");
			let codesData = {};
			if (localCodes) {
				codesData = JSON.parse(localCodes);
			}
			let lang = this.tempUil ? this.tempUil : (this.root && this.root.lang ? this.root.lang : this.uil)
			// 判断缓存中是否存在此码表,存在去缓存,不存在重新拉取接口
			let dbCode = this.dbCode.toUpperCase()
			if (codesData[`${dbCode}_${lang}_${this.sort}`] && this.isCache) {
				let curList = codesData[`${dbCode}_${lang}_${this.sort}`];
				this.dbCodeList = this.filterList(curList)
				if (this.timer[`${dbCode}_${lang}_${this.sort}`]) {
					clearInterval(this.timer[`${dbCode}_${lang}_${this.sort}`])
					this.timer[`${dbCode}_${lang}_${this.sort}`] = null
				}
			}
		},
		//键盘按delete键清空内容
		deleteValue(){
			this.model = ''
			this.handleChange()
			this.$emit("change","")
		},
		formatShowLabel(item) {
			if (this.isShowKey) {
				return item.value
			}
			if (this.isShowKeyAndLabel || this.dbCode == 'ctytxt') {
				return item.value + ' - ' + item.label
			}
			return item.label
		},
		// 筛查数据
		filterList(list) {
			if (this.filterKey.length) {
				return list.filter((item) => {
					return this.filterKey.includes(item.value)
				})
			}
			if(this.expKey.length){
				return list.filter((item) => {
					return !this.expKey.includes(item.value)
				})
			}
			return list
		},
		handleChange() {
			if (!this.customModifykey) {
				// 添加isModify属性
				this.changeModify()
			}
		},
		getDBCode() {
			let lang = this.tempUil ? this.tempUil : (this.root && this.root.lang ? this.root.lang : this.uil)
			let args = {
				codeType: this.dbCode.toUpperCase(),
				uil: lang,
				sort: this.sort,
			};
			this.getDbCodeData({
				args,
				isCache: this.isCache
			})
    },
    getSingleDBCode() {
      let lang = this.root && this.root.lang ? this.root.lang : this.uil;
      let args = {
        codeType: this.dbCode.toUpperCase(),
        uil: lang,
        sort: this.sort
      };
      getSelectList(args).then(rtnmsg => {
        if (rtnmsg.respCode == SUCCESS) {
          let curList = rtnmsg.data.map(item => ({
            value: item.codeValue,
            label: item.codeName
          }));
					this.dbCodeList = this.filterList(curList);
        }
      });
    },
		handleCopy() {
			let content = this.model
			this.dbCodeList.forEach((item) => {
				if (item.value == this.model) {
					content = this.formatShowLabel(item)
				}
			})
			let aux = document.createElement('input')
			aux.setAttribute('value', content)
			document.body.appendChild(aux);
			aux.select();
			document.execCommand('copy')
			this.$message({
				message: `复制成功`,
				type: 'success',
				duration: 2000
			})
		}
	}
};
</script>

<style scoped lang="less">
.copy-icon {
	cursor: pointer;
}
</style>