<template>
  <el-time-picker
    v-model="value"
    :picker-options="config.customize.pickerOptions"
    placeholder="选择时间"
    clearable
    :class="['basic-component-time-picker', `time-picker-${config.code}`]"
    :popper-class="'basic-component-time-picker time-picker-popper-' + config.code"
    :format="config.customize.format"
    :value-format="config.customize.format"
    :default-value="value"
    @focus="focusEvent"
    @change="changeValue"
    @mouseenter.native="mouseenter"
  />
</template>

<script>
import moment from 'moment'
import cloneDeep from 'lodash/cloneDeep'
import commonMixins from 'data-room-ui/js/mixins/commonMixins'
import linkageMixins from 'data-room-ui/js/mixins/linkageMixins'
import { getDataSetDetails } from 'data-room-ui/js/api/bigScreenApi'
import { settingToTheme } from 'data-room-ui/js/utils/themeFormatting'
import { mapState } from 'vuex'
window.dataSetFields = []
export default {
  name: 'BasicComponentsTimePicker',
  components: {},
  mixins: [commonMixins, linkageMixins],
  props: {
    // 组件配置
    config: {
      type: Object,
      default: () => ({})
    }
  },
  data () {
    return {
      value: '',
      innerConfig: {}
    }
  },
  computed: {
    ...mapState({
      chartList: state => state.bigScreen.pageInfo.chartList
    }),
    isPreview () {
      return (this.$route.path === window?.BS_CONFIG?.routers?.previewUrl) || (this.$route.path === '/big-screen/preview')
    }
  },
  watch: {
    'config.customize.formatType': {
      handler (val) {
        if (val === 'timestamp') {
          this.value = new Date().getTime()
        } else if (val === 'custom') {
          const newFomat = this.config.customize.format.replace(/y/g, 'Y').replace(/d/g, 'D')
          this.value = moment(new Date()).format(newFomat)
        }
      },
      immediate: true
    },
    'config.customize.format': {
      handler (val) {
        if (this.config.customize.formatType === 'timestamp') {
          this.value = new Date().getTime()
        } else if (this.config.customize.formatType === 'custom') {
          const newFomat = val.replace(/y/g, 'Y').replace(/d/g, 'D')
          this.value = moment(new Date()).format(newFomat)
        }
      },
      immediate: true
    }
  },
  created () { },
  mounted () {
    if (!this.isPreview) {
      document.querySelector(`.time-picker-${this.config.code}`).style.pointerEvents = 'none'
    }
    if (this.value === '') {
      const newFomat = this.config.customize.format.replace(/y/g, 'Y').replace(/d/g, 'D')
      this.value = moment(new Date()).format(newFomat)
    }
    this.changeStyle(this.config)
  },
  beforeDestroy () { },
  methods: {
    dataFormatting (config, data) {
      // 数据返回成功则赋值
      if (data.success) {
        data = data.data
        // 获取到后端返回的数据,有则赋值
        if (config.dataHandler) {
          try {
            // 此处函数处理data
            eval(config.dataHandler)
          } catch (e) {
            console.info(e)
          }
        }
        config.option.data = data
        // config.customize.title = config.option.data[config.dataSource.dimensionField] || config.customize.title
        if (window.dataSetFields.length === 0) {
          getDataSetDetails(this.config.dataSource.businessKey).then(res => {
            window.dataSetFields = res.fields.map(field => {
              return {
                label: field.comment || field.fieldDesc,
                value: field.name || field.fieldName
              }
            })
          })
        }
        // 语音播报
      } else {
        // 数据返回失败则赋前端的模拟数据
        config.option.data = []
      }
      return config
    },
    changeStyle (config) {
      config = { ...this.config, ...config }
      // 样式改变时更新主题配置
      config.theme = settingToTheme(cloneDeep(config), this.customTheme)
      this.changeChartConfig(config)
      this.innerConfig = config
      // 时间选择器元素
      const timePicker = document.querySelector(`.time-picker-${config.code} .el-input__inner`)
      // 时间选择器背景颜色
      timePicker.style.backgroundColor = config.customize.backgroundColor
      // 时间选择器字体颜色
      timePicker.style.color = config.customize.fontColor
      // 时间选择器字体大小
      timePicker.style.fontSize = config.customize.fontSize + 'px'
      // 时间选择器图标
      const timePickerCloseIcon = document.querySelector(`.time-picker-${config.code} .el-input__icon`)
      if (timePickerCloseIcon) {
        timePickerCloseIcon.style.fontSize = config.customize.fontSize + 'px'
      }
    },
    // 组件联动
    changeValue (val) {
      this.linkage({ [this.config.code]: val })
    },
    focusEvent () {
      this.$nextTick(() => {
        const { code } = this.innerConfig
        const { dropDownBackgroundColor, dropDownFontColor, dropDownHoverFontColor, dropDownHoverBackgroundColor, dropDownSelectedFontColor } = this.innerConfig.customize
        const timePickerPopper = document.querySelector(`.time-picker-popper-${code}`)
        if (timePickerPopper) {
          // 去除边框
          timePickerPopper.style.border = 'none'
          // 确保下拉项的箭头颜色与下拉框的背景颜色保持一致
          timePickerPopper.style.color = dropDownBackgroundColor
        }
        // 下拉项背景颜色
        const pickerDropdownPanleContent = document.querySelector(`.time-picker-popper-${code}`)
        if (pickerDropdownPanleContent) {
          // 文字颜色
          pickerDropdownPanleContent.style.color = dropDownFontColor
          // 背景颜色
          pickerDropdownPanleContent.style.backgroundColor = dropDownBackgroundColor
          // 下拉项添加var变量
          pickerDropdownPanleContent.style.setProperty('--dropDownFontColor', dropDownFontColor)
          pickerDropdownPanleContent.style.setProperty('--dropDownHoverFontColor', dropDownHoverFontColor)
          pickerDropdownPanleContent.style.setProperty('--dropDownBackgroundColor', dropDownBackgroundColor)
          pickerDropdownPanleContent.style.setProperty('--dropDownSelectedFontColor', dropDownSelectedFontColor)
          pickerDropdownPanleContent.style.setProperty('--dropDownHoverBackgroundColor', dropDownHoverBackgroundColor)
          // 选中项字体颜色
          const selectedEl = pickerDropdownPanleContent.querySelector('.selected')
          if (selectedEl) {
            selectedEl.style.color = dropDownSelectedFontColor
          }
          // 选择过的,需要将选中颜色重置
          const pickerItemEl = document.querySelectorAll(`.time-picker-popper-${code} .el-time-spinner__item`)
          pickerItemEl.forEach((el) => {
            el.style.color = dropDownFontColor
          })
        }
      })
    },
    mouseenter () {
      if (this.value) {
        setTimeout(() => {
          // 清空图标
          const timePickerCloseIcon = document.querySelector(`.time-picker-${this.innerConfig.code} .el-icon-circle-close`)
          if (timePickerCloseIcon) {
            timePickerCloseIcon.style.fontSize = this.innerConfig.customize.fontSize + 'px'
          }
        }, 25)
      }
    }
  }

}
</script>

