import { Buffer } from 'buffer'
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { BrowserRouter } from 'react-router-dom'
import App from './App'
import './index.css'
import '@fontsource-variable/geist'
import '@fontsource-variable/geist-mono'
import { initTheme } from '@/theme'

// Light or dark comes from the persisted settings; set it before React paints and follow every change.
initTheme()
import { useBoardStore } from './store/board'
import { useMetadataStore } from './blur/metadata/store'
// Registers the logo resolver for tokens whose metadata carries a URI but no image.
import './blur/metadata/uriResolver'
import { captureReferral, reconnectSilently } from './store/user'

// A deploy renames hashed chunks; a tab that loaded the old index then fails to import a
// route chunk on navigation. Reload once to pick up the new build instead of showing an error.
window.addEventListener('vite:preloadError', (e) => {
  const key = 'klurb.reloaded-for-chunk'
  try {
    if (sessionStorage.getItem(key) === location.href) return
    sessionStorage.setItem(key, location.href)
  } catch {
    /* storage blocked: still reload once per event */
  }
  e.preventDefault()
  location.reload()
})

// @solana/web3.js expects Node's Buffer global in the browser.
;(globalThis as unknown as { Buffer?: typeof Buffer }).Buffer ??= Buffer
captureReferral()
reconnectSilently()

// Debug handle for probing store state from the console.
;(globalThis as unknown as { __klurb?: unknown }).__klurb = { board: useBoardStore, meta: useMetadataStore }

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      retry: 1,
      refetchOnWindowFocus: false,
      staleTime: 15_000,
      gcTime: 5 * 60_000,
    },
  },
})

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <QueryClientProvider client={queryClient}>
      <BrowserRouter>
        <App />
      </BrowserRouter>
    </QueryClientProvider>
  </StrictMode>,
)
