import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ThemeProvider } from '@/contexts/ThemeContext';
import { AuthProvider } from '@/contexts/AuthContext';
import { Toaster } from "@/components/ui/sonner";
import ProtectedRoute from '@/components/auth/ProtectedRoute';
import { Loader2 } from 'lucide-react';

const Index = lazy(() => import('@/pages/Index'));
const Auth = lazy(() => import('@/pages/Auth'));
const EmailConfirmed = lazy(() => import('@/pages/EmailConfirmed'));
const ResetPassword = lazy(() => import('@/pages/ResetPassword'));
const OptimizedDashboard = lazy(() => import('@/pages/OptimizedDashboard'));
const Assets = lazy(() => import('@/pages/Assets'));
const AssetDetail = lazy(() => import('@/pages/AssetDetail'));
const Analytics = lazy(() => import('@/pages/OptimizedAnalysis'));
const Settings = lazy(() => import('@/pages/Settings'));
const NotFound = lazy(() => import('@/pages/NotFound'));
const Landing = lazy(() => import('@/pages/Landing'));
const Plans = lazy(() => import('@/pages/Plans'));
const Vault = lazy(() => import('@/pages/Vault'));
const VaultProfile = lazy(() => import('@/pages/VaultProfile'));
const AdSignup = lazy(() => import('@/pages/AdSignup'));
const Privacy = lazy(() => import('@/pages/Privacy'));
const FAQ = lazy(() => import('@/pages/FAQ'));
const Support = lazy(() => import('@/pages/Support'));
const Terms = lazy(() => import('@/pages/Terms'));
const Security = lazy(() => import('@/pages/Security'));
const DataRetention = lazy(() => import('@/pages/DataRetention'));

// Azet Business — internal portal
const BusinessDashboard = lazy(() => import('@/pages/business/BusinessDashboard'));
const BusinessInventory = lazy(() => import('@/pages/business/BusinessInventory'));
const BusinessInventoryDetail = lazy(() => import('@/pages/business/BusinessInventoryDetail'));
const BusinessSearch = lazy(() => import('@/pages/business/BusinessSearch'));
const BusinessScanner = lazy(() => import('@/pages/business/BusinessScanner'));
const BusinessUpload = lazy(() => import('@/pages/business/BusinessUpload'));
const BusinessReports = lazy(() => import('@/pages/business/BusinessReports'));
const BusinessSettings = lazy(() => import('@/pages/business/BusinessSettings'));
const BusinessRoute = lazy(() => import('@/components/business/BusinessRoute'));
const BusinessLayout = lazy(() => import('@/components/business/BusinessLayout'));

// Azet Business — public marketing pages
const BusinessLanding = lazy(() => import('@/pages/business-marketing/BusinessLanding'));
const SneakerStores = lazy(() => import('@/pages/business-marketing/SneakerStores'));
const CardShops = lazy(() => import('@/pages/business-marketing/CardShops'));
const PawnShops = lazy(() => import('@/pages/business-marketing/PawnShops'));
const WealthAdvisors = lazy(() => import('@/pages/business-marketing/WealthAdvisors'));
const WatchDealers = lazy(() => import('@/pages/business-marketing/WatchDealers'));
const CollectorsAndDealers = lazy(() => import('@/pages/business-marketing/CollectorsAndDealers'));

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: 5 * 60 * 1000,
      gcTime: 10 * 60 * 1000,
      refetchOnWindowFocus: false,
      retry: 2,
      refetchOnMount: 'always',
      refetchInterval: false,
    },
    mutations: { retry: 1 },
  },
});

