<template>
  <div class="AiDvRender" style="width: 100%; height: 100%;">
    <ai-dv-display v-if="data.type === 'display'" :title="data.title" :list="values"></ai-dv-display>
    <ai-dv-panel
        style="height: 100%; width: 100%;"
        v-if="data.type !== 'display'"
        :title="data.title"
        :border="data.border || ''">
      <AiDvSummary v-if="data.type === 'summary'" :summaryTitle="data.summaryTitle" :key="`summary${index}`" :type="data.display" :data="values"/>
      <AiSwiper v-else-if="data.type === 'swiper'" :heigth="'100%'" :data="values"/>
      <dv-scroll-board
          v-if="data.type === 'table'"
          :class="'dvScrollBoard' + theme"
          :config="formatTable(values, data.isShowIndex, data.rowNum)"
          :key="data.height"
          :theme="theme"
          :style="{height: data.height + 'px', width: '100%'}"/>
      <ai-echart v-else-if="/Chart/.test(data.type)"
                 style="height: 100%; width: 100%;"
                 :ref="'chart' + index"
                 :key="`chart${index}`"
                 :theme="theme"
                 :data="values"
                 :ops="chartList[data.config]"/>
      <ai-map v-else-if="data.type=='map'" :mask="data.mask === '1'" :areaId="data.areaId || user.info.areaId" :is3d="data.is3d==1"
              :map-style="`amap://styles/${data.mapStyle}`" :pulseLines="data.pulseLines==1" :map.sync="map" :lib.sync="lib" :onlyShowArea="data.limitArea==1"/>
      <ai-monitor :src="data.src" v-else-if="data.type === 'monitor'" :type="data.monitorType"/>
      <video style="width: 100%; height: 100%; object-fit: fill;" loop :src="data.src" autoplay v-else-if="data.type === 'video'"/>
      <AiDvPartyOrg style="width: 100%; height: 100%;" v-else-if="data.type === 'partyOrg'" :instance="instance"/>
      <!-- <ai-sprite v-else-if="/building/.test(data.type)" v-bind="data" is3D @init="mods[data.type]"/> -->
    </ai-dv-panel>
  </div>
</template>

<script>
import {mapState} from 'vuex'
import AiSwiper from './AiSwiper.vue'
import chartList from './AiEchart/echartTpls'
import AiMonitor from "./AiMonitor/AiMonitor";
import AiDvPanel from "./layout/AiDvPanel/AiDvPanel";
import AiDvDisplay from "./layout/AiDvDisplay/AiDvDisplay";
import AiDvSummary from "./layout/AiDvSummary/AiDvSummary";
import AiSprite from "./AiSprite";


export default {
  name: 'AiDvRender',
  props: ['data', 'index', 'theme', 'instance'],
  components: {
    // AiSprite,
    AiDvSummary,
    AiDvDisplay,
    AiDvPanel,
    AiMonitor,
    AiSwiper
  },
  data() {
    return {
      // mods,
      chartList,
      map: null,
      lib: null,
      timer: null
    }
  },
  computed: {
    ...mapState(['user']),
    values() {
      if (!this.data) {
        return []
      }
      return this.data.type === 'map' ? this.data[this.data.dataType].map(e => {
        return {lng: e['经度'], lat: e['纬度'], label: e['地区名称'], ...e}
      }) : this.data[this.data.dataType]
    },
    currentType: v => v.data.type
  },
  watch: {
    data: {
      immediate: true,
      deep: true, handler() {
        if (this.currentType == 'map') {
          this.renderMap()
        }
      }
    }
  },
  methods: {
    formatTable(data, isShowIndex, rowNum) {
      if (!data.length) {
        return {
          header: [],
          data: []
        }
      }
      let rows = []
      const header = data.map(v => {
        return v[Object.keys(v)[0]]
      })
      Object.keys(data[0]).forEach((item, index) => {
        if (index !== 0) {
          rows.push(item)
        }
      })
      return {
        header: header,
        data: rows.map(item => {
          return data.map(v => {
            return v[item]
          })
        }),
        headerBGC: 'transparent',
        evenRowBGC: 'transparent',
        oddRowBGC: 'rgba(0, 133, 255, 0.2)',
        headerHeight: 42,
        rowNum: rowNum || 7,
        index: isShowIndex === '1',
        waitTime: 8000,
        carousel: 'page',
        indexHeader: '排名',
        align: ['center', 'center', 'center', 'center', 'center']
      }
    },
    renderMap(count = 0) {
      let {lib: AMap, map} = this
      this.timer && clearInterval(this.timer)
      if (AMap) {
        let infoWin = new AMap.InfoWindow({content: ""})
        map.clearMap()
        this.values.filter(e => e.lng).map(e => {
          return new AMap.Marker({
            map,
            content: e.content || `<div class="marker ${this.data.alwaysShow ? 'showLabel' : ''}">
                        <img src="${e.icon}"/>
                        <span>${e.label}</span>
                      </div>`,
            position: [e.lng, e.lat]
          }).on('click', () => {
            if (!!e.openWin || e.infoWindowHtml) {
              map.clearInfoWindow()
              infoWin.setContent(e.infoWindowHtml ||
                  [`<div class="infoWin">`,
                    `<b>${e.label}</b>`,
                    '</div>'
                  ].join('')
              )
              infoWin.open(map, [e.lng, e.lat])
            }
          })
        })
        this.data.is3d && map.setPitch(65)
        if (this.data.is3dAround == 1) {
          this.timer = setInterval(() => map?.setRotation(360, false, 16000))
        }
      } else if (count < 10) {
        console.log("正在加载...%s", count)
        setTimeout(() => this.renderMap(++count), 1000)
      }
    }
  },
  mounted() {
    if (this.data.type == 'map') {
      this.renderMap()
    } else if (this.data.type == 'table') {
      this.$injectLib("https://cdn.cunwuyun.cn/datav.map.vue.js")
    }
  }
}
</script>

<style lang="scss" scoped>
.AiDvRender {
  ::v-deep .dvScrollBoard1 {

    .header {
      background: rgba(0, 0, 0, 0.1) !important;

      .header-item {
        color: #FFBB73 !important;
        font-size: 16px !important;
        font-weight: 600;
      }
    }


    .rows {
      font-size: 16px;
      font-weight: 600;
      color: #FFFFFF;
      line-height: 21px;
      text-shadow: 0px 2px 4px rgba(117, 9, 9, 0.5);
      background: linear-gradient(180deg, #FFF6C7 0%, #FF9A02 100%);
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;

      & > div:nth-of-type(2n - 1) {
        background-color: transparent !important;
      }

      & > div:nth-of-type(2n) {
        background-color: rgba(0, 0, 0, 0.1) !important;
      }

      .index {
        color: #fff;
        text-shadow: none;
        background: #BD4921 !important;
        -webkit-background-clip: inherit;
        -webkit-text-fill-color: #fff;
      }
    }
  }


  ::v-deep .marker {
    position: relative;

    & > img {
      width: 50px;
      height: 50px;
    }

    & > span {
      display: none;
    }

    &:hover > span, &.showLabel > span {
      position: absolute;
      left: 50%;
      bottom: 0;
      transform: translate(-50%, 100%);
      display: block;
      color: #fff;
      font-size: 14px;
      white-space: nowrap;
    }
  }
}
</style>
