<template>
   <div id="workEditor" class="my-4">
      <div id="title" class="action-row">
         <div>
            <p class="wl-item social-issues">
               <span class="chill-entity entity-social-issue">
                  <span class="badge bg-chill-l-gray text-dark">{{ work.socialAction.issue.text }}</span>
               </span>
            </p>
         </div>
         <h2 class="badge-title">
            <span class="title_label">Action</span>
            <span class="title_action">{{ work.socialAction.text }}</span>
         </h2>
      </div>

      <div id="startDate" class="action-row">
         <label class="col-form-label col-sm-4">{{ $t('startDate') }}</label>
         <input v-model="startDate" type="date" required="true" class="form-control" v-once/>
      </div>

      <div id="endDate" class="action-row">
         <label class="col-form-label col-sm-4">{{ $t('endDate') }}</label>
         <input v-model="endDate" type="date" class="form-control" />
      </div>

      <div id="comment" class="action-row">
         <label>{{ $t('comments') }}</label>
         <ckeditor
            v-model="note"
            :editor="editor"
            tag-name="textarea"
         ></ckeditor>
      </div>

      <div id="objectives" class="action-row">
         <div aria="hidden" class="title">
            <div><h3>{{ $t('goals_title') }}</h3></div>
            <div><h3>{{ $t('results_title') }}</h3></div>
         </div>

         <!-- results which are not attached to an objective -->
         <div v-if="hasResultsForAction">
            <div class="results_without_objective">
               {{ $t('results_without_objective') }}
            </div>
            <div>
               <add-result :availableResults="resultsForAction" destination="action"></add-result>
            </div>
         </div>

         <!-- results which **are** attached to an objective -->
         <div v-for="g in goalsPicked" :key="g.id">
               <div class="item-title" @click="removeGoal(g)">
                  <span>{{ g.goal.title.fr }}</span>
               </div>
            <div>
               <add-result :goal="g.goal" destination="goal"></add-result>
            </div>
         </div>
         <div class="accordion" id="expandedSuggestions">
            <div v-if="availableForCheckGoal.length > 0" class="accordion-item">
               <h2 class="accordion-header" id="heading_expanded_suggestions">

                  <button v-if="isExpanded"
                     class="accordion-button"
                     type="button"
                     data-bs-toggle="collapse"
                     aria-expanded="true"
                     @click="toggleSelect">
                     Masquer
                  </button>

                  <button v-else
                     class="accordion-button collapsed"
                     type="button"
                     data-bs-toggle="collapse"
                     aria-expanded="false"
                     @click="toggleSelect">
                     Motifs, objectifs et dispositfs disponibles
                  </button>

               </h2>
               <div class="accordion-collapse" id="collapse_expanded_suggestions"
                  aria-labelledby="heading_expanded_suggestions" data-bs-parent="#expandedSuggestions">

                  <template v-if="isExpanded">
                     <ul class="list-suggest add-items">
                        <li v-for="g in availableForCheckGoal" @click="addGoal(g)" :key="g.id">
                           <span>{{ g.title.fr }}</span>
                        </li>
                     </ul>
                  </template>

               </div>
               <p v-if="goalsPicked.length ===0" class="chill-no-data-statement">
                  Aucun objectif associé
               </p>
            </div>
            <div v-else>
               <span class="chill-no-data-statement">{{ $t('no_goals_available') }}</span>
            </div>
         </div>
      </div>

      <div id="evaluations" class="action-row">
         <div aria="hidden" class="title">
            <div><h3>{{ $t('Evaluations') }} - {{ $t('Forms') }} - {{ $t('Post') }}</h3></div>
         </div>

         <!-- list evaluations -->
         <add-evaluation
            v-for="e in pickedEvaluations"
            v-bind:key="e.key"
            v-bind:evaluation="e">
         </add-evaluation>

         <!-- box to add new evaluation -->
         <div class="add_evaluation">
            <div v-if="showAddEvaluation">
               <p>{{ $t('available_evaluations_text') }}</p>
               <ul class="list-suggest add-items">
                  <li v-for="e in evaluationsForAction" @click="addEvaluation(e)" :key="e.id">
                     <span>{{ e.title.fr }}</span>
                  </li>
               </ul>
            </div>
            <ul class="record_actions" v-if="evaluationsForAction.length > 0">
               <li>
                  <button :title="$t('add_an_evaluation')" class="btn btn-create" @click="toggleAddEvaluation"></button>
               </li>
            </ul>
            <div v-else>
               <span class="chill-no-data-statement">{{ $t('no_evaluations_available') }}</span>
            </div>
         </div>
      </div>

      <div id="persons" class="action-row">
         <h3>{{ $t('persons_involved') }}</h3>

         <ul class="list-unstyled">
            <li v-for="p in personsReachables" :key="p.id">
               <input v-model="personsPicked" :value="p.id" type="checkbox" class="me-2">
               <person-render-box render="badge" :options="{}" :person="p"></person-render-box>
            </li>
         </ul>
      </div>

      <div id="handlingThirdParty" class="action-row">
         <h3>{{ $t('handling_thirdparty') }}</h3>

         <div v-if="!hasHandlingThirdParty">
            <p class="chill-no-data-statement">
               {{ $t('no_handling_thirdparty') }}
            </p>

            <ul class="record_actions">
               <li>
                  <add-persons
                     ref="handlingThirdPartyPicker"
                     v-bind:key="handlingThirdPartyPicker.key"
                     v-bind:buttonTitle="$t('precise_handling_thirdparty')"
                     v-bind:modalTitle="$t('choose_a_thirdparty')"
                     v-bind:options="handlingThirdPartyPicker.options"
                     @addNewPersons="setHandlingThirdParty"> <!-- to cast child method -->
                  </add-persons>
               </li>
            </ul>
         </div>
         <div v-else class="flex-table">
               <third-party-render-box
                  :thirdparty="handlingThirdParty"
                  :options="{
                     addLink: false,
                     addId: false,
                     addEntity: true,
                     addInfo: false,
                     hLevel: 3,
                     isMultiline: true,
                     isConfidential: false
                     }"></third-party-render-box>
            <ul class="record_actions">
               <li>
                  <button :title="$t('remove_handling_thirdparty')" class="btn btn-remove" @click="removeHandlingThirdParty"/>
               </li>
            </ul>
         </div>

      </div>

      <div id="thirdParties" class="action-row">
         <h3>{{ $t('thirdparty_intervener') }}</h3>

         <div v-if="!hasThirdParties">
            <p class="chill-no-data-statement">{{ $t('no_thirdparty_intervener') }}</p>
         </div>

         <div v-else>
            <div class="flex-bloc mb-3">
                  <third-party-render-box
                     v-for="thirdparty in thirdParties"
                     :key="thirdparty.id"
                     :thirdparty="thirdparty"
                     :options="{ addLink : false, addId : false, addEntity: true, addInfo: false, hLevel: 3 }"
                     >
                     <template v-slot:record-actions>
                        <ul class="record_actions">
                           <li><on-the-fly :type="thirdparty.type" :id="thirdparty.id" action="show"></on-the-fly></li>
                           <li><on-the-fly :type="thirdparty.type" :id="thirdparty.id" action="edit" @saveFormOnTheFly="saveFormOnTheFly"></on-the-fly></li>
                           <li>
                              <button :title="$t('remove_thirdparty')" class="btn btn-sm btn-remove" @click="removeThirdParty(thirdparty)" />
                           </li>
                        </ul>
                     </template>
                  </third-party-render-box>
            </div>
         </div>

         <ul class="record_actions">
            <li>
               <add-persons
                  ref="thirdPartyPicker"
                  v-bind:key="thirdPartyPicker.key"
                  v-bind:buttonTitle="$t('add_thirdparties')"
                  v-bind:modalTitle="$t('choose_thirdparties')"
                  v-bind:options="thirdPartyPicker.options"
                  @addNewPersons="addThirdParties"> <!-- to cast child method -->
               </add-persons>
            </li>
         </ul>
      </div>

   <div>
      <pick-template
         entityClass="Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork"
         :templates="this.templatesAvailablesForAction"
         :entityId="work.id"
         :beforeMove="beforeGenerateTemplate">
      <template v-slot:title>
         <h3>{{ $t('Generate doc') }}</h3>
      </template>
      </pick-template>
   </div>

      <div v-if="errors.length > 0" id="errors" class="alert alert-danger flashbag">
         <p>{{ $t('fix_these_errors') }}</p>
         <ul>
            <li v-for="e in errors" :key="e.id">{{ e }}</li>
         </ul>
      </div>

   </div>
   <ul class="record_actions sticky-form-buttons">

      <li v-if="!isPosting">
         <button class="btn btn-save" @click="submit">
            {{ $t('action.save') }}
         </button>
      </li>

      <li v-if="isPosting">
         <button class="btn btn-save" disabled>
            {{ $t('action.save') }}
         </button>
      </li>

   </ul>
