<template>
  <div>
    <SidebarApplication
      ref="sidebarApplication"
      :workspace="workspace"
      :application="application"
      @selected="selected"
    >
      <template #context>
        <li
          v-if="
            $hasPermission(
              'application.update',
              application,
              application.workspace.id
            )
          "
          class="context__menu-item"
        >
          <a class="context__menu-item-link" @click="settingsClicked">
            <i class="context__menu-item-icon iconoir-settings"></i>
            {{ $t('sidebarComponentBuilder.settings') }}
          </a>
        </li>
      </template>
      <template v-if="isAppSelected(application)" #body>
        <ul class="tree__subs">
          <SidebarItemBuilder
            v-for="page in orderedPages"
            :key="page.id"
            v-sortable="{
              id: page.id,
              update: orderPages,
              marginLeft: 34,
              marginRight: 10,
              marginTop: -1.5,
              enabled: $hasPermission(
                'builder.order_pages',
                application,
                application.workspace.id
              ),
            }"
            :builder="application"
            :page="page"
          ></SidebarItemBuilder>
        </ul>
        <ul v-if="pendingJobs.length" class="tree__subs">
          <component
            :is="getPendingJobComponent(job)"
            v-for="job in pendingJobs"
            :key="job.id"
            :job="job"
          >
          </component>
        </ul>
        <a
          v-if="
            $hasPermission(
              'builder.create_page',
              application,
              application.workspace.id
            )
          "
          class="tree__sub-add"
          @click="$refs.createPageModal.show()"
        >
          <i class="iconoir-plus"></i>
          {{ $t('sidebarComponentBuilder.createPage') }}
        </a>
        <CreatePageModal
          ref="createPageModal"
          :builder="application"
          :workspace="application.workspace"
        ></CreatePageModal>
      </template>
    </SidebarApplication>
    <BuilderSettingsModal ref="builderSettingsModal" :builder="application" />
  </div>
</template>

<script>
import SidebarApplication from '@baserow/modules/core/components/sidebar/SidebarApplication'
import BuilderSettingsModal from '@baserow/modules/builder/components/settings/BuilderSettingsModal'
import { mapGetters } from 'vuex'
import { notifyIf } from '@baserow/modules/core/utils/error'
import SidebarItemBuilder from '@baserow/modules/builder/components/sidebar/SidebarItemBuilder'
import CreatePageModal from '@baserow/modules/builder/components/page/CreatePageModal'

export default {
  name: 'TemplateSidebar',
  components: {
    CreatePageModal,
    SidebarItemBuilder,
    BuilderSettingsModal,
    SidebarApplication,
  },
  props: {
    application: {
      type: Object,
      required: true,
    },
    workspace: {
      type: Object,
      required: true,
    },
  },
  computed: {
    ...mapGetters({
      isAppSelected: 'application/isSelected',
      allJobs: 'job/getAll',
    }),
    orderedPages() {
      return this.application.pages
        .map((page) => page)
        .sort((a, b) => a.order - b.order)
    },
    pendingJobs() {
      return this.allJobs.filter((job) =>
        this.$registry
          .get('job', job.type)
          .isJobPartOfApplication(job, this.application)
      )
    },
  },
  methods: {
    selected(application) {
      try {
        this.$store.dispatch('application/select', application)
      } catch (error) {
        notifyIf(error, 'workspace')
      }
    },
    settingsClicked() {
      this.$refs.sidebarApplication.$refs.context.hide()
      this.$refs.builderSettingsModal.show()
    },
    orderPages(order, oldOrder) {
      try {
        this.$store.dispatch('page/order', {
          builder: this.application,
          order,
          oldOrder,
        })
      } catch (error) {
        notifyIf(error, 'page')
      }
    },
    getPendingJobComponent(job) {
      return this.$registry.get('job', job.type).getSidebarComponent()
    },
  },
}
</script>