// Destek modu ilk içe aktarılır: sekme destek modundaysa localStorage burada sekmeye özel sanal depoyla değişir (başka hiçbir modül önce çalışmamalı).
import { consumeEnterHash, SUPPORT_TAB } from './lib/supportMode'
import { hashKey, QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import App from './App.tsx'
import { ScreenLockGate } from './components/ScreenLockGate'
import { ToastProvider } from './components/Toast'
import { ApiError, getBranchUuid, getCompanyUuid } from './lib/api'
import { AuthProvider } from './lib/auth'
import SupportEnter from './pages/support/SupportEnter'
import '@fontsource-variable/inter'
import './index.css'

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      // Şirket ve şube her sorgunun karmasındadır: bağlam değişiminden önce başlamış bir isteğin (geç dönen yanıtın) sonucu eski bağlamın
      // girdisine yazılır, yeni bağlamın hiçbir ekranı onu okumaz. (Önbellek ayrıca bağlam değişiminde silinir; bu ikinci kilittir.)
      queryKeyHashFn: (key) => hashKey([getCompanyUuid() ?? '', getBranchUuid() ?? '', ...key]),
      staleTime: 30_000,
      retry: (count, err) => !(err instanceof ApiError && err.status > 0 && err.status < 500) && count < 2,
      refetchOnWindowFocus: false,
    },
  },
})

// Destek girişi (`/support/enter#t=…&s=…`): parça HEMEN okunup adresten silinir; sayfa oturum sağlayıcısı/kilit kapısı olmadan, ayrı bir ağaçta çizilir.
const isSupportEnter = window.location.pathname.replace(/\/+$/, '') === '/support/enter'
if (isSupportEnter) consumeEnterHash()

const root = createRoot(document.getElementById('root')!)
if (isSupportEnter) {
  root.render(
    <StrictMode>
      <SupportEnter />
    </StrictMode>,
  )
} else {
  root.render(
    <StrictMode>
      <QueryClientProvider client={queryClient}>
        <BrowserRouter>
          <ToastProvider>
            <AuthProvider>
              {/* Ekran kilidi kapısı: kilitliyken uygulama ağacını çizmez (kilit ekranı yerine geçer). Destek sekmesinde kilit yoktur (müşterinin kilidi değil). */}
              {SUPPORT_TAB ? (
                <App />
              ) : (
                <ScreenLockGate>
                  <App />
                </ScreenLockGate>
              )}
            </AuthProvider>
          </ToastProvider>
        </BrowserRouter>
      </QueryClientProvider>
    </StrictMode>,
  )
}