</template>

<script>
import {mapState, mapGetters,} from 'vuex';
import {dateToISO, ISOToDate, ISOToDatetime} from 'ChillMainAssets/chill/js/date.js';
import CKEditor from '@ckeditor/ckeditor5-vue';
import ClassicEditor from 'ChillMainAssets/module/ckeditor5/index.js';
import AddResult from './components/AddResult.vue';
import AddEvaluation from './components/AddEvaluation.vue';
import PersonRenderBox from 'ChillPersonAssets/vuejs/_components/Entity/PersonRenderBox.vue';
import AddPersons from 'ChillPersonAssets/vuejs/_components/AddPersons.vue';
import AddressRenderBox from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue';
import ThirdPartyRenderBox from 'ChillThirdPartyAssets/vuejs/_components/Entity/ThirdPartyRenderBox.vue';
import PickTemplate from 'ChillDocGeneratorAssets/vuejs/_components/PickTemplate.vue';
import OnTheFly from 'ChillMainAssets/vuejs/OnTheFly/components/OnTheFly.vue';

const i18n = {
   messages: {
      fr: {
         action_title: "Action d'accompagnement",
         comments: "Commentaire",
         startDate: "Date de début",
         endDate: "Date de fin",
         goals_title: "Motifs - objectifs - dispositifs",
         available_goals_text: "Motifs, objectifs et dispositifs disponibles pour ajout :",
         results_title: "Orientations - résultats",
         results_without_objective: "Résultats - orientations sans objectifs",
         add_objectif: "Ajouter un motif - objectif - dispositif",
         add_an_objective: "Ajouter un objectif",
         Evaluations: "Évaluations",
         Forms: "Formulaires",
         Post: "Courriers",
         add_an_evaluation: "Ajouter une évaluation",
         persons_involved: "Usagers concernés",
         handling_thirdparty: "Tiers traitant",
         no_handling_thirdparty: "Aucun tiers traitant",
         precise_handling_thirdparty: "Indiquer un tiers traitant",
         choose_a_thirdparty: "Choisir un tiers",
         remove_thirdparty: "Enlever le tiers",
         remove_handling_thirdparty: "Enlever le tiers traitant",
         thirdparty_intervener: "Tiers intervenants",
         no_thirdparty_intervener: "Aucun tiers intervenant",
         add_thirdparties: "Ajouter des tiers",
         choose_thirdparties: "Choisir des tiers",
         fix_these_errors: "Veuillez corriger les erreurs suivantes :",
         available_evaluations_text: "Évaluations disponibles pour ajout :",
         no_evaluations_available: "Aucune évaluation disponible",
         no_goals_available: "Aucun objectif disponible",
      }
   }
};

