<template>
  <div>
    <!-- 暂无数据 -->
    <div
      :style="{ height: chartHeight + 'px' }"
      v-show="this.chartMsg.series.length === 0"
    >
      <div
        class="no-data-bg"
        style="position: relative; left: 50%; transform: translateX(-50%)"
      ></div>
    </div>
    <!-- 图例 -->
    <div v-show="this.chartMsg.series.length > 0">
      <div class="legend">
        <span class="item" v-for="item in legendList" :key="item.id">
          <span
            v-if="item.type === 1"
            class="block"
            :style="{ backgroundColor: item.color }"
          ></span>
          <span
            v-if="item.type === 2"
            class="line"
            :style="{ backgroundColor: item.color }"
          >
            <span
              class="line-block"
              :style="{ backgroundColor: item.color }"
            ></span>
          </span>
          {{ item.name }}</span
        >
      </div>
      <div
        :id="chartId"
        :style="{ width: '100%', height: chartHeight + 'px' }"
      ></div>
    </div>
  </div>
</template>
<script>
import * as echarts from "echarts";
import { debounce } from "@/utils/debounce";
export default {
  name: "bmLineBar",
  data() {
    return {
      myChart: "",
      option: {
        color: [],
        // color: ["#8EF0AB", "#63BDFF", "#288AFF"],
        grid: {
          left: 70,
          right: 10,
          bottom: 30,
          top: 30,
        },
        tooltip: {
          trigger: "axis",
          axisPointer: {
            // type: "cross",
            crossStyle: {
              color: "rgba(237,237,237,0.5)",
            },
          },
          formatter: function (params) {
            var res = `<span style='color:rgba(0,0,0,0.8)'>${params[0].axisValueLabel}</span>`;
            for (var i = 0, l = params.length; i < l; i++) {
              res +=
                "<br/>" +
                `${
                  params[i].seriesType === "line"
                    ? '<img width="10" height="10" style="margin-right:4px;" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTIuNzIxNjM5NXB4IiBoZWlnaHQ9IjhweCIgdmlld0JveD0iMCAwIDEyLjcyMTYzOTUgOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT7nvJbnu4QgNjwvdGl0bGU+CiAgICA8ZyBpZD0iMDTmiqXooajnrqHnkIYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLmjIfmoIflrozmiJDmg4XlhrUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDUxLjYzOTE4MCwgLTQyNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9Iue8lue7hC025aSH5Lu9LTQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwMjEuNTAwMDAwLCAzNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0i57yW57uELTYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI5LjUwMDAwMCwgNzguMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9oiIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0Ij48L3JlY3Q+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuMTM5MTgwMjYsMyBDOS4wMDMxMDczNywzIDEwLjU2OTI2NzMsNC4yNzQ4OTI3MiAxMS4wMTMyMjU0LDYuMDAwMjQzNDcgTDEyLjM2MDgxOTcsNiBDMTIuOTEzMTA0NSw2IDEzLjM2MDgxOTcsNi40NDc3MTUyNSAxMy4zNjA4MTk3LDcgQzEzLjM2MDgxOTcsNy41NTIyODQ3NSAxMi45MTMxMDQ1LDggMTIuMzYwODE5Nyw4IEwxMS4wMTI5NjY3LDguMDAwNzYxMzQgQzEwLjU2ODY1OTIsOS43MjU2MDIyNCA5LjAwMjc0NTUxLDExIDcuMTM5MTgwMjYsMTEgQzUuMjc1NjE1MDEsMTEgMy43MDk3MDEzMSw5LjcyNTYwMjI0IDMuMjY1MzkzNzgsOC4wMDA3NjEzNCBMMS42MzkxODAyNiw4IEMxLjA4Njg5NTUxLDggMC42MzkxODAyNTgsNy41NTIyODQ3NSAwLjYzOTE4MDI1OCw3IEMwLjYzOTE4MDI1OCw2LjQ0NzcxNTI1IDEuMDg2ODk1NTEsNiAxLjYzOTE4MDI2LDYgTDMuMjY1MTM1MDksNi4wMDAyNDM0NyBDMy43MDkwOTMyLDQuMjc0ODkyNzIgNS4yNzUyNTMxNSwzIDcuMTM5MTgwMjYsMyBaIiBpZD0i5b2i54q257uT5ZCIIiBmaWxsPSIjRkZDRTZBIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+" />'
                    : `<span style="display:inline-block;margin-right:4px;border-radius:2px;width:10px;height:10px;background-color:${params[i].color}"></span>`
                }` +
                `<span style='display:inline-block;width:150px;color:rgba(0,0,0,0.8);font-size:14px;'>${params[i].seriesName}</span>` +
                `<span style='color:rgba(0,0,0,0.48);font-size:14px;'>${
                  params[i].name === "%"
                    ? (params[i].value ? params[i].value.toFixed(2) : 0.0) +
                      params[i].name
                    : String(params[i].value).replace(
                        /\B(?=(\d{3})+(?!\d))/g,
                        ","
                      )
                }</span>`;
            }
            return res;
          },
          // formatter: function (params) {
          //   console.log(params);
          //   var res = `<span style='color:rgba(0,0,0,0.8)'>${params[0].axisValueLabel}</span>`;
          //   for (var i = 0, l = params.length; i < l; i++) {
          //     res +=
          //       "<br/>" +
          //       `<span style='display:inline-block;margin-right:4px;border-radius:2px;width:10px;height:10px;background-color:${params[i].color}'></span>` +
          //       `<span style='display:inline-block;width:150px;color:rgba(0,0,0,0.8);font-size:14px;'>${params[i].seriesName}</span>` +
          //       `<span style='color:rgba(0,0,0,0.48);font-size:14px;'>${
          //         params[i].name === "%"
          //           ? (params[i].value ? params[i].value.toFixed(2) : 0.0) +
          //             params[i].name
          //           : params[i].value
          //       }</span>`;
          //   }
          //   return res;
          // },
        },
        xAxis: {
          type: "category",
          data: [],
          axisTick: {
            show: false,
          },
          axisPointer: {
            type: "shadow",
          },
        },
        yAxis: {
          type: "value",
          name: "",
          nameTextStyle: {
            fontSize: 12,
            align: "right",
          },
          axisLabel: {},
        },
        series: [],
      },
    };
  },
  props: {
    chartHeight: {
      type: Number,
      default: 300,
    },
    legendList: {
      type: Array,
      default: () => [],
    },
    chartMsg: {
      type: Object,
      default: () => {},
    },
    chartId: {
      type: String,
      default: "bmChart",
    },
    chartNum: {
      type: Number,
      default: 1,
    },
  },
  watch: {
    chartHeight: {
      handler(newVal) {
        this.chartHeight = newVal;
      },
    },
    chartNum(val) {
      this.canvasReset();
    },
    chartMsg: {
      handler(newVal) {
        this.canvasReset();
      },
      deep: true,
    },
  },
  mounted() {
    this.canvasReset();
  },
  methods: {
    canvasReset() {
      debounce(() => {
        this.getMes();
      }, 500)();
    },
    getMes() {
      if (this.myChart) {
        this.myChart.dispose();
      }
      var chartDom = document.getElementById(this.chartId);
      this.myChart = echarts.init(chartDom);
      this.option.color = this.chartMsg.color;
      this.option.xAxis.data = this.chartMsg.xData;
      this.option.yAxis.name = this.chartMsg.yName;
      if (
        this.chartMsg.series.length > 0 &&
        this.chartMsg.series[0].data[0].name === "%"
      ) {
        this.option.yAxis.axisLabel = {
          formatter: function (value) {
            return value + ".00%";
          },
        };
      } else {
        this.option.yAxis.axisLabel = {
          formatter: function (value) {
            return value;
          },
        };
      }
      // this.option.yAxis.axisLabel = this.chartMsg.yAxisLabel;
      this.option.series = this.chartMsg.series;
      this.myChart.setOption(this.option);
    },
  },
};
</script>
<style lang="scss" scoped>
.legend {
  position: absolute;
  right: 10px;
  top: 15px;
  .item {
    display: inline-block;
    margin-right: 10px;
    font-size: 14px;
    color: #8c8c8c;
    .block {
      width: 10px;
      height: 10px;
      display: inline-block;
      margin-right: 4px;
    }
    .line {
      width: 10px;
      height: 10px;
      border-radius: 5px;
      display: inline-block;
      margin-right: 4px;
      position: relative;
      .line-block {
        position: absolute;
        width: 20px;
        height: 2px;
        left: -5px;
        top: 4px;
      }
    }
  }
}
</style>
