<template>
  <div class="pv">
    <div class="text_Cur">
      <div v-for="item in curList" :key="item.key">
        <div>{{ item.name }}</div>
        <div>
          <span class="mark">{{ item.value ? item.value : 0 }}</span>
          <span class="d">{{ item.d }}</span>
        </div>
      </div>
    </div>
    <div id="pv-chart"></div>
  </div>
</template>

<script>
export default {
  name: '',
  props: {
    total: {
      type: Object,
      default: () => {}
    },
    deviceInfo: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      curList: [
        {
          name: '日发电量',
          key: 'solar_elect_gen',
          lineColor: '#22E4FF',
          value: 0,
          d: 'kW·h'
        },
        {
          name: '日入网电量',
          key: 'solar_elect_grid',
          lineColor: '#0E68E4',
          value: 0,
          d: 'kW·h'
        }
      ],
      pvChart: null,
      pvChartData: {
        ydata: [],
        xdata: []
      },
      count: {
        charge: {
          cur: [1, 2]
        }
      }
    }
  },
  watch: {
    total: {
      handler(newVal, oldVal) {
        if (newVal !== oldVal) {
          let that = this
          that.curList.forEach((item) => {
            item.value = that.total[item.key]
          })
        }
      }
    },
    deviceInfo: {
      handler(newVal, oldVal) {
        if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) {
          this.$nextTick(() => {
            this.drawLineChart()
          })
        }
      },
      deep: true // 确保深度比较
    }
  },
  mounted() {},
  beforeUnmount() {
    window.removeEventListener('resize', this.handleResize)
    if (this.pvChart) {
      this.pvChart.dispose()
      this.pvChart = null
    }
  },

  methods: {
    handleResize() {
      if (this.pvChart) {
        this.pvChart.resize()
      }
    },
    processData(data, keys) {
      data.sort((a, b) => {
        return new Date(a.dt) - new Date(b.dt)
      })
      const dates = data.map((item) => item.dt)
      const values = []
      keys.forEach((item, index) => {
        values[index] = data.map((dataValue) => dataValue[keys[index]])
      })

      return {
        dates,
        values
      }
    },
    getChargeData() {
      const arr = this.curList
      const keyList = this.curList.map((item) => item.key)
      const result = this.processData(this.deviceInfo, keyList)

      this.pvChartData.xdata = result.dates
      arr.forEach((item, index) => {
        this.pvChartData.ydata[index] = {
          name: item.name,
          smooth: true,
          type: 'bar',
          barWidth: 5,
          itemStyle: {
            borderRadius: [5, 5, 0, 0],
            color: item.lineColor
          },
          emphasis: {
            focus: 'series'
          },
          global: false,
          showSymbol: false,
          data: result.values[index]
        }
      })
    },

    drawLineChart(activeKey) {
      this.getChargeData(activeKey)
      if (this.pvChart) {
        this.pvChart.dispose()
      }
      const chartDom = document.getElementById('pv-chart')
      if (!chartDom) return
      let pvChart = this.$echarts.init(chartDom)
      this.pvChart = pvChart
      const option = {
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'shadow'
          }
        },
        legend: {
          top: 20,
          textStyle: {
            color: '#fff'
          }
        },
        grid: {
          left: '3%',
          right: '4%',
          bottom: '5%',
          containLabel: true
        },
        xAxis: {
          type: 'category',
          data: this.pvChartData.xdata,
          axisLine: {
            lineStyle: { type: 'dashed', color: '#435463' }
          },
          axisLabel: {
            color: '#fff'
          }
        },
        yAxis: {
          type: 'value',
          splitLine: {
            lineStyle: { type: 'dashed', color: '#435463' }
          },
          axisLabel: {
            interval: 4,
            color: '#fff'
          }
        },
        series: this.pvChartData.ydata
      }
      option && pvChart.setOption(option)
      this.setupResizeListener()
    },
    setupResizeListener() {
      window.removeEventListener('resize', this.handleResize)
      window.addEventListener('resize', this.handleResize)
    }
  }
}
</script>

<style lang="scss" scoped>
.pv {
  height: calc(100% - 45px);

  #pv-chart {
    height: calc(100% - 45px);
  }
}

.text_Cur {
  border-bottom: 1px solid transparent;
  border-top: 1px solid transparent;
  border-image: linear-gradient(to right, transparent, #1d8a7b, transparent) 1;
  padding: 0px 15px;
  font-size: 14px;
  margin: 3px 0px;
  height: 45px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  & > div:last-child {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: end;
  }
  .mark {
    font-size: 16px;
    margin-right: 2px;
  }

  background: linear-gradient(
    90deg,
    rgba(0, 186, 173, 0.15) 0%,
    rgba(61, 254, 250, 0.15) 49.2%,
    rgba(61, 254, 250, 0) 100%
  );
  .d {
    margin-left: 1px;
    font-size: 12px;
  }
}
</style>
