<template>
  <el-card shadow="always" class="common-card-container common-card-container-body-no-padding time-range-card">
    <div slot="header" class="time-range-header">
      <span class="card-title">当日功率曲线</span>
      <date-range-select ref="dateRangeSelect" :showIcon="true" :mini-time-picker="true" @updateDate="updateDate"/>
    </div>
    <div class="card-main">
      <div id="activeChart" class="active-chart-canvas"></div>
    </div>
  </el-card>
</template>

<script>
import * as echarts from 'echarts'
import resize from '@/mixins/ems/resize'
import DateRangeSelect from '@/components/Ems/DateRangeSelect/index.vue'
import {getPointConfigCurve} from '@/api/ems/site'
import intervalUpdate from "@/mixins/ems/intervalUpdate";

export default {
  mixins: [resize, intervalUpdate],
  components: {DateRangeSelect},
  props: {
    displayData: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      chart: null,
      timeRange: [],
      siteId: '',
      isInit: true
    }
  },
  watch: {
    displayData() {
      if (this.siteId && this.timeRange.length === 2) {
        this.getGVQXData()
      }
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.initChart()
    })
  },
  beforeDestroy() {
    if (!this.chart) {
      return
    }
    this.chart.dispose()
    this.chart = null
  },
  methods: {
    // 更新时间范围 重置图表
    updateDate(data) {
      this.timeRange = data
      !this.isInit && this.getGVQXData()
      this.isInit = false
    },
    getGVQXData() {
      const {siteId, timeRange} = this
      const displayData = this.displayData || []
      const sectionRows = displayData.filter(item =>
        item && item.sectionName === '当日功率曲线' && item.useFixedDisplay !== 1 && item.dataPoint
      )
      const tasks = sectionRows.map(row => {
        const pointId = String(row.dataPoint || '').trim()
        if (!pointId) return Promise.resolve(null)
        return getPointConfigCurve({
          siteId,
          pointId,
          pointType: 'data',
          rangeType: 'custom',
          startTime: this.normalizeDateTime(timeRange[0], false),
          endTime: this.normalizeDateTime(timeRange[1], true)
        }).then(curveResponse => {
          const list = curveResponse?.data || []
          return {
            name: row.fieldName || row.fieldCode || pointId,
            data: list
              .map(item => [this.parseToTimestamp(item.dataTime), Number(item.pointValue)])
              .filter(item => item[0] && !Number.isNaN(item[1]))
          }
        }).catch(() => null)
      })
      Promise.all(tasks).then(series => {
        this.setOption((series || []).filter(Boolean))
      })
    },
    init(siteId) {
      //初始化 清空数据
      this.siteId = siteId
      this.isInit = true
      this.timeRange = []
      this.$refs.dateRangeSelect.init(true)
      this.getGVQXData()
      this.updateInterval(this.getGVQXData)
    },
    initChart() {
      this.chart = echarts.init(document.querySelector('#activeChart'))
    },
    normalizeDateTime(value, endOfDay) {
      const raw = String(value || '').trim()
      if (!raw) return ''
      if (raw.includes(' ')) return raw
      return `${raw} ${endOfDay ? '23:59:59' : '00:00:00'}`
    },
    parseToTimestamp(value) {
      if (!value) return null
      const t = new Date(value).getTime()
      return Number.isNaN(t) ? null : t
    },
    setOption(seriesData = []) {
      this.chart.setOption({
        grid: {
          containLabel: true
        },
        legend: {
          left: 'center',
          bottom: '15',
        },
        tooltip: {
          trigger: 'axis',
          axisPointer: { type: 'cross' }
        },
        textStyle: {
          color: "#333333",
        },
        xAxis: {
          type: 'time',
        },
        yAxis: [{
          type: 'value',
        }],
        series: seriesData.map((item) => {
          return {
            name: item.name,
            type: 'line',
            showSymbol: false,
            symbolSize: 2,
            smooth: true,
            areaStyle: {
              opacity: 0.5,
            },
            data: item.data
          }
        })
      })
    },

  }
}

</script>

<style scoped lang="scss">
.card-main {
  padding: 0 16px 12px;
}

.active-chart-canvas {
  height: 310px;
}
</style>
