<template>
  <PublicPage :builder="builder" :page="page" :path="path" :params="params" />
</template>

<script>
import PublicPage from '@baserow/modules/builder/components/page/PublicPage'
import { resolveApplicationRoute } from '@baserow/modules/builder/utils/routing'

export default {
  components: { PublicPage },

  async asyncData(context) {
    let builder = context.store.getters['publicBuilder/getBuilder']

    if (!builder) {
      try {
        const builderId = context.route.params.builderId
        if (builderId) {
          // We have the builderId in the params so this is a preview
          // Must fetch the builder instance by this Id.
          await context.store.dispatch('publicBuilder/fetchById', {
            builderId,
          })
        } else {
          // We don't have the builderId so it's a public page.
          // Must fetch the builder instance by domain name.
          const host = process.server
            ? context.req.headers.host
            : window.location.host
          const domain = new URL(`http://${host}`).hostname

          await context.store.dispatch('publicBuilder/fetchByDomain', {
            domain,
          })
        }
        builder = context.store.getters['publicBuilder/getBuilder']
      } catch (e) {
        return context.error({
          statusCode: 404,
          message: context.app.i18n.t('publicPage.siteNotFound'),
        })
      }
    }

    const found = resolveApplicationRoute(
      builder.pages,
      context.route.params.pathMatch
    )

    // Handle 404
    if (!found) {
      return context.error({
        statusCode: 404,
        message: context.app.i18n.t('publicPage.pageNotFound'),
      })
    }

    const [page, path, params] = found

    return {
      builder,
      page,
      path,
      params,
    }
  },
}
</script>