<script>

import { mapActions, mapState } from 'pinia'
import { ConcernementsStore } from '@stores/concernements'
import { CommonStore } from '@/stores/common'

import { print } from 'graphql/language/printer'
import gql from 'graphql-tag'
import GQL from '@api/graphql-axios'
import EntiteFields from '@api/gql/entite.fragment.gql'

import SvgIcon from '@jamescoyle/vue-icon';
import { mdiArrowUp } from '@mdi/js';

import TerrainDeVie from '@components/contents/TerrainDeVie.vue';
import PuissanceAgir from '@components/contents/PuissanceAgir.vue';
import Doleancer from '@components/contents/Doleancer.vue';

export default {
  props: ['cid', 'eid'],
  data(){
    return {
      entite: null,
      superposition_id: null,
      opened_besoin_id: null,
      arrowup_path: mdiArrowUp
    }
  },
  computed: {
    ...mapState(ConcernementsStore,['map_mode',
                                    'opened_concernement',
                                    'concernements_loaded',
                                    'allSuperpositions_byid']),
    ...mapState(CommonStore,['cartouch_width']),
    // superposition_id () {
    //   console.log('superposition_id computed');
    //   if(this.$route.query.superposition_id){
    //     return this.$route.query.superposition_id
    //   } else {
    //     return null;
    //   }
    // },
    superposition () {
      console.log('superposition computed', this.superposition_id);
      if(this.superposition_id){
        let sid = this.$route.query.superposition_id;
        let ids = sid.match(/(\d+)_(\d+)__(\d+)_(\d+)/i)
        let couple_key = `${ids[1]}-${ids[3]}`
        console.log('superposition_id', sid, couple_key, ids);
        if (this.allSuperpositions_byid[couple_key][sid]) {
          let s = this.allSuperpositions_byid[couple_key][sid]
          console.log(s); 
          return s;
        }else{
          return null;
        }
      } else {
        return null;
      }
    },
    superposed_cid_eid () {
      if (this.superposition) {
        let r = null;
        this.superposition.forEach(s => {
          if(this.opened_concernement && s.cid !== this.opened_concernement.id){
            r = {
              cid: s.cid,
              eid: s.eid
            }
          }
        });
        console.log('superposed_cid_eid', r);
        return r;
      } else {
        return null
      }
      
    }
  },
  created () {
    console.log(`Concernement view created, id: ${this.cid}, eid: ${this.eid}, opened_concernement:${this.opened_concernement}`);
    console.log('Concernement view created, allSuperpositions_byid', this.allSuperpositions_byid);
    console.log("superposition", this.superposition);

    if(this.map_mode === "superposition" && this.$route.query.superposition_id){
      this.superposition_id = this.$route.query.superposition_id;
      // as we have two content to show multiply the cartouch with by 2
      // necessary for mapitem opening scale and position
      this.setCartoucheWidth(2)
    }else{
      // as we have one content to show multiply the cartouch with by 1
      // necessary for mapitem opening scale and position
      this.setCartoucheWidth(1)
    }

    // when we arrived directly to the url, load the entite
    // this.eid provided by route params
    if (!this.entity && this.eid) {
      this.openEntity();
    }
  },
  watch: {
    concernements_loaded: {
      handler (n, o){
        // console.log(`watch concernements_loaded n: ${n}, opened_concernement:${this.opened_concernement}, id:${this.id}`);
        // when we arrived directly to the url then all concernement are loaded: do open the concernement
        if (!this.opened_concernement) {
          this.openCloseConcernements(parseInt(this.cid))
        }
      },
      deep: true
    },
    eid: {
      handler (n, o){
        if(n){
          this.openEntity()
        }else{
          this.entite = false;
          this.setOpenedEntityId(null);
        }
      },
      deep: true
    }
  },
  methods: {
    ...mapActions(ConcernementsStore,['openCloseConcernements',
                                      'setOpenedEntityId',
                                      'setMapMode',
                                      'resetConcernementOpened']),
    ...mapActions(CommonStore,['setCartoucheWidth']),
    openEntity(){
      this.setOpenedEntityId(parseInt(this.eid))
      this.loadEntite()
    },
    loadEntite(){
      const ast = gql`{
        entite (id: ${this.eid}) {
          ...EntiteFields
        }
      }
      ${EntiteFields}
      `
      console.log('ast', ast);
      GQL.post('', { query: print(ast) })
        .then(({data: { data: { entite }}}) => {
          console.log('load entite loaded', entite)
          this.entite = entite
        })
        .catch(error => {
          console.warn('Issue with load entite', error)
        })
    },
    closeConcernement(){
      this.resetConcernementOpened();
    }
  },
  components: {
    TerrainDeVie,
    PuissanceAgir,
    Doleancer,
    SvgIcon
  }
}

</script>

<template>
  <section v-if="opened_concernement" class="concernement">
    <TerrainDeVie v-if="map_mode === 'terraindevie' || map_mode === 'action'|| map_mode === 'superposition'" :cid="cid" :eid="eid" :entite="entite"/>
    <PuissanceAgir v-if="map_mode === 'puissancedagir'" :id="cid"/>
    <Doleancer v-if="map_mode === 'doleancer'" :id="cid"/>
  </section>
  <section v-if="map_mode === 'superposition' && superposition && superposed_cid_eid" class="concernement clone">
    <TerrainDeVie :cid="superposed_cid_eid.cid" :eid="superposed_cid_eid.eid" />
  </section>
  <nav class="close-concernement" @click="closeConcernement">
    <svg class="close-btn" viewbox="0 0 24 24" width="24" height="24" style="--sx: 1; --sy: 1; --r: 0deg;">
      <mask id="arrowMask">
        <rect x="0" y="0" width="24" height="24" fill="white"/>
        <path :d="arrowup_path" fill="black"/>
      </mask>
      <circle cx="12" cy="12" r="12" mask="url(#arrowMask)" fill="white" />
    </svg> 
  </nav>
</template>

<style lang="scss" scoped>
  nav.close-concernement{
    position: absolute;
    top:65px;
    left: -30px;
    cursor: pointer;
  }
</style>
