import { Suspense, lazy } from "react";
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 { AuthProvider, useAuth } from "./contexts/AuthContext";
import { PermissionsProvider } from "./contexts/PermissionsContext";
import { ProductsProvider } from "./contexts/ProductsContext";
import { SalesProvider } from "./contexts/SalesContext";
import { CustomersProvider } from "./contexts/CustomersContext";
import { StockProvider } from "./contexts/StockContext";
import { CurrentAccountProvider } from "./contexts/CurrentAccountContext";
import { ThemeProvider } from "./contexts/ThemeContext";
import { MasterDateProvider } from "./contexts/MasterDateContext";
import { ProtectedRoute } from "./components/ProtectedRoute";
import { OrdersProtection } from "./components/OrdersProtection";
import { StockProtection } from "./components/StockProtection";
import { StoreDataProtection } from "./components/StoreDataProtection";
import { AdminProtection } from "./components/AdminProtection";
import { WorkflowProtection } from "./components/WorkflowProtection";
import { CurrentAccountProtection } from "./components/CurrentAccountProtection";
import { CustomerRevivalProtection } from "./components/CustomerRevivalProtection";
import { useSalesNotification } from "./hooks/useSalesNotification";
import DeliveryAlarmWatcher from "./components/sales/DeliveryAlarmWatcher";
import LowStockWatcher from "./components/products/LowStockWatcher";

// Import Auth directly (not lazy loaded as it's the entry point)
import Auth from "./pages/Auth";

// Lazy load other pages for code splitting
const InitializeAdmin = lazy(() => import("./pages/InitializeAdmin"));
const Dashboard = lazy(() => import("./pages/Dashboard"));
const Customers = lazy(() => import("./pages/Customers"));
const Products = lazy(() => import("./pages/Products"));
const AddProduct = lazy(() => import("./pages/AddProduct"));
const ProductDetail = lazy(() => import("./pages/ProductDetail"));
const Sales = lazy(() => import("./pages/Sales"));
const AddSale = lazy(() => import("./pages/AddSale"));
const SaleDetail = lazy(() => import("./pages/SaleDetail"));
const Orders = lazy(() => import("./pages/Orders"));
const Delivery = lazy(() => import("./pages/Delivery"));
const RepresentativeDelivery = lazy(() => import("./pages/RepresentativeDelivery"));
const RepresentativeOrders = lazy(() => import("./pages/RepresentativeOrders"));
const Representatives = lazy(() => import("./pages/Representatives"));
const AddRepresentative = lazy(() => import("./pages/AddRepresentative"));
const EditRepresentative = lazy(() => import("./pages/EditRepresentative"));
const DeliveryBoys = lazy(() => import("./pages/DeliveryBoys"));
const AdminOnly = lazy(() => import("./pages/AdminOnly"));
const Expenses = lazy(() => import("./pages/Expenses"));
const CustomersDue = lazy(() => import("./pages/CustomersDue"));
const StaffSalary = lazy(() => import("./pages/StaffSalary"));
const Daybook = lazy(() => import("./pages/Daybook"));
const MonthlyExpenses = lazy(() => import("./pages/MonthlyExpenses"));
const ActualProfitLoss = lazy(() => import("./pages/ActualProfitLoss"));
const PackedDelivered = lazy(() => import("./pages/PackedDelivered"));
const QuantitySold = lazy(() => import("./pages/QuantitySold"));
const TodaysScannedSales = lazy(() => import("./pages/TodaysScannedSales"));
const Tracking = lazy(() => import("./pages/Tracking"));
const Stock = lazy(() => import("./pages/Stock"));
const StoreData = lazy(() => import("./pages/StoreData"));
const SortDelivery = lazy(() => import("./pages/SortDelivery"));
const SendBill = lazy(() => import("./pages/SendBill"));
const Requirements = lazy(() => import("./pages/Requirements"));
const Attendance = lazy(() => import("./pages/Attendance"));
const Analysis = lazy(() => import("./pages/Analysis"));
const AIAnalysis = lazy(() => import("./pages/AIAnalysis"));
const NotFound = lazy(() => import("./pages/NotFound"));
const Workflow = lazy(() => import("./pages/Workflow"));
const CustomerRevival = lazy(() => import("./pages/CustomerRevival"));
const NewCustomers = lazy(() => import("./pages/NewCustomers"));
const AIAPIManager = lazy(() => import("./pages/AIAPIManager"));
const CurrentAccount = lazy(() => import("./pages/CurrentAccount"));
const SupplierSchedule = lazy(() => import("./pages/SupplierSchedule"));
const RequirementsOverview = lazy(() => import("./pages/RequirementsOverview"));
const ExpensesPurchases = lazy(() => import("./pages/CurrentAccount/ExpensesPurchases"));
const PartnersInvestors = lazy(() => import("./pages/CurrentAccount/PartnersInvestors"));
const ActivityLog = lazy(() => import("./pages/CurrentAccount/ActivityLog"));
const AdditionalFund = lazy(() => import("./pages/CurrentAccount/AdditionalFund"));
const PartnerDetail = lazy(() => import("./pages/CurrentAccount/PartnerDetail"));
const PersonalAccount = lazy(() => import("./pages/PersonalAccount"));
const MissedProducts = lazy(() => import("./pages/MissedProducts"));

