<template>
  <div class="preview-navigation-bar">
    <div class="preview-navigation-bar__user-selector">
      <UserSelector />
    </div>
    <div class="preview-navigation-bar__address-bar">
      <template v-for="pathPart in splitPath">
        <PreviewNavigationBarInput
          v-if="pathPart.type === 'variable'"
          :key="pathPart.key"
          :class="`preview-navigation-bar__parameter-input--${
            paramTypeMap[pathPart.value]
          }`"
          :validation-fn="pathPart.validationFn"
          :default-value="pageParameters[pathPart.value]"
          @change="
            actionSetParameter({
              page,
              name: pathPart.value,
              value: $event,
            })
          "
        />
        <div
          v-else
          :key="`else_${pathPart.key}`"
          class="preview-navigation-bar__address-bar-path"
        >
          {{ pathPart.value }}
        </div>
      </template>
      <template v-for="(queryParam, index) in queryParams">
        <span
          :key="`separator-${queryParam.key}`"
          class="preview-navigation-bar__query-separator"
        >
          {{ index === 0 ? '?' : '&' }}

          <label :for="queryParam.name">{{ queryParam.name }}=</label>
          <PreviewNavigationBarInput
            :id="queryParam.name"
            :key="`param-${queryParam.key}`"
            :class="`preview-navigation-bar__query-parameter-input--${queryParam.type}`"
            :validation-fn="queryParam.validationFn"
            :default-value="pageParameters[queryParam.name]"
            @change="
              actionSetParameter({
                page,
                name: queryParam.name,
                value: $event,
              })
            "
        /></span>
      </template>
    </div>
    <div />
  </div>
</template>

<script>
import { splitPath } from '@baserow/modules/builder/utils/path'
import PreviewNavigationBarInput from '@baserow/modules/builder/components/page/PreviewNavigationBarInput'
import UserSelector from '@baserow/modules/builder/components/page/UserSelector'
import { mapActions } from 'vuex'
import {
  PAGE_PARAM_TYPE_VALIDATION_FUNCTIONS,
  QUERY_PARAM_TYPE_HANDLER_FUNCTIONS,
} from '@baserow/modules/builder/enums'

export default {
  components: { PreviewNavigationBarInput, UserSelector },
  props: {
    page: {
      type: Object,
      required: true,
    },
  },
  computed: {
    pageParameters() {
      return this.$store.getters['pageParameter/getParameters'](this.page)
    },
    queryParams() {
      return this.page.query_params.map((queryParam, idx) => ({
        ...queryParam,
        key: `query-param-${queryParam.name}-${idx}`,
        validationFn: QUERY_PARAM_TYPE_HANDLER_FUNCTIONS[queryParam.type],
      }))
    },
    splitPath() {
      return splitPath(this.page.path).map((pathPart, index) => ({
        ...pathPart,
        key:
          pathPart.type === 'variable'
            ? `${this.paramTypeMap[pathPart.value]}-${pathPart.value}-${index}`
            : `${pathPart.value}-${index}`,
        validationFn:
          PAGE_PARAM_TYPE_VALIDATION_FUNCTIONS[
            this.paramTypeMap[pathPart.value]
          ],
      }))
    },
    paramTypeMap() {
      return Object.fromEntries(
        this.page.path_params.map(({ name, type }) => [name, type])
      )
    },
  },
  methods: {
    ...mapActions({ actionSetParameter: 'pageParameter/setParameter' }),
  },
}
</script>