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 { Routes, Route, Navigate } from "react-router-dom";
import { ErrorBoundary } from "./components/ErrorBoundary";
import { CookieConsent } from "./components/CookieConsent";
import { Header } from "./components/Header";
import { Footer } from "./components/Footer";
import { initializeAnalytics, initializeScrollTracking, trackTimeOnPage } from "./utils/analytics";
import { startPerformanceMonitoring } from "./utils/performance";
import { errorTracker } from "./utils/errorTracking";
import { routePreloader } from "./utils/routePreloader";
import { useEffect, Suspense, lazy } from "react";
import { PageLoader } from "./components/LoadingSpinner";
import { indexedDBCache } from "./utils/indexedDB";

import { useLocation } from "react-router-dom";
import { ScrollProgress } from "./components/ScrollProgress";
import { PageTransition } from "./components/PageTransition";
import { ScrollToTop } from "./components/ScrollToTop";

// Lazy load pages
const Index = lazy(() => import("./pages/Index"));
const Product = lazy(() => import("./pages/Product"));
const About = lazy(() => import("./pages/About"));
const Team = lazy(() => import("./pages/Team"));
const Careers = lazy(() => import("./pages/Careers"));
const Advisors = lazy(() => import("./pages/Advisors"));
const Solutions = lazy(() => import("./pages/Solutions"));
const TrustCenter = lazy(() => import("./pages/TrustCenter"));
const Contact = lazy(() => import("./pages/Contact"));
const PrivacyPolicy = lazy(() => import("./pages/PrivacyPolicy"));
const Terms = lazy(() => import("./pages/Terms"));
const Cookies = lazy(() => import("./pages/Cookies"));
const Accessibility = lazy(() => import("./pages/Accessibility"));
const Subprocessors = lazy(() => import("./pages/legal/Subprocessors"));
const NotFound = lazy(() => import("./pages/NotFound"));
const ProcessDiscovery = lazy(() => import("./pages/ProcessDiscovery"));
const OutlierAnalysis = lazy(() => import("./pages/OutlierAnalysis"));
const Oversight = lazy(() => import("./pages/Oversight"));
const PredictiveRiskAnalytics = lazy(() => import("./pages/PredictiveRiskAnalytics"));

// New doctrine pages
const WhyOpsen = lazy(() => import("./pages/WhyOpsen"));
const HowItWorks = lazy(() => import("./pages/HowItWorks"));
const WhoItsFor = lazy(() => import("./pages/WhoItsFor"));
const AdminLogin = lazy(() => import("./pages/admin/AdminLogin"));
const AdminAccessRequests = lazy(() => import("./pages/admin/AdminAccessRequests"));
const AdminChangePassword = lazy(() => import("./pages/admin/AdminChangePassword"));

// /product is unpublished: hidden from nav and public routing, but still
// reachable via admin-generated access links (/product?token=...).
// Page code, access_requests data and the admin view all remain intact.
const GatedProduct = () => {
  const { search } = useLocation();
  const hasToken = !!new URLSearchParams(search).get("token");
  return hasToken ? <Product /> : <Navigate to="/" replace />;
};

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      retry: (failureCount, error: any) => {
        if (failureCount >= 2) {
          errorTracker.captureCustomError(
            `Query failed after ${failureCount} retries`,
            'QueryClient',
            'retry_exhausted',
            { error: error?.message }
          );
          return false;
        }
        return true;
      },
      staleTime: 5 * 60 * 1000,
      gcTime: 10 * 60 * 1000,
    },
  },
});

const App = () => {
  const location = useLocation();

  useEffect(() => {
    const initializeCache = async () => {
      try {
        await indexedDBCache.init();
        console.log('IndexedDB cache initialized');
        await indexedDBCache.cleanup();
        console.log('Cache cleanup completed');
      } catch (error) {
        console.error('Failed to initialize cache:', error);
      }
    };

    const consent = localStorage.getItem('cookie-consent');
    if (consent) {
      const preferences = JSON.parse(consent);
      if (preferences.analytics) {
        initializeAnalytics();
        startPerformanceMonitoring();
        const cleanupScrollTracking = initializeScrollTracking();
        const cleanupTimeTracking = trackTimeOnPage();
        initializeCache();
        
        return () => {
          cleanupScrollTracking();
          cleanupTimeTracking();
        };
      }
    } else {
      initializeCache();
    }

    console.log('Route preloader initialized');
  }, []);

  return (
    <ErrorBoundary>
      <QueryClientProvider client={queryClient}>
        <TooltipProvider>
          <Toaster />
          <Sonner />
          <ScrollProgress />
          <ScrollToTop />
          <Header />
          <main className="pt-[var(--header-h)]" key={location.pathname}>
            <Suspense fallback={<PageLoader />}>
              <PageTransition>
                <Routes>
                  <Route path="/" element={<Index />} />
                  
                  {/* New doctrine routes */}
                  <Route path="/why" element={<WhyOpsen />} />
                  <Route path="/how-it-works" element={<HowItWorks />} />
                  <Route path="/who" element={<WhoItsFor />} />
                  {/* /insights unpublished — page code retained */}
                  
                  {/* Core routes */}
                  {/* /product is unpublished: hidden from nav, only reachable with a valid access token link */}
                  <Route path="/product" element={<GatedProduct />} />
                  <Route path="/trust" element={<TrustCenter />} />
                  <Route path="/contact" element={<Contact />} />
                  {/* Legacy capability pages retired — source retained, routes redirected */}
                  <Route path="/solutions" element={<Navigate to="/how-it-works" replace />} />
                  <Route path="/process-discovery" element={<Navigate to="/how-it-works" replace />} />
                  <Route path="/outlier-analysis" element={<Navigate to="/how-it-works" replace />} />
                  <Route path="/oversight" element={<Navigate to="/how-it-works" replace />} />
                  <Route path="/predictive-risk-analytics" element={<Navigate to="/how-it-works" replace />} />
                  
                  {/* Secondary pages */}
                  <Route path="/about" element={<About />} />
                  <Route path="/team" element={<Team />} />
                  <Route path="/careers" element={<Careers />} />
                  <Route path="/advisors" element={<Advisors />} />
                  <Route path="/privacy-policy" element={<PrivacyPolicy />} />
                  <Route path="/terms" element={<Terms />} />
                  <Route path="/cookies" element={<Cookies />} />
                  <Route path="/accessibility" element={<Accessibility />} />
                  <Route path="/legal/subprocessors" element={<Subprocessors />} />
                  <Route path="/subprocessors" element={<Navigate to="/legal/subprocessors" replace />} />

                  
                  {/* Admin */}
                  <Route path="/admin/login" element={<AdminLogin />} />
                  <Route path="/admin/access-requests" element={<AdminAccessRequests />} />
                  <Route path="/admin/change-password" element={<AdminChangePassword />} />

                  {/* Redirects */}
                  <Route path="/platform" element={<Navigate to="/how-it-works" replace />} />
                  <Route path="/digital-twin" element={<Navigate to="/how-it-works" replace />} />
                  <Route path="/security" element={<Navigate to="/trust" replace />} />
                  <Route path="/blog" element={<Navigate to="/" replace />} />
                  <Route path="/resources" element={<Navigate to="/" replace />} />
                  
                  {/* Catch-all */}
                  <Route path="*" element={<NotFound />} />
                </Routes>
              </PageTransition>
            </Suspense>
          </main>
          <Footer />
          <CookieConsent />
          
        </TooltipProvider>
      </QueryClientProvider>
    </ErrorBoundary>
  );
};

export default App;
