import '@lit-labs/ssr-client/lit-element-hydrate-support.js'

import { QueryClient, hydrate, type DehydratedState } from '@tanstack/lit-query'
import { QUERY_STALE_TIME } from './api.js'

type HydratableSsrApp = HTMLElement & {
  queryClient?: QueryClient
}

function createQueryClient(): QueryClient {
  return new QueryClient({
    defaultOptions: {
      queries: {
        retry: false,
        staleTime: QUERY_STALE_TIME,
      },
    },
  })
}

function readDehydratedState(): DehydratedState {
  const stateElement = document.getElementById('__QUERY_STATE__')
  if (!stateElement) {
    throw new Error('Missing dehydrated state script.')
  }

  const stateText = stateElement.textContent?.trim() ?? 'null'
  return JSON.parse(stateText) as DehydratedState
}

async function bootstrap() {
  if (document.readyState === 'loading') {
    await new Promise<void>((resolve) => {
      document.addEventListener('DOMContentLoaded', () => resolve(), {
        once: true,
      })
    })
  }

  const appElement = document.querySelector(
    'ssr-app',
  ) as HydratableSsrApp | null
  if (!appElement) {
    throw new Error('Expected the SSR app element to exist before hydration.')
  }

  const queryClient = createQueryClient()
  queryClient.mount()
  hydrate(queryClient, readDehydratedState())
  appElement.queryClient = queryClient

  window.addEventListener(
    'pagehide',
    () => {
      queryClient.unmount()
    },
    { once: true },
  )

  await import('./app.js')
}

void bootstrap()
import '@lit-labs/ssr-client/lit-element-hydrate-support.js'

import { QueryClient, hydrate, type DehydratedState } from '@tanstack/lit-query'
import { QUERY_STALE_TIME } from './api.js'

type HydratableSsrApp = HTMLElement & {
  queryClient?: QueryClient
}

function createQueryClient(): QueryClient {
  return new QueryClient({
    defaultOptions: {
      queries: {
        retry: false,
        staleTime: QUERY_STALE_TIME,
      },
    },
  })
}

function readDehydratedState(): DehydratedState {
  const stateElement = document.getElementById('__QUERY_STATE__')
  if (!stateElement) {
    throw new Error('Missing dehydrated state script.')
  }

  const stateText = stateElement.textContent?.trim() ?? 'null'
  return JSON.parse(stateText) as DehydratedState
}

async function bootstrap() {
  if (document.readyState === 'loading') {
    await new Promise<void>((resolve) => {
      document.addEventListener('DOMContentLoaded', () => resolve(), {
        once: true,
      })
    })
  }

  const appElement = document.querySelector(
    'ssr-app',
  ) as HydratableSsrApp | null
  if (!appElement) {
    throw new Error('Expected the SSR app element to exist before hydration.')
  }

  const queryClient = createQueryClient()
  queryClient.mount()
  hydrate(queryClient, readDehydratedState())
  appElement.queryClient = queryClient

  window.addEventListener(
    'pagehide',
    () => {
      queryClient.unmount()
    },
    { once: true },
  )

  await import('./app.js')
}

void bootstrap()