<template>
  <div class="quicklinks form-background">
    <div>
      <dl>
        <dt>{{ $t('pageOverview.quicklinks.bmcTime') }}</dt>
        <dd v-if="bmcTime" data-test-id="overviewQuickLinks-text-bmcTime">
          {{ bmcTime | formatDate }} {{ bmcTime | formatTime }}
        </dd>
        <dd v-else>--</dd>
      </dl>
    </div>
    <div>
      <dl>
        <dt>{{ $t('pageOverview.quicklinks.serverLed') }}</dt>
        <dd>
          <b-form-checkbox
            v-model="indicatorLedActiveState"
            data-test-id="overviewQuickLinks-checkbox-serverLed"
            name="check-button"
            switch
            @change="onChangeServerLed"
          >
            <span v-if="indicatorLedActiveState">
              {{ $t('global.status.on') }}
            </span>
            <span v-else>{{ $t('global.status.off') }}</span>
          </b-form-checkbox>
        </dd>
      </dl>
    </div>
    <div>
      <b-button
        to="/configuration/network-settings"
        variant="secondary"
        data-test-id="overviewQuickLinks-button-networkSettings"
        class="d-flex justify-content-between align-items-center"
      >
        {{ $t('pageOverview.quicklinks.editNetworkSettings') }}
        <icon-arrow-right />
      </b-button>
    </div>
    <div>
      <b-button
        to="/control/serial-over-lan"
        variant="secondary"
        data-test-id="overviewQuickLinks-button-solConsole"
        class="d-flex justify-content-between align-items-center"
      >
        {{ $t('pageOverview.quicklinks.solConsole') }}
        <icon-arrow-right />
      </b-button>
    </div>
  </div>
</template>

<script>
import ArrowRight16 from '@carbon/icons-vue/es/arrow--right/16';
import BVToastMixin from '@/components/Mixins/BVToastMixin';

export default {
  name: 'QuickLinks',
  components: {
    IconArrowRight: ArrowRight16,
  },
  mixins: [BVToastMixin],
  computed: {
    bmcTime() {
      return this.$store.getters['global/bmcTime'];
    },
    indicatorLedActiveState: {
      get() {
        return this.$store.getters['serverLed/getIndicatorLedActiveState'];
      },
      set(value) {
        return value;
      },
    },
  },
  created() {
    Promise.all([
      this.$store.dispatch('global/getBmcTime'),
      this.$store.dispatch('serverLed/getIndicatorLedActiveState'),
    ]).finally(() => {
      this.$root.$emit('overview-quicklinks-complete');
    });
  },
  methods: {
    onChangeServerLed(indicatorLedActiveState) {
      this.$store
        .dispatch(
          'serverLed/saveIndicatorLedActiveState',
          indicatorLedActiveState
        )
        .then((message) => this.successToast(message))
        .catch(({ message }) => this.errorToast(message));
    },
  },
};
</script>

<style lang="scss" scoped>
dd,
dl {
  margin: 0;
}

.quicklinks {
  display: grid;
  grid-gap: 1rem;
  padding: 1rem;
  white-space: nowrap;
  align-items: center;
}

@include media-breakpoint-up(sm) {
  .quicklinks {
    grid-template-columns: repeat(2, 1fr);
  }
}

@include media-breakpoint-up(xl) {
  .quicklinks {
    grid-template-columns: repeat(4, 1fr);
  }
}
</style>