const PageLoader = () => (
  <div className="flex items-center justify-center min-h-screen bg-background">
    <Loader2 className="h-5 w-5 animate-spin text-muted-foreground" />
  </div>
);

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <AuthProvider>
        <ThemeProvider>
          <Router>
            <Suspense fallback={<PageLoader />}>
              <Routes>
                <Route path="/" element={<Index />} />
                <Route path="/home" element={<Suspense fallback={<PageLoader />}><Landing /></Suspense>} />
                <Route path="/plans" element={<Plans />} />
                <Route path="/auth" element={<Suspense fallback={<PageLoader />}><Auth /></Suspense>} />
                <Route path="/adsignup" element={<Suspense fallback={<PageLoader />}><AdSignup /></Suspense>} />
                <Route path="/privacy" element={<Suspense fallback={<PageLoader />}><Privacy /></Suspense>} />
                <Route path="/terms" element={<Suspense fallback={<PageLoader />}><Terms /></Suspense>} />
                <Route path="/security" element={<Suspense fallback={<PageLoader />}><Security /></Suspense>} />
                <Route path="/data-retention" element={<Suspense fallback={<PageLoader />}><DataRetention /></Suspense>} />
                <Route path="/faq" element={<Suspense fallback={<PageLoader />}><FAQ /></Suspense>} />
                <Route path="/email-confirmed" element={<EmailConfirmed />} />
                <Route path="/reset-password" element={<Suspense fallback={<PageLoader />}><ResetPassword /></Suspense>} />
                <Route path="/dashboard" element={<ProtectedRoute><OptimizedDashboard /></ProtectedRoute>} />
                <Route path="/assets" element={<ProtectedRoute><Assets /></ProtectedRoute>} />
                <Route path="/assets/:id" element={<ProtectedRoute><AssetDetail /></ProtectedRoute>} />
                <Route path="/analytics" element={<ProtectedRoute><Analytics /></ProtectedRoute>} />
                <Route path="/vault" element={<ProtectedRoute><Vault /></ProtectedRoute>} />
                <Route path="/vault/profile/:userId" element={<ProtectedRoute><VaultProfile /></ProtectedRoute>} />
                <Route path="/settings" element={<ProtectedRoute><Settings /></ProtectedRoute>} />
                <Route path="/support" element={<ProtectedRoute><Support /></ProtectedRoute>} />

                {/* Azet Business — public marketing */}
                <Route path="/business" element={<BusinessLanding />} />
                <Route path="/business/sneaker-stores" element={<SneakerStores />} />
                <Route path="/business/card-shops" element={<CardShops />} />
                <Route path="/business/pawn-shops" element={<PawnShops />} />
                <Route path="/business/wealth-advisors" element={<WealthAdvisors />} />
                <Route path="/business/watch-dealers" element={<WatchDealers />} />
                <Route path="/business/collectors-and-dealers" element={<CollectorsAndDealers />} />

                {/* Azet Business — internal portal */}
                <Route path="/business-portal" element={<BusinessRoute><BusinessLayout><BusinessDashboard /></BusinessLayout></BusinessRoute>} />
                <Route path="/business-portal/dashboard" element={<BusinessRoute><BusinessLayout><BusinessDashboard /></BusinessLayout></BusinessRoute>} />
                <Route path="/business-portal/inventory" element={<BusinessRoute><BusinessLayout><BusinessInventory /></BusinessLayout></BusinessRoute>} />
                <Route path="/business-portal/inventory/:id" element={<BusinessRoute><BusinessLayout><BusinessInventoryDetail /></BusinessLayout></BusinessRoute>} />
                <Route path="/business-portal/search" element={<BusinessRoute><BusinessLayout><BusinessSearch /></BusinessLayout></BusinessRoute>} />
                <Route path="/business-portal/scanner" element={<BusinessRoute><BusinessLayout><BusinessScanner /></BusinessLayout></BusinessRoute>} />
                <Route path="/business-portal/upload" element={<BusinessRoute><BusinessLayout><BusinessUpload /></BusinessLayout></BusinessRoute>} />
                <Route path="/business-portal/reports" element={<BusinessRoute><BusinessLayout><BusinessReports /></BusinessLayout></BusinessRoute>} />
                <Route path="/business-portal/settings" element={<BusinessRoute><BusinessLayout><BusinessSettings /></BusinessLayout></BusinessRoute>} />


                <Route path="*" element={<NotFound />} />
              </Routes>
            </Suspense>
            <Toaster />
          </Router>
        </ThemeProvider>
      </AuthProvider>
    </QueryClientProvider>
  );
}

export default App;
