<template>
  <SmallBorder class="SmallBorder">
    <div class="go-top-alarms">
      <div class="header">
        <div class="title">
          <div class="title-text">
            <span :style="{
              color: option.titleColor,
              fontSize: option.titleSize + 'px',
              marginTop: option.paddingY + 'px',
              marginLeft: option.paddingX + 'px',
              letterSpacing: option.letterSpacing + 'px'
            }">{{ option.title }}</span>
          </div>
        </div>
        <n-dropdown v-if='option.isShowButton' trigger="hover" :options="dropdownOptions" @select="handleSelect">
          <div class="dropdown-button">
            {{ selectedOption }}
            <svg-icon icon-class="arrow-down" class="arrow-down-icon" />
          </div>
        </n-dropdown>
      </div>
      <div class="content">
        <ul>
          <li v-for="(item, index) in option.dataset" :key="index" class="alarm-item">
            <div class="item-info">
              <span class="rank" :style="{ color: option.rankColor }">
                <span class="rank-icon"></span>
                {{ item.rank }}
              </span>
              <span class="name" :style="{ color: option.nameColor }">{{ item.name }}</span>

            </div>
            <div class="item-value">
              <span class="value" :style="{ color: option.valueColor }">{{ item.value }}</span>
            </div>

            <div class="progress-bar-wrapper">
              <div class="progress-bar">
                <div class="progress" :style="{
                  width: calculateWidth(item.value),
                  background: `linear-gradient(to right, ${option.barColorStart}, ${option.barColorEnd})`
                }"></div>
              </div>
            </div>
          </li>
        </ul>
      </div>
    </div>
  </SmallBorder>

</template>

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


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

const option = computed(() => props.chartConfig.option)

const selectedOption = ref(props.chartConfig.option.dropdownDefault)

const dropdownOptions = computed(() => {
  return props.chartConfig.option.dropdownOptions.map(opt => ({
    label: opt,
    key: opt
  }))
})

const maxValue = computed(() => {
  const values = props.chartConfig.option.dataset.map(item => item.value)
  return Math.max(...values, 1) // Avoid division by zero
})

const calculateWidth = (value: number) => {
  if (maxValue.value === 0) return '0%'
  return `${(value / maxValue.value) * 80}%` // Max width 80% to leave space for value
}

const handleSelect = (key: string) => {
  selectedOption.value = key
}
</script>

<style lang="scss" scoped>
.SmallBorder {
  position: relative;
}

.go-top-alarms {
  position: absolute;
  top: 0;
  right: 0;
  width: 100%;
  height: 100%;
  margin-top: -10px;
  // background-color: #0a162b;
  padding: 15px;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  color: #fff;

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

    .title {
      display: flex;
      align-items: center;


      .title-text {
        height: 35px;
        display: flex;
        align-items: center;
        padding: 0 20px 0 20px;
        margin-left: 0px;
        clip-path: polygon(10% 0, 100% 0, 100% 100%, 0% 100%);
      }
    }

    .dropdown-button {
      height: 30px;
      padding: 0 15px;
      background-color: #034a4b;
      border: 1px solid #00e5ff;
      border-radius: 15px;
      display: flex;
      align-items: center;
      cursor: pointer;
      color: #fff;

      .arrow-down-icon {
        margin-left: 8px;
        font-size: 14px;
      }
    }
  }

  .content {
    flex: 1;
    margin-top: -15px;
    padding-right: 10px;
    font-size: 12.5px;

    ul {
      list-style: none;
      padding: 0;
      margin: 0;
      height: 100%;
      display: flex;
      flex-direction: column;
      justify-content: space-around;
    }
  }

  .alarm-item {
    display: grid;
    grid-template-columns: 1fr auto;
    grid-template-rows: auto auto;
    grid-template-areas:
      'info value'
      'bar bar';
    align-items: center;
    padding: 0 10px;
    gap: 6px 15px;

    .item-info {
      grid-area: info;
      display: flex;
      align-items: center;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;

      .rank {
        font-weight: normal;
        margin-right: 10px;
        display: flex;
        align-items: center;

        .rank-icon {
          display: inline-block;
          width: 4px;
          height: 4px;
          border-radius: 50%;
          background-color: #00e5ff;
          margin-right: 8px;
          margin-left: 6px;
          box-shadow: 0 0 6px #00e5ff;
        }
      }

      .name {
        overflow: hidden;
        text-overflow: ellipsis;
        flex-grow: 1;
      }
    }

    .item-value {
      grid-area: value;
      text-align: right;
      // font-size: 16px;
      font-weight: normal;
    }

    .progress-bar-wrapper {
      grid-area: bar;
      width: calc(100% - 60px);
      position: relative;
      left: 20px;
    }

    .progress-bar {
      width: 100%;
      height: 5px;
      border-radius: 1px;
      overflow: hidden;

      .progress {
        height: 100%;
        border-radius: 1px;
      }
    }
  }
}
</style>