import { Toaster } from "@/components/ui/toaster";
import { Toaster as Sonner } from "@/components/ui/sonner";
import { TooltipProvider } from "@/components/ui/tooltip";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client";
import { createSyncStoragePersister } from "@tanstack/query-sync-storage-persister";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { LanguageProvider } from "@/contexts/LanguageContext";
import { CookieConsentProvider } from "@/contexts/CookieContext";
import { AuthProvider } from "@/contexts/AuthContext";
import CookieConsent from "@/components/CookieConsent";
import ErrorBoundary from "@/components/ErrorBoundary";
import { lazy, Suspense } from "react";
import { Skeleton } from "@/components/ui/skeleton";
import { HelmetProvider } from "react-helmet-async";
import Index from "./pages/Index";
import { useAutoPrefetch } from "@/hooks/useAutoPrefetch";
import ScrollToTop from "@/components/ScrollToTop";

// Lazy load all pages except Index (above-the-fold)
const NotFound = lazy(() => import("./pages/NotFound"));
const Villa = lazy(() => import("./pages/Villa"));
const PoolGarden = lazy(() => import("./pages/PoolGarden"));
const Experiences = lazy(() => import("./pages/Experiences"));
const InnerBalanceRetreat = lazy(() => import("./pages/InnerBalanceRetreat"));
const Gallery = lazy(() => import("./pages/Gallery"));
const Contacts = lazy(() => import("./pages/Contacts"));
const ArteCultura = lazy(() => import("./pages/ArteCultura"));
const EsperienzeGastronomiche = lazy(() => import("./pages/EsperienzeGastronomiche"));
const TourInBarca = lazy(() => import("./pages/TourInBarca"));
const PrivacyPolicy = lazy(() => import("./pages/PrivacyPolicy"));
const TermsConditions = lazy(() => import("./pages/TermsConditions"));

// Admin pages
const AdminLogin = lazy(() => import("./pages/AdminLogin"));
const AdminDashboard = lazy(() => import("./pages/admin/AdminDashboard"));
const AdminImages = lazy(() => import("./pages/admin/AdminImages"));
const AdminTexts = lazy(() => import("./pages/admin/AdminTexts"));
const AdminRetreat = lazy(() => import("./pages/admin/AdminRetreat"));
const AdminSettings = lazy(() => import("./pages/admin/AdminSettings"));
const AdminBookings = lazy(() => import("./pages/admin/AdminBookings"));
const AdminBookingManagement = lazy(() => import("./pages/admin/AdminBookingManagement"));
const AdminSiteAnalysis = lazy(() => import("./pages/admin/AdminSiteAnalysis"));
const AdminLayout = lazy(() => import("./components/admin/AdminLayout"));
const ProtectedRoute = lazy(() => import("./components/admin/ProtectedRoute"));

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: 1000 * 60 * 10, // 10 minuti - evita re-fetch continui
      gcTime: 1000 * 60 * 60, // 1 ora - mantiene cache più a lungo
      refetchOnWindowFocus: false, // Non ricarica al cambio finestra
      refetchOnMount: false, // Non ricarica al mount se dati freschi
      retry: 1, // Solo 1 retry in caso di errore
    },
  },
});

// Persist React Query cache in localStorage for instant navigation
const persister = createSyncStoragePersister({
  storage: window.localStorage,
  key: 'villa-gelso-cache',
});

const PageSkeleton = () => (
  <div className="min-h-screen">
    <Skeleton className="w-full h-24" />
    <Skeleton className="w-full h-96 mt-4" />
  </div>
);

// Component che usa router hooks
const RouterContent = () => {
  useAutoPrefetch();
  
  return (
    <Suspense fallback={<PageSkeleton />}>
      <Routes>
        <Route path="/" element={<Index />} />
        <Route path="/villa" element={<Villa />} />
        <Route path="/piscina-giardino" element={<PoolGarden />} />
        <Route path="/esperienze" element={<Experiences />} />
        <Route path="/tour-in-barca" element={<TourInBarca />} />
        <Route path="/arte-cultura" element={<ArteCultura />} />
        <Route path="/esperienze-gastronomiche" element={<EsperienzeGastronomiche />} />
        <Route path="/inner-balance-retreat" element={<InnerBalanceRetreat />} />
        <Route path="/galleria" element={<Gallery />} />
        <Route path="/contatti" element={<Contacts />} />
        <Route path="/privacy-policy" element={<PrivacyPolicy />} />
        <Route path="/terms-conditions" element={<TermsConditions />} />
        
        {/* Admin Routes */}
        <Route path="/admin/login" element={<AdminLogin />} />
        <Route path="/admin" element={<ProtectedRoute><AdminLayout><AdminDashboard /></AdminLayout></ProtectedRoute>} />
        <Route path="/admin/prenotazioni" element={<ProtectedRoute><AdminLayout><AdminBookings /></AdminLayout></ProtectedRoute>} />
        <Route path="/admin/gestione-calendario" element={<ProtectedRoute><AdminLayout><AdminBookingManagement /></AdminLayout></ProtectedRoute>} />
        <Route path="/admin/immagini" element={<ProtectedRoute><AdminLayout><AdminImages /></AdminLayout></ProtectedRoute>} />
        <Route path="/admin/testi" element={<ProtectedRoute><AdminLayout><AdminTexts /></AdminLayout></ProtectedRoute>} />
        <Route path="/admin/retreat" element={<ProtectedRoute><AdminLayout><AdminRetreat /></AdminLayout></ProtectedRoute>} />
        <Route path="/admin/analisi-sito" element={<ProtectedRoute><AdminLayout><AdminSiteAnalysis /></AdminLayout></ProtectedRoute>} />
        <Route path="/admin/impostazioni" element={<ProtectedRoute><AdminLayout><AdminSettings /></AdminLayout></ProtectedRoute>} />
        
        <Route path="*" element={<NotFound />} />
      </Routes>
    </Suspense>
  );
};

const App = () => (
  <ErrorBoundary>
    <HelmetProvider>
      <PersistQueryClientProvider 
        client={queryClient} 
        persistOptions={{ persister, maxAge: 1000 * 60 * 60 * 24 }}
      >
        <AuthProvider>
          <LanguageProvider>
            <CookieConsentProvider>
              <TooltipProvider>
                <Toaster />
                <Sonner />
                <BrowserRouter>
                  <ScrollToTop />
                  <RouterContent />
                  <CookieConsent />
                </BrowserRouter>
              </TooltipProvider>
            </CookieConsentProvider>
          </LanguageProvider>
        </AuthProvider>
      </PersistQueryClientProvider>
    </HelmetProvider>
  </ErrorBoundary>
);

export default App;