<script lang="ts" setup>
import { onMounted, reactive, ref } from 'vue';
import { UtilsEChartsOption } from '@pureadmin/utils';
// import 'echarts-gl';
import { useRenderIcon } from '@/components/ReIcon/src/hooks';
import * as echarts from 'echarts';
import { useIntervalFn } from '@vueuse/core';
import dayjs from 'dayjs';
import { fetchSystemCPU } from '@/api/v1/actuator';
import SystemCardItem from '@/components/ReCol/SystemCardItem.vue';
import { message } from '@/utils/message';

const cupECharts = ref();
const myChart = ref<any>();

// 初始化ECharts
const seriesData = ref([]);
const xSeriesData = ref([]);
// 数据显示长度
const dateDisplayLength = ref(20);

const hasAuthority = ref(true);

const option = reactive<UtilsEChartsOption>({
  tooltip: {
    trigger: 'axis',
    axisPointer: { type: 'cross' },
    extraCssText: 'width: 170px',
  },
  legend: {
    top: '0%',
    left: 'center',
  },
  grid: {
    // 让图表占满容器
    top: '20px',
    right: '20px',
    bottom: '20px',
  },
  xAxis: {
    type: 'category',
    boundaryGap: false,
    inverse: true,
  },
  yAxis: {
    type: 'value',
  },
  series: [
    {
      data: seriesData.value,
      type: 'line',
      areaStyle: {},
      animationDelay: function (idx) {
        // 设置动画延迟时间
        return idx * 10;
      },
      // 设置动画持续时间
      animationDuration: 1000,
    },
  ],
  animationDuration: 666,
  animationDurationUpdate: 200,
  animationEasing: 'linear',
  animationEasingUpdate: 'linear',
});

/** 初始化数据 */
const onSearch = async () => {
  // 保留数组中的最新10条数据
  if (seriesData.value.length > dateDisplayLength.value) {
    seriesData.value = seriesData.value.slice(-dateDisplayLength.value);
    xSeriesData.value = xSeriesData.value.slice(-dateDisplayLength.value);
  }

  // 获取数据
  const result = await fetchSystemCPU();

  // 当前i请求是否可以继续
  if (result.code) {
    if (result.code == 403) {
      hasAuthority.value = false;
      message('Access Denied');
    }
    if (result.code != 200) {
      hasAuthority.value = false;
    }
  }

  const measurement = result.measurements[0];
  if (measurement) {
    const value = measurement.value;
    seriesData.value.push(value * 100);
    xSeriesData.value.push(dayjs().format('mm:ss'));
  }

  myChart.value.setOption({
    xAxis: { data: xSeriesData.value },
    series: [{ type: 'line', data: seriesData.value }],
  });
};

onMounted(() => {
  // 初始化eacharts
  myChart.value = echarts.init(cupECharts.value);
  option && myChart.value.setOption(option);

  onSearch();

  // 定时刷新，并且当前有权限才能继续请求
  useIntervalFn(() => hasAuthority.value && onSearch(), 2000);
});
</script>

<template>
  <SystemCardItem :md="24" :xl="12" title="服务CPU使用率">
    <template #icon>
      <component :is="useRenderIcon('solar:cpu-bold-duotone')" />
    </template>
    <div ref="cupECharts" style="width: 100%; height: 230px" />
  </SystemCardItem>
</template>
