<template>
  <div id="detail_filtre">
<!--    <button id="effacerFiltres" v-on:click="effacer_Filtres"></button>-->
    <span id="effacerFiltres" v-bind:class="darktheme ? 'effacerFiltresDark' : 'effacerFiltres'" v-on:click="effacer_Filtres"></span>
    <div id="filtresChoisis" v-for="(index) in filtres_Choisis" :key="index.filtre">
      <span :id="JSON.stringify(index.filtre)" class="filtreChoisi"> {{affichageTag(index)}}
        <button class="supprimerFiltre" v-on:click="supprimer($event, index)"></button></span>
      <b-popover v-if="index.type === 'tags libres'" :target="JSON.stringify(index.filtre)" triggers="hover" placement="rightbottom">
        <p>{{ index.filtre }}</p>
      </b-popover>
    </div>
  </div>
</template>

<script>
export default {
  name: "Detail_Filtre",
  props: {
    // Variable de stockage des nouveaux filtres
    nouveau_filtre: {},
    // Signal de deconnexion
    deconnexion: {},
    // Signal d'activation ou non du theme sombre
    darktheme: {},
  },
  methods: {
    /**
     * @vuese
     * Supprimer un filtre (en l'enlevant de l'array filtres_choisis)
     */
    supprimer: function (e, index) {
      e.target.parentElement.remove()
      this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre !== index)
      // On transmet la liste des filtres maj (à destination finale de Volet_Base, pour mise à jour des contenus)
      this.$emit("filtresChoisis", {filtres: this.filtres_Choisis})

    },
    /**
     * @vuese
     * Dégage tous les filtres choisis
     */
    effacer_Filtres: function () {
      this.filtres_Choisis = []
      // On transmet la liste des filtres maj (à destination finale de Volet_Base, pour mise à jour des contenus)
      this.$emit("filtresChoisis", {filtres: this.filtres_Choisis})
    },
    /**
     * @vuese
     * Le filtre date n'étant présent (au maximum) qu'en un seul exemplaire à chaque fois, une fonction pour le supprimer de la liste (pour le remettre par la suite)
     */
    changer_filtre_date: function() {
      this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'date')
    },
    /**
     * @vuese
     * Permet de détecter un éventuel doublon dans les filtres (ce qu'on veut éviter)
     */
    filtreDejaPresent: function(nomFiltre) {
      return this.filtres_Choisis.filter(filtre => filtre.filtre === nomFiltre).length > 0
    },
    /**
     * @vuese
     * Il n'est pas possible de cumuler plusieurs filtres de note qui se gêneraient, donc une fonction pour gérer ça
     * Si on ajoute un filtre Borne -> on supprime les filtres noteMin et noteMax
     * Et inversement, si on ajoute un filtre min ou max, on supprime l'éventuel filtre borne
     */
    gererFiltreNote: function (typeFiltre) {
      switch(typeFiltre){
        case "noteMin":
          this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteMin')
          this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteBorne')
          break
        case "noteMax":
          this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteMax')
          this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteBorne')
          break
        case "noteBorne":
          this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteMin')
          this.filtres_Choisis = this.filtres_Choisis.filter(filtre => filtre.type !== 'noteMax')
          break
        default:
          break
      }
    },
    /**
     * @vuese
     * Permet le raffinage de l'affichage si on a un tag libre
     */
    affichageTag: function (index) {
      if(index.type ==='tags libres'){
        if(index.filtre.lastIndexOf("/") !== -1)
          return index.filtre.substring(index.filtre.lastIndexOf("/") + 1)
      }
      return index.filtre
    }
  },
  watch: {
    /**
     * @vuese
     * Fonction de traitement dès qu'on réceptionne un nouveau filtre
     */
    nouveau_filtre: function(newVal) { // watch it

      if (newVal.filtre.filtre.length === 0){
        return
      }

      if (this.filtres_Choisis.length > 0){
        if (this.filtreDejaPresent(newVal.filtre.filtre)){
          return
        }

        else if(newVal.filtre.type === 'date'){
          this.changer_filtre_date()
          if (newVal.filtre.filtre === "Toutes les périodes"){
            return
          }
        } else if (newVal.filtre.type === "noteMin" || newVal.filtre.type === "noteMax" || newVal.filtre.type === "noteBorne"){
          this.gererFiltreNote(newVal.filtre.type)
        }
      }
      this.filtres_Choisis.push(newVal.filtre)
      // si les écueils ci dessus sont évités, on ajoute le filtre et on envoie l'array maj à Volet_Base, qui gère l'affichage des contenus
      this.$emit("filtresChoisis", {filtres: this.filtres_Choisis})

    },
    /**
     * @vuese
     * A la deconnexion, on vide les filtres
     */
    deconnexion: function () {
      this.filtres_Choisis = []
    }
  }
  ,  data: function () {
    return {
      filtres_Choisis: [],
    }
  }
}
// <span class="filtreChoisi">' + e.target.innerText + '<button class="supprimerFiltre"></button></span>

</script>

<style scoped>

.supprimerFiltre {
  background: white url(../assets/img/croix.png);
  background-size: cover;
  border: none;
}

#detail_filtre {
  display: flex;
  flex-direction: row;
  padding: 1px;
  margin: 1px;
  flex-flow: wrap;
}

.filtreChoisi{
  padding: 1px;
  border: 1px solid black;
  display: inline-flex;
  margin: 1px;
  align-items: center;
}

.effacerFiltres::before {
  height: 15px;
  width: 15px;
  margin: 5px 2px 2px;
  content: "\01F9F9";
}

.effacerFiltresDark::before {
  height: 15px;
  width: 15px;
  margin: 5px 2px 2px;
  content: "\01F9F9";
  color: transparent;
  text-shadow: 0 0 0 white;
}

</style>