const queryClient = new QueryClient();

function PrivateRoute({ children }: { children: React.ReactNode }) {
  const { user, isReady, authPhase } = useAuth();
  
  // Set up sales notification for representatives
  useSalesNotification();
  
  // Still booting — show loading but never forever (AuthContext has absolute timeout)
  if (!isReady) {
    return (
      <div className="min-h-screen flex items-center justify-center flex-col gap-2">
        <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-primary"></div>
        <p className="text-sm text-muted-foreground">Loading...</p>
      </div>
    );
  }
  
  // Booted and no user → redirect to login
  if (!user) {
    return <Navigate to="/auth" replace />;
  }

  return <>{children}</>;
}

const App = () => (
  <QueryClientProvider client={queryClient}>
    <ThemeProvider>
      <AuthProvider>
        <MasterDateProvider>
        <PermissionsProvider>
          <ProductsProvider>
            <CustomersProvider>
              <SalesProvider>
                <StockProvider>
                  <CurrentAccountProvider>
                    <TooltipProvider>
                    <Toaster />
                    <Sonner />
                    <DeliveryAlarmWatcher />
                    <LowStockWatcher />
                  
                  
                    <Suspense fallback={<div className="min-h-screen flex items-center justify-center">Loading...</div>}>
                      <Routes>
            <Route path="/" element={<Navigate to="/auth" />} />
            <Route path="/auth" element={<Auth />} />
            <Route path="/init-admin" element={<InitializeAdmin />} />
            <Route
              path="/dashboard"
              element={
                <PrivateRoute>
                  <Dashboard />
                </PrivateRoute>
              }
            />
            <Route
              path="/customers"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="customers_access">
                    <Customers />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/products"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="products_access">
                    <Products />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/products/add"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="products_access" requireEdit>
                    <AddProduct />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/products/:id"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="products_access">
                    <ProductDetail />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/sales"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="sales_access">
                    <Sales />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/sales/add"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="sales_access" requireEdit>
                    <AddSale />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/sales/edit/:id"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="sales_access" requireEdit>
                    <AddSale />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/sales/:id"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="sales_access">
                    <SaleDetail />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/orders"
              element={
                <PrivateRoute>
                  <OrdersProtection>
                    <Orders />
                  </OrdersProtection>
                </PrivateRoute>
              }
            />
            <Route
              path="/delivery"
              element={
                <PrivateRoute>
                  <OrdersProtection>
                    <Delivery />
                  </OrdersProtection>
                </PrivateRoute>
              }
            />
            <Route
              path="/representative-delivery"
              element={
                <PrivateRoute>
                  <OrdersProtection>
                    <RepresentativeDelivery />
                  </OrdersProtection>
                </PrivateRoute>
              }
            />
            <Route
              path="/representative-orders"
              element={
                <PrivateRoute>
                  <OrdersProtection>
                    <RepresentativeOrders />
                  </OrdersProtection>
                </PrivateRoute>
              }
            />
            <Route
              path="/representatives"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="representatives_access">
                    <Representatives />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/representatives/add"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="representatives_access" requireEdit>
                    <AddRepresentative />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/representatives/edit/:userId"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="representatives_access" requireEdit>
                    <EditRepresentative />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/delivery-boys"
              element={
                <PrivateRoute>
                  <AdminProtection>
                    <DeliveryBoys />
                  </AdminProtection>
                </PrivateRoute>
              }
            />
            <Route
              path="/admin-only"
              element={
                <PrivateRoute>
                  <AdminOnly />
                </PrivateRoute>
              }
            />
            <Route
              path="/expenses"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="expenses_access">
                    <Expenses />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/customers-due"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="not_paid_customers_access">
                    <CustomersDue />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/staff-salary"
              element={
                <PrivateRoute>
                  <StaffSalary />
                </PrivateRoute>
              }
            />
            <Route
              path="/daybook"
              element={
                <PrivateRoute>
                  <ProtectedRoute module="daybook_access">
                    <Daybook />
                  </ProtectedRoute>
                </PrivateRoute>
              }
            />
            <Route
              path="/monthly-expenses"
              element={
                <PrivateRoute>
                  <MonthlyExpenses />
                </PrivateRoute>
              }
            />
            <Route
              path="/actual-profit-loss"
              element={
                <PrivateRoute>
                  <ActualProfitLoss />
                </PrivateRoute>
              }
            />
          <Route
            path="/packed-delivered"
            element={
              <PrivateRoute>
                <OrdersProtection>
                  <PackedDelivered />
                </OrdersProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/quantity-sold"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <QuantitySold />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/todays-scanned-sales"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <TodaysScannedSales />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/tracking"
            element={
              <PrivateRoute>
                <Tracking />
              </PrivateRoute>
            }
          />
          <Route
            path="/stock"
            element={
              <PrivateRoute>
                <StockProtection>
                  <Stock />
                </StockProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/store-data"
            element={
              <PrivateRoute>
                <StoreDataProtection>
                  <StoreData />
                </StoreDataProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/sort-delivery"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <SortDelivery />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/send-bill"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <SendBill />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/requirements"
            element={
              <PrivateRoute>
                <Requirements />
              </PrivateRoute>
            }
          />
          <Route
            path="/supplier-schedule"
            element={
              <PrivateRoute>
                <SupplierSchedule />
              </PrivateRoute>
            }
          />
          <Route
            path="/requirements-overview"
            element={
              <PrivateRoute>
                <RequirementsOverview />
              </PrivateRoute>
            }
          />
          <Route
            path="/attendance"
            element={
              <PrivateRoute>
                <Attendance />
              </PrivateRoute>
            }
          />
          <Route
            path="/personal-account"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <PersonalAccount />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/current-account"
            element={
              <PrivateRoute>
                <CurrentAccountProtection>
                  <CurrentAccount />
                </CurrentAccountProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/current-account/expenses"
            element={
              <PrivateRoute>
                <CurrentAccountProtection>
                  <ExpensesPurchases />
                </CurrentAccountProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/current-account/partners"
            element={
              <PrivateRoute>
                <CurrentAccountProtection>
                  <PartnersInvestors />
                </CurrentAccountProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/current-account/activity"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <ActivityLog />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/current-account/additional-fund"
            element={
              <PrivateRoute>
                <CurrentAccountProtection>
                  <AdditionalFund />
                </CurrentAccountProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/current-account/partners/:partnerId"
            element={
              <PrivateRoute>
                <CurrentAccountProtection>
                  <PartnerDetail />
                </CurrentAccountProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/analysis"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <Analysis />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/ai-analysis"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <AIAnalysis />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/workflow"
            element={
              <PrivateRoute>
                <WorkflowProtection>
                  <Workflow />
                </WorkflowProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/customer-revival"
            element={
               <PrivateRoute>
                 <CustomerRevivalProtection>
                   <CustomerRevival />
                 </CustomerRevivalProtection>
               </PrivateRoute>
            }
          />
          <Route
            path="/new-customers"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <NewCustomers />
                </AdminProtection>
              </PrivateRoute>
            }
          />
          <Route
            path="/missed-products"
            element={
              <PrivateRoute>
                <MissedProducts />
              </PrivateRoute>
            }
          />
          <Route
            path="/admin/ai-apis"
            element={
              <PrivateRoute>
                <AdminProtection>
                  <AIAPIManager />
                </AdminProtection>
              </PrivateRoute>
            }
          />
            {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
            <Route path="*" element={<NotFound />} />
            </Routes>
                    </Suspense>
              
                  </TooltipProvider>
                  </CurrentAccountProvider>
                </StockProvider>
              </SalesProvider>
            </CustomersProvider>
          </ProductsProvider>
        </PermissionsProvider>
        </MasterDateProvider>
      </AuthProvider>
    </ThemeProvider>
  </QueryClientProvider>
);

export default App;
