<template>
  <Modal
    left-sidebar
    left-sidebar-scrollable
    :content-padding="
      settingSelected == null ? true : settingSelected.componentPadding
    "
  >
    <template #sidebar>
      <div class="modal-sidebar__head">
        <div class="modal-sidebar__head-name">
          {{ $t('builderSettingsModal.title') }}
        </div>
      </div>
      <ul class="modal-sidebar__nav">
        <li v-for="setting in registeredSettings" :key="setting.getType()">
          <a
            class="modal-sidebar__nav-link"
            :class="{ active: setting === settingSelected }"
            @click="settingSelected = setting"
          >
            <i class="modal-sidebar__nav-icon" :class="setting.icon"></i>
            {{ setting.name }}
          </a>
        </li>
      </ul>
    </template>
    <template v-if="settingSelected" #content>
      <component
        :is="settingSelected.component"
        ref="settingSelected"
        :builder="builder"
        :hide-after-create="hideAfterCreate"
        :force-display-form="displaySelectedSettingForm"
        @hide-modal="hide()"
      ></component>
    </template>
  </Modal>
</template>

<script>
import modal from '@baserow/modules/core/mixins/modal'
import { BuilderApplicationType } from '@baserow/modules/builder/applicationTypes'

export default {
  name: 'BuilderSettingsModal',
  mixins: [modal],
  props: {
    builder: {
      type: Object,
      required: true,
    },
    /**
     * If you want the selected setting form to hide the builder settings modal
     * after a record is created, set this to `true`.
     */
    hideAfterCreate: {
      type: Boolean,
      required: false,
      default: false,
    },
  },
  data() {
    return {
      settingSelected: null,
      displaySelectedSettingForm: false,
    }
  },
  computed: {
    registeredSettings() {
      return this.$registry.getOrderedList('builderSettings')
    },
  },
  watch: {
    // When the selected setting changes, and we've forcibly displayed
    // the selected setting's form, then reset the display flag so that
    // the next setting doesn't immediately display its form.
    settingSelected(newSetting, oldSetting) {
      if (
        oldSetting &&
        newSetting !== oldSetting &&
        this.displaySelectedSettingForm
      ) {
        this.displaySelectedSettingForm = false
      }
    },
  },
  methods: {
    show(
      selectSettingType = null,
      displaySelectedSettingForm = false,
      ...args
    ) {
      // If we've been instructed to show a specific setting component,
      // then ensure it's displayed first.
      if (selectSettingType) {
        this.settingSelected = this.$registry.get(
          'builderSettings',
          selectSettingType
        )
      }

      // If no `selectSettingType` was provided then choose the first setting.
      if (!this.settingSelected) {
        this.settingSelected = this.registeredSettings[0]
      }

      // If we've been instructed to show the modal, and make the
      // selected setting component's form display, then do so.
      this.displaySelectedSettingForm = displaySelectedSettingForm

      const builderApplicationType = this.$registry.get(
        'application',
        BuilderApplicationType.getType()
      )
      builderApplicationType.loadExtraData(this.builder)

      return modal.methods.show.call(this, ...args)
    },
  },
}
</script>