<template>
    <div>
        <!--暂态事件统计 -->
        <TableHeader ref="TableHeaderRef" :showReset="false" @selectChange="selectChange" datePicker v-if="fullscreen"
            :timeKeyList="prop.timeKey"></TableHeader>
        <my-echart class="tall" :options="echartList" :style="{
            width: prop.width,
            height: `calc(${prop.height} / 2 - ${headerHeight / 2}px + ${fullscreen ? 0 : 28}px )`
        }" />
        <Table ref="tableRef" @cell-click="cellClickEvent"
            :height="`calc(${prop.height} / 2 - ${headerHeight / 2}px + ${fullscreen ? 0 : 28}px )`" isGroup></Table>
        <TransientStatisticsDetail ref="transientStatisticsDetailRef"></TransientStatisticsDetail>
    </div>
</template>
<script setup lang="ts">
import { ref, onMounted, provide, reactive, watch, h } from 'vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import MyEchart from '@/components/echarts/MyEchart.vue'
import { useConfig } from '@/stores/config'
import TransientStatisticsDetail from '@/components/cockpit/transientStatistics/components/transientStatisticsDetail.vue'
import TableHeader from '@/components/table/header/index.vue'
import { netEventEcharts } from '@/api/harmonic-boot/cockpit/cockpit'
import { getTime } from '@/utils/formatTime'

const prop = defineProps({
    w: { type: [String, Number] },
    h: { type: [String, Number] },
    width: { type: [String, Number] },
    height: { type: [String, Number] },
    timeKey: { type: Array as () => string[] },
    timeValue: { type: Object },
    interval: { type: Number }
})

const TableHeaderRef = ref()

const headerHeight = ref(57)


const selectChange = (showSelect: any, height: any, datePickerValue?: any) => {
    headerHeight.value = height

    if (datePickerValue && datePickerValue.timeValue) {
        // 更新时间参数
        tableStore.table.params.searchBeginTime = datePickerValue.timeValue[0]
        tableStore.table.params.searchEndTime = datePickerValue.timeValue[1]
    }
}

// 计算是否全屏展示
const fullscreen = computed(() => {
    const w = Number(prop.w)
    const h = Number(prop.h)
    if (!isNaN(w) && !isNaN(h) && w === 12 && h === 6) {
        // 执行相应逻辑
        return true
    } else {
        return false
    }
})
const config = useConfig()

const data = ref()

const echartList = ref()

const eventEcharts = () => {
    netEventEcharts({
        searchBeginTime: tableStore.table.params.searchBeginTime || prop.timeValue?.[0],
        searchEndTime: tableStore.table.params.searchEndTime || prop.timeValue?.[1]
    }).then(res => {
        // 整理接口数据为图表所需格式
        const rawData = res.data || {}
        data.value = [
            {
                name: '电压中断',
                value: rawData.eventOff || 0
            },
            {
                name: '电压暂降',
                value: rawData.eventDown || 0
            },
            {
                name: '电压暂升',
                value: rawData.eventUp || 0
            }
        ]

        echartList.value = {
            title: {},
            tooltip: {
                trigger: 'item'
            },
            legend: {
                orient: 'vertical',
                top: '50',
                right: '10',
                formatter: function (e: any) {
                    return e + '   ' + data.value.filter((item: any) => item.name == e)[0].value + '次'
                }
            },
            xAxis: {
                show: false
            },
            yAxis: {
                show: false
            },
            grid: {
                left: '10px',
                right: '20px'
            },
            color: ['#FF9100', '#FFBF00', config.layout.elementUiPrimary[0]],
            options: {
                dataZoom: null,
                title: [
                    {
                        text: '暂态事件统计',
                        left: 'center',
                        textStyle: {
                            color: '#000',
                            fontSize: '15'
                        },
                    },
                    {
                        text: rawData.eventOff + rawData.eventDown + rawData.eventUp + '次',
                        left: 'center',
                        top: 'center'
                    }
                ],
                series: [
                    {
                        type: 'pie',
                        center: 'center',
                        radius: ['50%', '70%'],
                        label: {
                            show: false,
                            position: 'outside'
                        },
                        name: '事件统计',
                        data: data.value
                    }
                ]
            }
        }
    })
}