export default {
   name: 'App',
   components: {
      ckeditor: CKEditor.component,
      AddResult,
      AddEvaluation,
      AddPersons,
      PersonRenderBox,
      AddressRenderBox,
      PickTemplate,
      ThirdPartyRenderBox,
      OnTheFly
   },
   i18n,
   data() {
      return {
         isExpanded: false,
         editor: ClassicEditor,
         showAddObjective: false,
         showAddEvaluation: false,
         handlingThirdPartyPicker: {
            key: 'handling-third-party',
            options: {
               type: ['thirdparty'],
               priority: null,
               uniq: true,
               button: {
                  display: false
               }
            },
         },
         thirdPartyPicker: {
            key: 'third-party',
            options: {
               type: ['thirdparty'],
               priority: null,
               uniq: false,
               button: {
                  display: false
               }
            },
         }
      };
   },
   computed: {
      ...mapState([
         'work',
         'resultsForAction',
         'evaluationsForAction',
         'goalsPicked',
         'personsReachables',
         'handlingThirdParty',
         'thirdParties',
         'isPosting',
         'errors',
         'templatesAvailablesForAction',
      ]),
      ...mapGetters([
         'hasResultsForAction',
         'hasHandlingThirdParty',
         'hasThirdParties',
      ]),
      startDate: {
         get() {
            return dateToISO(this.$store.state.startDate);
         },
         set(v) {
            this.$store.commit('setStartDate', ISOToDate(v));
         }
      },
      endDate: {
         get() {
            return dateToISO(this.$store.state.endDate);
         },
         set(v) {
            this.$store.commit('setEndDate', ISOToDate(v));
         }
      },
      note: {
         get() {
            return this.$store.state.note;
         },
         set(v) {
            this.$store.commit('setNote', v);
         }
      },
      availableForCheckGoal() {
         let pickedIds = this.$store.state.goalsPicked.map(g => g.goal.id);

         return this.$store.state.goalsForAction.filter(g => !pickedIds.includes(g.id));
      },
      pickedEvaluations() {
         return this.$store.state.evaluationsPicked;
      },
      personsPicked: {
         get() {
            let s = this.$store.state.personsPicked.map(p => p.id);

            return s;
         },
         set(v) {
            this.$store.commit('setPersonsPickedIds', v);
         }
      },
   },
   methods: {
      toggleSelect() {
         this.isExpanded = !this.isExpanded;
      },
      addGoal(g) {

         this.$store.commit('addGoal', g);
      },
      removeGoal(g) {

         this.$store.commit('removeGoal', g);
      },
      addEvaluation(e) {
         this.$store.dispatch('addEvaluation', e);
      },
      toggleAddEvaluation() {
         this.showAddEvaluation = !this.showAddEvaluation;
      },
      setHandlingThirdParty({selected, modal}) {
         this.$store.commit('setHandlingThirdParty', selected.shift().result);
         this.$refs.handlingThirdPartyPicker.resetSearch();
         modal.showModal = false;
      },
      removeHandlingThirdParty() {
         this.$store.commit('setHandlingThirdParty', null);
      },
      addThirdParties({selected, modal}) {
         this.$store.commit('addThirdParties', selected.map(r => r.result));
         this.$refs.thirdPartyPicker.resetSearch();
         modal.showModal = false;
      },
      removeThirdParty(t) {
         this.$store.commit('removeThirdParty', t);
      },
      submit() {
         this.$store.dispatch('submit');
      },
      beforeGenerateTemplate() {
         console.log('before generate');
         return Promise.resolve();
      },
      saveFormOnTheFly(payload) {
         console.log('saveFormOnTheFly: type', payload.type, ', data', payload.data);
         payload.target = 'resource';
         this.$store.dispatch('patchOnTheFly', payload)
            .catch(({name, violations}) => {
               if (name === 'ValidationException' || name === 'AccessException') {
                  violations.forEach((violation) => this.$toast.open({message: violation}));
               } else {
                  this.$toast.open({message: 'An error occurred'})
               }
            });
      }
   }
};

