<template>
  <div style='width:100%;height:100%;'>
    <div :id="elId"
         :style='style'></div>
      <jsoneditor
                  v-model='jsoneditorVisible'
                  :elInfo='elInfo'
                  :complatData='complatData'
                  :initStyle='initStyle'
                  :layout='layout'
                  :jsoneditorCloseAfter='jsoneditorCloseAfter'
                  :jsoneditorOpenAfter='jsoneditorOpenAfter'
                  >
      </jsoneditor>

  </div>

</template>
<script>
import uuidv1 from 'uuid/v1'
import jsoneditor from '../common/jsoneditor'
import mockData from '../common/initDbConfigDataJson'
import ucComponent from '../ucClass/uc_component'
import echartResize from './echartResize'
export default {
  mixins: [ucComponent, echartResize],
  components: {
    jsoneditor
  },
  name: 'hsGantt',
  props: {
    elInfo: {
      type: Object,
      default() {
        return {}
      }
    },
    height: {// 图表高度
      type: String,
      default: '100%'
    },
    width: {// 图表宽度
      type: String,
      default: '100%'
    },
    allSourceData: {
      type: Object,
      default() {
        return {}
      }
    },

    initStyle: {
      type: Object,
      default() {
        return {}
      }
    },
    complatData: {
      type: Array,
      default() {
        return []
      }
    },
    mock: {
      type: Boolean,
      default: false
    },
    echartType: {
      type: String,
      default: 'hsLineBar'
    },
    layout: {},
    jsoneditorCloseAfter: {
      type: Function
    },
    jsoneditorOpenAfter: {
      type: Function
    }
  },
  watch: {
    allSourceData: {
      handler: function(newVal, oldVal) {
        const { config, sourceData } = newVal
        if (config && sourceData) {
          this.drowEchart(newVal)
        } else {
          this.initMockData()
        }
      },
      deep: true
    },
    editData: {
      handler: function(newVal, oldVal) {
        this.jsoneditorData = newVal
      },
      deep: true
    }
  },
  computed: {
    style() {
      return {
        height: this.height,
        width: this.width
      }
    }
  },
  data() {
    return {
      elId: '',
      chart: null,
      jsoneditorVisible: false, // 是否显示动态配置的弹框
      itemLabel: {
        color: 'white',
        fontSize: 14,
        position: 'top',
        show: true,
        formatter: '{a}:{c}'
      },
      editData: {
        config: {},
        sourceData: [],
        sql: ''
      },
      jsoneditorData: {}
    }
  },
  created() {
    this.elId = uuidv1() // 获取随机id
  },

  mounted() {
    this.initMockData()
  },
  methods: {
    initMockData() {
      if (this.mock) {
        switch (this.echartType) {
          case 'hsLineBar':
            this.initMockLineBar()
            break
          // 加载lineBar的模拟数据
          case 'hsPie':
            break
          default:
            this.initMockLineBar()
        }
      } else {
        this.initMockLineBar(this.elInfo.el)
      }
    },
    // 折线图的模拟数据
    initMockLineBar(type) {
      const mockData_ = mockData[type]
      const data = {
        config: mockData_.config,
        sourceData: mockData_.sourceData
      }
      this.editData.config = mockData_.config
      this.editData.sourceData = mockData_.sourceData
      this.editData.sql = mockData_.sql
      this.drowEchart(data)
    },
    drowEchart(data) {
      const source = JSON.parse(JSON.stringify(data))
      if (!source.sourceData.length) return
      this.editData.config = source.config
      this.editData.sourceData = source.sourceData
      this.editData.sql = source.sql
      const { config, sourceData } = JSON.parse(JSON.stringify(data))
      if (!Object.keys(config).length) return
      this.dealWithSource(config, sourceData)
      this.draw_complate_options(config)
    },
    // 传入完整的配置
    draw_complate_options(options) {
      // 重新绘制的情况
      if (this.chart) {
        this.chart.setOption(options, true)
        return
      }
      this.chart = this.drawEcharts(this.elId, options)
      // 新增双击事件
      this.chart.on('dblclick', (parm) => {
        this.$emit('echartDbClick', parm)
      })
      // 单击事件
      this.chart.on('click', (parm) => {
        this.$emit('echartClick', parm)
      })
    },
    // 处理配置和原始数据
    dealWithSource(config, sourceData) {
      if (this.elInfo.el === 'hsLineBar') {
        return this.dealWithSource_lineBar(config, sourceData)
      } else if (this.elInfo.el === 'hsPie') {
        return this.dealWithSource_pie(config, sourceData)
      } else if (this.elInfo.el === 'hsRadar') {
        return this.dealWithSource_radar(config, sourceData)
      }
    },
    // 处理配置和原始数据
    dealWithSource_lineBar(config, sourceData) {
      const isTransverse = config.isTransverse
      const series = config.series
      if (!series) {
        return
      }
      series.forEach(item => {
        const targetList = sourceData.filter(jtem => {
          return jtem.sSeries === item.name
        })
        const seriesData = []
        const xData = []
        targetList.forEach(ftem => {
          seriesData.push(ftem.dValue)
          xData.push(ftem.sName)
        })
        item.data = seriesData
        item.xData = xData
        // 支持渐变色
        if (item.itemStyle && item.itemStyle.hsColor) {
          var flage = false
          if (isTransverse) {
            flage = true
          }
          item.itemStyle.color = new this.$echarts.graphic.LinearGradient(
            flage ? 1 : 0, 0, 0, flage ? 0 : 1,
            [
              { offset: 0, color: item.itemStyle.hsColor[0] },
              { offset: 1, color: item.itemStyle.hsColor[1] }
            ]
          )
        }
        // 支持区域填充样式。
        if (item.areaStyle && item.areaStyle.hsColor) {
          item.areaStyle.color = new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
            { offset: 0, color: item.areaStyle.hsColor[0] },
            { offset: 1, color: item.areaStyle.hsColor[1] }
          ])
        }
        // 这里显示showValue
        if (!item.label) {
          item.label = this.itemLabel
        }
        item.label.formatter = function(params) {
          const { seriesName, data, name } = params
          const target = sourceData.find(jtem => {
            return jtem.sSeries === seriesName && jtem.dValue === data && jtem.sName === name
          })
          return target.sShowValue
        }
      })
      // 如果要横向显示的话 就得设置yAxis
      if (config.isTransverse) {
        config.yAxis[0].data = series[0].xData
      } else {
        config.xAxis.data = series[0].xData
      }
      return config
    },
    // 处理配置和原始数据
    dealWithSource_pie(config, sourceData) {
      const series = config.series
      if (!series) {
        return
      }
      const legendDatas = []
      series.forEach(item => {
        const targetList = sourceData.filter(jtem => {
          return jtem.sSeries === item.name
        })

        const seriesData = []
        targetList.forEach(ftem => {
          seriesData.push({ value: ftem.dValue, name: ftem.sName })
          legendDatas.push(ftem.sName)
        })
        item.data = seriesData
      })
      config.legend.data = legendDatas
      return config
    },
    dealWithSource_radar(config, sourceData) {
      const series = config.series
      if (!series) {
        return
      }
      series.forEach(item => {
        const targetList = sourceData.filter(jtem => {
          return jtem.sSeries === item.name
        })
        const seriesData = []
        targetList.forEach(ftem => {
          seriesData.push(ftem.dValue)
        })
        item.data = seriesData
      })
      return config
    }

  }
}
</script>