import { QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { RouterProvider } from '@tanstack/react-router'
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { AppToaster } from '@/components/ui/toaster'
import { APP_ROOT_ELEMENT_ID } from '@/constants'
import {
  getCurrentUserProfile,
  refreshAuthSession,
} from '@/features/auth/api/auth-api'
import '@/i18n'
import { prefetchAuthToken } from '@/lib/api/api-client'
import {
  initializeAuthSession,
  registerCurrentUserInitializer,
  registerRefreshSessionHandler,
} from '@/lib/auth/auth-session'
import { queryClient } from '@/lib/query/query-client'
import { router } from '@/router'
import './style/index.css'

const rootElement = document.getElementById(APP_ROOT_ELEMENT_ID)
const shouldShowQueryDevtools =
  import.meta.env.VITE_APP_ENV === 'development' &&
  import.meta.env.VITE_ENABLE_QUERY_DEVTOOLS === 'true'

if (!rootElement) {
  throw new Error('Root element not found')
}

registerCurrentUserInitializer(getCurrentUserProfile)
registerRefreshSessionHandler(refreshAuthSession)

void initializeAuthSession().then(async () => {
  try {
    await prefetchAuthToken()
  } catch (error) {
    console.error('Failed to prefetch auth token', error)
  }
})

createRoot(rootElement).render(
  <StrictMode>
    <QueryClientProvider client={queryClient}>
      <RouterProvider router={router} />
      <AppToaster />
      {shouldShowQueryDevtools && <ReactQueryDevtools initialIsOpen={false} />}
    </QueryClientProvider>
  </StrictMode>,
)