const transientStatisticsDetailRef = ref()

const tableStore: any = new TableStore({
    url: '/cs-harmonic-boot/csevent/netEventTable',
    method: 'POST',

    showPage: false,

    column: [
        {
            field: 'index',
            title: '序号',
            width: '80',
            formatter: (row: any) => {
                return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
            }
        },
        {
            title: '监测点名称',
            field: 'name',
            minWidth: 150
        },
        {
            title: '设备名称', field: 'devName', minWidth: 150, align: 'center', formatter: (row: any) => {
                return row.cellValue || '/'
            }
        },
        {
            title: '项目名称', field: 'projectName', minWidth: 150, align: 'center', formatter: (row: any) => {
                return row.cellValue || '/'
            }
        },
        {
            title: '工程名称', field: 'engineeringName', minWidth: 150, align: 'center', formatter: (row: any) => {
                return row.cellValue || '/'
            }
        },

        {
            title: '电压中断(次)',
            field: 'eventOff',
            minWidth: '90',
            sortable: true,
            render: 'customTemplate',
            customTemplate: (row: any) => {
                return `<span style='cursor: pointer;text-decoration: underline;'>${row.eventOff}</span>`
            }
        },
        {
            title: '电压暂降(次)',
            field: 'eventDown',
            minWidth: '90',
            sortable: true,
            render: 'customTemplate',
            customTemplate: (row: any) => {
                return `<span style='cursor: pointer;text-decoration: underline;'>${row.eventDown}</span>`
            }
        },
        {
            title: '电压暂升(次)',
            field: 'eventUp',
            minWidth: '90',
            sortable: true,
            render: 'customTemplate',
            customTemplate: (row: any) => {
                return `<span style='cursor: pointer;text-decoration: underline;'>${row.eventUp}</span>`
            }
        }
    ],
    beforeSearchFun: () => {
        setTime()
    },
    loadCallback: () => {
        eventEcharts()
    }
})

const tableRef = ref()
provide('tableRef', tableRef)

provide('tableStore', tableStore)

// 点击行
const cellClickEvent = ({ row, column }: any) => {
    if (column.field != 'name' && column.field != 'devName' && column.field != 'projectName' && column.field != 'engineeringName') {
        transientStatisticsDetailRef.value.open(
            row,
            tableStore.table.params.searchBeginTime || prop.timeValue?.[0],
            tableStore.table.params.searchEndTime || prop.timeValue?.[1],
            column.field=='eventOff'?'中断':column.field=='eventDown'?'暂降':column.field=='eventUp'?'暂升':''

        )
    }
}

const setTime = () => {
    const time = getTime(
        (TableHeaderRef.value?.datePickerRef.interval || prop.interval) ?? 0,
        prop.timeKey,
        fullscreen.value
            ? [tableStore.table.params.searchBeginTime, tableStore.table.params.searchEndTime]
            : prop.timeValue
    )

    if (Array.isArray(time)) {
        tableStore.table.params.searchBeginTime = time[0]
        tableStore.table.params.searchEndTime = time[1]
        TableHeaderRef.value?.setInterval(time[2] - 0)
        TableHeaderRef.value?.setTimeInterval([time[0], time[1]])
    } else {
        console.warn('获取时间失败，time 不是一个有效数组')
    }
}

onMounted(() => {
    setTimeout(() => {
        tableStore.index()
    }, 200)
})
watch(
    () => prop.timeKey,
    val => {
        tableStore.index()
    }
)
watch(
    () => prop.timeValue,
    (newVal, oldVal) => {
        tableStore.index()
    },
    {
        deep: true
    }
)
</script>
<style lang="scss" scoped></style>