<style lang="scss">
.basic-component-time-picker {
  color: '';

  // 清空图标
  .el-icon-circle-close {
    width: 100% !important;
    height: 100% !important;
    display: flex !important;
    align-items: center !important;
  }

  // 时间选择器
  .el-icon-time {
    display: flex !important;
    align-items: center !important;
  }

  .el-time-spinner {
    margin-bottom: 0px !important;

    .el-time-spinner__item {
      &:hover {
        color: var(--dropDownHoverFontColor) !important;
        background-color: var(--dropDownHoverBackgroundColor) !important;
      }
    }

    .active {
      color: var(--dropDownSelectedFontColor) !important;

      &:hover {
        color: var(--dropDownSelectedFontColor) !important;
        background-color: transparent !important;
      }
    }
  }

  .el-time-panel__content::before {
    content: "";
    top: 50%;
    position: absolute;
    margin-top: -15px;
    height: 32px;
    z-index: 1;
    left: 0;
    right: 0;
    box-sizing: border-box;
    padding-top: 6px;
    text-align: left;
    border-top: 1px solid var(--dropDownFontColor);
    border-bottom: 1px solid var(--dropDownFontColor);
  }

  .popper__arrow {
    border-bottom-color: var(--dropDownBackgroundColor) !important;

    &::after {
      top: 0px !important;
      border-bottom-color: var(--dropDownBackgroundColor) !important;
    }
  }

  .cancel {
    color: var(--dropDownFontColor) !important;
  }

  .confirm {
    color: var(--dropDownSelectedFontColor);
  }

  .el-time-panel__footer {
    border-color: 1px solid var(--dropDownFontColor) !important;
  }
}
</style>

<style lang="scss" scoped>
.basic-component-time-picker {
  width: 100% !important;
  height: 100% !important;

  .el-input--mini ::v-deep .el-input__inner {
    height: 100% !important;
    line-height: 100% !important;
  }

  .el-tag.el-tag--info {
    color: var(--bs-el-text) !important;
  }

}

::v-deep .el-input__inner {
  height: 100% !important;
  line-height: 100% !important;
}
</style>