<template>
  <div class="go-device-status">
    <div class="header">
      <div class="header-left">
        <div class="title-icon-bg" :style="{ backgroundColor: option.headerBgColor1 }">
          <svg-icon icon-class="rocket" class="title-icon" :style="{ color: option.iconColor }"></svg-icon>
        </div>
        <div class="title-text-bg" :style="{ backgroundColor: option.headerBgColor2 }">
          <span class="title-text" :style="{ color: option.titleColor, fontSize: option.titleSize + 'px' }">{{ option.title }}</span>
        </div>
      </div>
      <div class="header-right">
        <div class="legend">
          <div v-for="color in option.legendColors" :key="color" class="legend-item" :style="{ backgroundColor: color }"></div>
        </div>
      </div>
    </div>
    <div class="status-section">
      <div class="online-rate">
        <div class="rate-circle-bg">
          <div
            class="rate-circle"
            :style="{ background: `conic-gradient(${option.progressColor} 0% ${option.onlineRate}%, ${option.progressBgColor} ${option.onlineRate}% 100%)` }"
          >
            <div class="rate-text-wrapper">
              <span class="rate-text" :style="{ color: option.progressColor }">{{ option.onlineRate }}</span>
              <span class="rate-percent" :style="{ color: option.progressColor }">%</span>
            </div>
          </div>
        </div>
        <span class="rate-label">设备在线率</span>
      </div>
      <div class="progress-bar-wrapper">
        <div class="progress-bar" :style="{ backgroundColor: option.progressBgColor }">
          <div class="progress" :style="{ width: option.onlineRate + '%', backgroundColor: option.progressColor }"></div>
        </div>
      </div>
      <div class="device-count">
        <span class="online">{{ option.onlineDevice }}</span>
        <span class="total">/ {{ option.totalDevice }}</span>
      </div>
    </div>
    <div class="table-header" :style="{ backgroundColor: option.headerBackgroundColor, height: option.headerHeight + 'px' }">
      <div v-for="header in option.header" :key="header" class="header-item" :style="{ color: option.headerTextColor, fontSize: option.fontSize + 'px' }">
        {{ header }}
      </div>
      <div class="header-item"></div>
    </div>
    <div class="table-body">
      <div v-for="(item, index) in option.dataset" :key="index" class="table-row" :style="{ backgroundColor: option.itemBackgroundColor, height: option.itemHeight + 'px' }">
        <div class="row-item" :style="{ color: option.textColor, fontSize: option.fontSize + 'px' }">{{ item.enterprise }}</div>
        <div class="row-item" :style="{ color: option.textColor, fontSize: option.fontSize + 'px' }">{{ item.deviceType }}</div>
        <div class="row-item" :style="{ color: option.textColor, fontSize: option.fontSize + 'px' }">{{ item.deviceName }}</div>
        <div class="row-item time-wrapper">
          <div class="time" :style="{ backgroundColor: option.timeBgColor, color: option.timeTextColor, fontSize: option.fontSize + 'px' }">
            {{ item.time }}
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { PropType, computed } from 'vue'
import { option as configOption } from './config'

const props = defineProps({
  chartConfig: {
    type: Object as PropType<{ option: typeof configOption }>,
    required: true
  }
})

const option = computed(() => props.chartConfig.option)
</script>

<style lang="scss" scoped>
.go-device-status {
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  background-color: #041126;
  color: #ffffff;
  padding: 15px;
  box-sizing: border-box;

  .header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 10px;

    .header-left {
      display: flex;
      align-items: center;
      .title-icon-bg {
        width: 50px;
        height: 40px;
        display: flex;
        align-items: center;
        justify-content: center;
        clip-path: polygon(0 0, 80% 0, 100% 100%, 0% 100%);
        .title-icon {
          font-size: 28px;
        }
      }
      .title-text-bg {
        height: 40px;
        padding: 0 20px 0 30px;
        margin-left: -10px;
        display: flex;
        align-items: center;
        justify-content: center;
        clip-path: polygon(0 0, 95% 0, 100% 100%, 5% 100%);
        .title-text {
          text-shadow: 0 0 10px rgba(180, 228, 255, 0.8);
        }
      }
    }

    .header-right {
      display: flex;
      align-items: center;
      .legend {
        display: flex;
        margin-right: 10px;
        .legend-item {
          width: 15px;
          height: 8px;
          margin-left: 5px;
        }
      }
    }
  }

  .status-section {
    display: flex;
    align-items: center;
    margin-bottom: 15px;
    padding: 0 10px;
    .online-rate {
      display: flex;
      align-items: center;
      margin-right: 15px;
      .rate-circle-bg {
        position: relative;
        width: 60px;
        height: 60px;
        display: flex;
        justify-content: center;
        align-items: center;
        &::after {
          content: '';
          position: absolute;
          top: -5px;
          left: -5px;
          right: -5px;
          bottom: -5px;
          border-radius: 50%;
          filter: blur(5px);
          background: radial-gradient(circle, rgba(0, 229, 255, 0.5), transparent 70%);
        }
      }
      .rate-circle {
        width: 60px;
        height: 60px;
        border-radius: 50%;
        display: flex;
        justify-content: center;
        align-items: center;
        position: relative;
        z-index: 1;
        &::before {
          content: '';
          width: 48px;
          height: 48px;
          background-color: #041126;
          border-radius: 50%;
        }
        .rate-text-wrapper {
          position: absolute;
          .rate-text {
            font-size: 24px;
            font-weight: bold;
          }
          .rate-percent {
            font-size: 14px;
            margin-left: 2px;
          }
        }
      }
      .rate-label {
        font-size: 16px;
        margin-left: 10px;
      }
    }
    .progress-bar-wrapper {
      flex: 1;
    }
    .progress-bar {
      width: 100%;
      height: 12px;
      border-radius: 6px;
      overflow: hidden;
      .progress {
        height: 100%;
        border-radius: 6px;
      }
    }
    .device-count {
      font-size: 20px;
      margin-left: 15px;
      .online {
        color: #00e5ff;
      }
      .total {
        color: #ffffff;
      }
    }
  }

  .table-header {
    display: flex;
    align-items: center;
    padding: 0 10px;
    border-radius: 5px;
    .header-item {
      text-align: left;
      padding-left: 10px;
      &:nth-child(1) { flex: 2; }
      &:nth-child(2) { flex: 2; }
      &:nth-child(3) { flex: 3; }
      &:nth-child(4) { flex: 1; }
    }
  }

  .table-body {
    flex: 1;
    overflow-y: auto;
    margin-top: 5px;
    .table-row {
      display: flex;
      align-items: center;
      padding: 0 10px;
      margin-bottom: 5px;
      border-radius: 5px;
      &:last-child {
        border-bottom: none;
      }
      .row-item {
        text-align: left;
        padding-left: 10px;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        &:nth-child(1) { flex: 2; }
        &:nth-child(2) { flex: 2; }
        &:nth-child(3) { flex: 3; }
      }
      .time-wrapper {
        flex: 1;
        display: flex;
        justify-content: flex-end;
        padding-right: 10px;
        .time {
          padding: 2px 8px;
          border-radius: 5px;
        }
      }
    }
  }
}
</style>
