<template>
  <ul class="list-unstyled fm-tree-branch">
    <li v-for="(directory, index) in subDirectories" v-bind:key="index">
      <p
        class="unselectable"
        v-bind:class="{ selected: isDirectorySelected(directory.path) }"
        v-on:click="selectDirectory(directory.path)"
      >
        <i
          class="far"
          v-if="directory.props.hasSubdirectories"
          v-on:click.stop="
            showSubdirectories(
              directory.path,
              directory.props.showSubdirectories
            )
          "
          v-bind:class="[
            arrowState(index) ? 'fa-minus-square' : 'fa-plus-square',
          ]"
        />
        <i class="fas fa-minus fa-xs" v-else />
        {{ directory.basename }}
      </p>

      <transition name="fade-tree">
        <branch
          v-show="arrowState(index)"
          v-if="directory.props.hasSubdirectories"
          v-bind:parent-id="directory.id"
        >
        </branch>
      </transition>
    </li>
  </ul>
</template>

<script>
export default {
  name: "Branch",
  props: {
    parentId: { type: Number, required: true },
  },
  computed: {
    /**
     * Subdirectories for selected parent
     * @returns {*}
     */
    subDirectories() {
      return this.$store.getters["fm/tree/directories"].filter(
        (item) => item.parentId === this.parentId
      );
    },
  },
  methods: {
    /**
     * Check, is this directory selected?
     * @param path
     * @returns {boolean}
     */
    isDirectorySelected(path) {
      return this.$store.state.fm.left.selectedDirectory === path;
    },

    /**
     * Show subdirectories - arrow
     * @returns {boolean}
     * @param index
     */
    arrowState(index) {
      return this.subDirectories[index].props.showSubdirectories;
    },

    /**
     * Show/Hide subdirectories
     * @param path
     * @param showState
     */
    showSubdirectories(path, showState) {
      if (showState) {
        // hide
        this.$store.dispatch("fm/tree/hideSubdirectories", path);
      } else {
        // show
        this.$store.dispatch("fm/tree/showSubdirectories", path);
      }
    },

    /**
     * Load selected directory and show files
     * @param path
     */
    selectDirectory(path) {
      // only if this path not selected
      if (!this.isDirectorySelected(path)) {
        this.$store.dispatch("fm/left/selectDirectory", {
          path,
          history: true,
        });
      }
    },
  },
};
</script>

<style lang="scss">
.fm-tree-branch {
  display: table;
  width: 100%;
  padding-left: 1.4rem!important;

  li > p {
    margin-bottom: 0.1rem;
    padding: 0.4rem 0.4rem;
    white-space: nowrap;
    cursor: pointer;

    &:hover,
    &.selected {
      background-color: #f8f9fa;
    }
  }

  .fas.fa-minus {
    padding-left: 0.1rem;
    padding-right: 0.6rem;
  }

  .far {
    padding-right: 0.5rem;
  }
}

.fade-tree-enter-active,
.fade-tree-leave-active {
  transition: all 0.3s ease;
}
.fade-tree-enter,
.fade-tree-leave-to {
  transform: translateX(20px);
  opacity: 0;
}
</style>