/* eslint-disable react-refresh/only-export-components --
   entry point renderizzato una sola volta via createRoot: non è mai
   soggetto a Fast Refresh come componente, le costanti lazy() qui sotto
   sono solo dati passati al router, non export di un modulo condiviso. */
import { lazy, StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
// Font self-hosted (nessuna richiesta a Google Fonts: niente IP inviato a terzi senza consenso)
import '@fontsource-variable/inter';
import '@fontsource-variable/big-shoulders-display';
import './styles/tailwind.css';
import { ProtectedRoute } from './components/ProtectedRoute';
import { AdminRoute } from './components/AdminRoute';
import AppLayout from './components/AppLayout';
import RouteErrorBoundary from './components/RouteErrorBoundary';
import LandingPage from './pages/LandingPage';

// Tutte le pagine tranne la home sono lazy: ognuna arriva come chunk a sé,
// scaricato solo quando l'utente ci naviga davvero (vedi Suspense in
// AppLayout/AdminRoute). La home resta eager per evitare un giro di rete
// in più proprio sulla pagina che riceve più visite.
const GalleryPage = lazy(() => import('./pages/GalleryPage'));
const AlbumPage = lazy(() => import('./pages/AlbumPage'));
const DoveSaroPage = lazy(() => import('./pages/DoveSaroPage'));
const CartPage = lazy(() => import('./pages/CartPage'));
const CheckoutSuccessPage = lazy(() => import('./pages/CheckoutSuccessPage'));
const CheckoutCancelPage = lazy(() => import('./pages/CheckoutCancelPage'));
const LoginPage = lazy(() => import('./pages/LoginPage'));
const RegisterPage = lazy(() => import('./pages/RegisterPage'));
const ForgotPasswordPage = lazy(() => import('./pages/ForgotPasswordPage'));
const ResetPasswordPage = lazy(() => import('./pages/ResetPasswordPage'));
const VerifyEmailPage = lazy(() => import('./pages/VerifyEmailPage'));
const OrdersPage = lazy(() => import('./pages/OrdersPage'));
const ProfilePage = lazy(() => import('./pages/ProfilePage'));
const PrivacyPolicyPage = lazy(() => import('./pages/PrivacyPolicyPage'));
const TermsPage = lazy(() => import('./pages/TermsPage'));
const CookiePolicyPage = lazy(() => import('./pages/CookiePolicyPage'));
const AdminDashboardPage = lazy(() => import('./pages/AdminDashboardPage'));
const VideomarkingPage = lazy(() => import('./pages/VideomarkingPage'));
const Scansioni3DPage = lazy(() => import('./pages/Scansioni3DPage'));
const SitiWebPage = lazy(() => import('./pages/SitiWebPage'));
const ChiSonoPage = lazy(() => import('./pages/ChiSonoPage'));
const NotFoundPage =lazy(() => import('./pages/NotFoundPage'));
const SoftwarePage = lazy(() => import('./pages/SoftwarePage'));

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      retry: 1,
      staleTime: 30_000,
    },
  },
});

const router = createBrowserRouter([
  {
    element: <AppLayout />,
    errorElement: <RouteErrorBoundary />,
    children: [
      { path: '/',              element: <LandingPage /> },
      { path: '/gallery',       element: <GalleryPage /> },
      { path: '/gallery/:slug', element: <AlbumPage /> },
      { path: '/gallerie',      element: <GalleryPage /> },
      { path: '/gallerie/:slug',element: <AlbumPage /> },
      { path: '/chi-sono',      element: <ChiSonoPage /> },
      { path: '/dove-saro',     element: <DoveSaroPage /> },
      { path: '/cart', element: <CartPage /> },
      { path: '/checkout/success', element: <CheckoutSuccessPage /> },
      { path: '/checkout/cancel', element: <CheckoutCancelPage /> },
      { path: '/login', element: <LoginPage /> },
      { path: '/register', element: <RegisterPage /> },
      { path: '/forgot-password', element: <ForgotPasswordPage /> },
      { path: '/reset-password', element: <ResetPasswordPage /> },
      { path: '/verify-email', element: <VerifyEmailPage /> },
      { path: '/videomaking',  element: <VideomarkingPage /> },
      { path: '/scansioni-3d', element: <Scansioni3DPage /> },
      { path: '/siti-web',     element: <SitiWebPage /> },
      { path: '/software',     element: <SoftwarePage /> },
      { path: '/privacy-policy', element: <PrivacyPolicyPage /> },
      { path: '/termini-e-condizioni', element: <TermsPage /> },
      { path: '/cookie-policy', element: <CookiePolicyPage /> },
      {
        element: <ProtectedRoute />,
        children: [
          { path: '/orders', element: <OrdersPage /> },
          { path: '/profile', element: <ProfilePage /> },
        ],
      },
      // Nessuna route corrisponde: 404 con la stessa grafica del sito.
      { path: '*', element: <NotFoundPage /> },
    ],
  },
  // Admin dashboard — fuori da AppLayout, layout dedicato
  {
    element: <AdminRoute />,
    errorElement: <RouteErrorBoundary />,
    children: [
      { path: '/admin', element: <AdminDashboardPage /> },
    ],
  },
]);

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