</script>

<style lang="scss">
@import '~ChillMainAssets/module/bootstrap/shared';
@import '~ChillMainAssets/chill/scss/mixins';

div#workEditor {
   display: grid;
   grid-template-columns: 50%;
   column-gap: 0rem;
   grid-template-areas:
      "title title"
      "startDate endDate"
      "comment comment"
      "objectives objectives"
      "evaluations evaluations"
      "persons persons"
      "handling handling"
      "tparties tparties"
      "errors errors";

   #title {
      grid-area: title; }
   #startDate {
      grid-area: startDate; }
   #endDate {
      grid-area: endDate; }
   #comment {
      grid-area: comment; }
   #objectives {
      grid-area: objectives; }
   #evaluations {
      grid-area: evaluations; }
   #persons {
      grid-area: persons; }
   #handlingThirdParty {
      grid-area: handling; }
   #thirdParties {
      grid-area: tparties; }
   #errors {
      grid-area: errors; }

   div.action-row {
      @include border-collapse;
      padding: 1em;

      &#title {
         label {
            margin-bottom: 0;
         }
         p {
            margin-top: 0;
            font-weight: bold;
            font-size: 1rem;
         }
      }

      &#objectives {
         & > div {
            display: grid;
            grid-template-columns: 50%;
            column-gap: 0rem;
            grid-template-areas: "obj res";

            & > div {
               @include border-collapse;
               padding: 1em;

               &:nth-child(1) {
                  grid-area: obj; }

               &:nth-child(2) {
                  grid-area: res; }
            }

            & > div.results_without_objective {
               background: repeating-linear-gradient(
                     45deg,
                     $gray-200,
                     $gray-200 10px,
                     $gray-100 10px,
                     $gray-100 20px
               );
               text-align: center;
               font-weight: 700;
               padding-top: 1.5rem;
            }
         }
      }

      &#evaluations {
         & > div {
            @include border-collapse;
            padding: 1em;
         }
      }

      &#objectives,
      &#evaluations {
         padding: 0;

         & > div.title {
            background-color: $gray-200;
            color: $gray-700;

            h3 {
               text-align: center;
            }
         }

         .item-title {
            font-weight: bold;
         }
         .item-details {
            margin: 1em 2em;
            font-size: 85%;
         }

         i.fa {
            padding: 0.25rem;
            color: $white;

            &.fa-times { color: $red; }
         }
      }

      &#persons {
         margin-top: 1.5em;
      }

      ul.record_actions {
         margin-bottom: 0;
      }
   }

   div#errors {
      &.alert {
         margin-top: 2em;
      }
   }
}

.accordion-item:first-of-type, .accordion-item:last-of-type {
   border-radius: 0rem;
   border: 0px;
   .accordion-button {
      padding: .25rem;
      border: 1px solid rgba(17, 17, 17, 0.125);
      margin-top: 20px;
      margin-bottom: 20px;
   }
}


</style>
