<!--
Menu principal de l'application
Prend en paramètre une liste de ItemMenu et les met en forme
-->

<template>
  <v-navigation-drawer
      v-model="displayMenu"
      :rail="isRail"
      :disable-resize-watcher="true"
      class="theme-secondary main-menu"
  >
    <template #prepend>
      <slot name="title"></slot>
    </template>

    <v-list
        open-strategy="single"
        active-class="active"
        class="left-menu"
    >
      <!-- TODO: que se passe-t-il si le menu ne comprend qu'un seul MenuItem? -->
      <div v-for="(item, i) in items" :key="i">

        <!-- Cas 1 : l'item n'a pas d'enfants, c'est un lien -->
        <v-list-item
          v-if="!item.children"
          :title="$t(item.label)"
          :prepend-icon="item.icon.name"
          :href="!isInternalLink(item) ? item.to : undefined"
          :to="isInternalLink(item) ? item.to : undefined"
          exact
          height="48px"
        />

        <!-- Cas 2 : l'item a des enfants, c'est un groupe -->
        <v-list-group
          v-else
          expand-icon="fas fa-angle-down"
          collapse-icon="fas fa-angle-up"
        >
          <template #activator="{ props }">
            <v-list-item
                v-bind="props"
                :prepend-icon="item.icon.name"
                :title="$t(item.label)"
                class="theme-secondary"
                height="48px"
            />
          </template>

          <v-list-item
            v-for="child in item.children"
            :key="$t(child.label)"
            :title="$t(child.label)"
            :prepend-icon="child.icon.name"
            :href="!isInternalLink(child) ? child.to : undefined"
            :to="isInternalLink(child) ? child.to : undefined"
            exact
            height="48px"
            class="theme-secondary-alt"
          />
        </v-list-group>
      </div>
    </v-list>

    <template #append>
      <slot name="foot"></slot>
    </template>
  </v-navigation-drawer>

</template>

<script setup lang="ts">
import {useMenu} from "~/composables/layout/useMenu";
import {computed} from "@vue/reactivity";
import { useDisplay } from 'vuetify'
import { MenuGroup, MenuItem } from "~/types/layout";

const { getMenu, hasMenu, isInternalLink, setMenuState, isMenuOpened } = useMenu()

const { mdAndUp, lgAndUp } = useDisplay()

const menu = getMenu('Main')

const isOpened = computed(() => isMenuOpened('Main'))

let items: Array<MenuGroup | MenuItem>
if (menu === null) {
  items = []
} else if (menu.hasOwnProperty('children')) {
  items = (menu as MenuGroup).children ?? []
} else {
  items = [menu]
}

// En vue lg+, on affiche toujours le menu
const displayMenu = computed(() => {
  return menu !== null && hasMenu('Main') && (lgAndUp.value || isOpened.value)
})

// En vue md+, fermer le menu le passe simplement en mode rail
// Sinon, le fermer le masque complètement
const isRail = computed(() => {
  return menu !== null && mdAndUp.value && !isOpened.value && !items.some((item) => item.expanded)
})

const unwatch = watch(lgAndUp, (newValue, oldValue) => {
// Par défaut si l'écran est trop petit au chargement de la page, le menu doit rester fermé.
  if (process.client && menu !== null) {
    setMenuState('Main', lgAndUp.value)
  }
})

onUnmounted(() => {
  unwatch()
})
</script>

<style scoped lang="scss">

  .v-list-item {
    min-height: 10px !important;
  }

  :deep(.v-list-item-title),
  :deep(.v-icon),
  {
    font-size: 14px;
    color: rgb(var(--v-theme-on-secondary));
  }

  .v-list-item__prepend {
    margin: 10px 0;
    margin-right: 10px !important;
  }

  .v-application--is-ltr .v-list-group--no-action > .v-list-group__header {
    margin-left: 0;
    padding-left: 0;
  }
  .v-application--is-ltr .v-list-group--no-action > .v-list-group__items > .v-list-item {
    padding-left: 30px;
  }

  .v-list-item__content {
    padding: 8px 0;
  }

  .v-list-group__items .v-list-item {
    padding-inline-start: 30px !important;
  }

  .v-list-group--no-action > .v-list-group__header,
  .v-list-item
  {
    border-left:3px solid rgb(var(--v-theme-secondary));
    height: 48px;
  }

  .v-list-item:hover,
  .v-list-item.active,
  :deep(.v-list-group__items .v-list-item)
  {
    border-left: 3px solid rgb(var(--v-theme-primary));
    background-color: rgb(var(--v-theme-secondary-alt)) !important;
    color: rgb(var(--v-theme-on-secondary-alt)) !important;
  }

  :deep(.v-list-group__items .v-list-item-title) {
    color: rgb(var(--v-theme-on-secondary-alt));
  }

  :deep(.v-list-group__items .v-icon) {
    color: rgb(var(--v-theme-on-secondary-alt));
  }

  :deep(.v-list-item .v-icon) {
    margin-right: 10px;
  }

</style>
