/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

<template>
  <RkEcharts ref="chart" :option="option" :autoResize="true"/>
</template>
<script lang="ts">
import { Vue, Component, Prop } from 'vue-property-decorator';

@Component
export default class ChartLine extends Vue {
    @Prop() private data!: any;
    @Prop() private intervalTime!: any;
    public resize() {
      const chart: any = this.$refs.chart;
      chart.myChart.resize();
    }
  get option() {
    const temp: any = [];
    const keys = Object.keys(this.data || {}).filter((i: any) => Array.isArray(this.data[i]) && this.data[i].length);
    keys.forEach((i: any, index: number) => {
      const serie: any = {
          data: this.data[i].map((item: any, itemIndex: number) => [
            this.intervalTime[itemIndex],
            item,
          ]),
          name: i,
          type: 'line',
          symbol: 'none',
          barMaxWidth: 10,
          lineStyle: {
            width: 1.5,
            type: keys.length !== 5 ? 'solid' : 'dotted',
          },
      };
      if (keys.length === 2) {
        serie.areaStyle = {};
      }
      temp.push(serie);
    });
    let color: string[] = [];
    switch (keys.length) {
      case 2:
      color = [
        '#a3a0e6',
        '#a0b1e6',
      ];
      break;
      case 1:
      color = [
        '#3f96e3',
      ];
      break;
      default:
        color = [
          '#6be6c1',
          '#626c91',
          '#a0a7e6',
          '#96dee8',
          '#3f96e3',
        ];
        break;
    }
    return {
      color,
      tooltip: {
        trigger: 'axis',
        backgroundColor: 'rgb(50,50,50)',
        textStyle: {
          fontSize: 13,
        },
      },
      legend: {
        show: keys.length === 1 ? false : true,
        icon: 'circle',
        top: 0,
        left: 0,
        itemWidth: 12,
      },
      grid: {
        top: keys.length === 1 ? 15 : 55,
        left: 0,
        right: 10,
        bottom: 5,
        containLabel: true,
      },
      xAxis: {
        type: 'category',
        axisTick: {
          lineStyle: { color: '#c1c5ca41' },
          alignWithLabel: true,
        },
        splitLine: { show: false },
        axisLine: { lineStyle: { color: 'rgba(0,0,0,0)' } },
        axisLabel: { color: '#9da5b2', fontSize: '11' },
      },
      yAxis: {
        type: 'value',
        axisLine: { show: false },
        axisTick: { show: false },
        splitLine: { lineStyle: { color: '#c1c5ca41', type: 'dashed' } },
        axisLabel: { color: '#9da5b2', fontSize: '11' },
      },
      series: temp,
    };
  }
}
</script>
