import type { ReactNode } from 'react';
import { lazy, Suspense, useEffect } from 'react';
import { Navigate, Route, Routes } from 'react-router-dom';
import AuthLayout from '../layouts/AuthLayout';
import { ENV } from '../config/env';
import { useAppDispatch, useAppSelector } from '../redux/hooks';
import { initializeAuth } from '../redux/slices/authSlice';
import LoginPage from '../pages/Login/LoginPage';
import NotFound from '../pages/Error/NotFound';
import Forbidden from '../pages/Error/Forbidden';
import PageLoader from '../components/PageLoader';

// Lazy-loaded feature pages
const AiChatPage = lazy(() => import('../pages/AiChat/AiChatPage'));
const DashboardPage = lazy(() => import('../pages/Dashboard/DashboardPage'));
// Masters
const Vegetables = lazy(() => import('../pages/Masters/Vegetables'));
const States = lazy(() => import('../pages/Masters/States'));
const Districts = lazy(() => import('../pages/Masters/Districts'));
const Suppliers = lazy(() => import('../pages/Masters/Suppliers'));
const Customers = lazy(() => import('../pages/Masters/Customers'));
const Staffs = lazy(() => import('../pages/Masters/Staffs'));
const UPI = lazy(() => import('../pages/Masters/Settings/UPI'));
const Shop = lazy(() => import('../pages/Masters/Settings/Shop'));
// Purchase & Arrivals
const Purchase = lazy(() => import('../pages/Purchase/Purchase'));
const QuickPurchase = lazy(() => import('../pages/Purchase/QuickPurchase').then((module) => ({ default: module.QuickPurchase })));
const ArrivalAddition = lazy(() => import('../pages/Purchase/ArrivalAddition').then((module) => ({ default: module.ArrivalAddition })));
const ArrivalLotHistory = lazy(() => import('../pages/Purchase/ArrivalLotHistory').then((module) => ({ default: module.ArrivalLotHistory })));
const ArrivalSettlements = lazy(() => import('../pages/Purchase/ArrivalSettlements').then((module) => ({ default: module.ArrivalSettlements })));
const SupplierPayments = lazy(() => import('../pages/Purchase/SupplierPayments'));
const SupplierReturns = lazy(() => import('../pages/Purchase/SupplierReturns').then((module) => ({ default: module.SupplierReturns })));
const BoxReturns = lazy(() => import('../pages/Purchase/BoxReturns').then((module) => ({ default: module.BoxReturns })));
// Sales
const Sales = lazy(() => import('../pages/Sales/Sales').then((module) => ({ default: module.Sales })));
const CustomerPayments = lazy(() => import('../pages/Sales/CustomerPayments').then((module) => ({ default: module.CustomerPayments })));
const QuickSale = lazy(() => import('../pages/Sales/QuickSale').then((module) => ({ default: module.QuickSale })));
const QuickSaleList = lazy(() => import('../pages/Sales/QuickSaleList').then((module) => ({ default: module.QuickSaleList })));
const Employees = lazy(() => import('../pages/Masters/Employees'));
const FastBilling = lazy(() => import('../pages/FastBill/FastBilling'));
const Attendance = lazy(() => import('../pages/Attendance/Attendance'));
// Expenses / Profile
const Expenses = lazy(() => import('../pages/Expenses/Expenses'));
const Profile = lazy(() => import('../pages/Profile/Profile'));
// Stock
const Stock = lazy(() => import('../pages/Stock/Stock'));
const SpoilsReturns = lazy(() => import('../pages/Stock/SpoilsReturns'));
// Reports
const PurchaseReport = lazy(() => import('../pages/Reports/PurchaseReport'));
const StockReport = lazy(() => import('../pages/Reports/StockReport'));
const CustomerSalesReport = lazy(() => import('../pages/Reports/CustomerWiseSales/SalesReport').then((module) => ({ default: module.CustomerSalesReport, })));
const VegWiseSales = lazy(() => import('../pages/Reports/VegWiseSales/VegWiseSales'));
const LotWiseSales = lazy(() => import('../pages/Reports/LotWiseSales/LotWiseSales'));
const RetailSalesReport = lazy(() => import('../pages/Reports/RetailSales/RetailSalesReport').then((module) => ({ default: module.RetailSalesReport, })));
const CustomerLedger = lazy(() => import('../pages/Reports/CustomerLedger/CustomerLedger'));
const SupplierLedger = lazy(() => import('../pages/Reports/SupplierLedger/SupplierLedger'));
const WalkInLedger = lazy(() => import('../pages/Reports/WalkInLedger/WalkInLedger'));
const PattiLedger = lazy(() => import('../pages/Reports/PattiLedger/PattiLedger'));
const WholesaleDailySummary = lazy(() => import('../pages/Reports/WholesaleDailySummary'));
const RetailDailySummary = lazy(() => import('../pages/Reports/RetailDailySummary'));
const LotwiseStockReport = lazy(() => import('../pages/Reports/LotWiseStock/LotwiseStockReport'));
const FinancialSummary = lazy(() => import('../pages/Reports/FinancialSummary'));
const CashReport = lazy(() => import('../pages/Reports/CashReport'));
const BankReport = lazy(() => import('../pages/Reports/BankReport'));
const FinalDailyReport = lazy(() => import('../pages/Reports/FinalDailyReport/FinalDailyReport').then(m => ({ default: m.FinalDailyReport })));
const ArrivalReport = lazy(() => import('../pages/Reports/ArrivalReport'));
const ArrivalSettlementsReport = lazy(() => import('../pages/Reports/ArrivalSettlementsReport'));
const OutstandingReport = lazy(() => import('../pages/Reports/OutstandingReport'));

// Quotations
const Quotations = lazy(() => import('../pages/Quotations/Quotations'));
// Retail
const StockAllocation = lazy(() => import('../pages/Retail/StockAllocation').then((module) => ({ default: module.StockAllocation })));
const RetailStock = lazy(() => import('../pages/Retail/RetailStock'));
const RetailSales = lazy(() => import('../pages/Retail/RetailSales'));
const AllSales = lazy(() => import('../pages/Sales/AllSales').then((module) => ({ default: module.AllSales })));
const InvoicePreview = lazy(() => import('../pages/Public/InvoicePreview'));
const CashBank = lazy(() => import('../pages/CashBank/CashBank'));
const MoveCashToBank = lazy(() => import('../pages/CashBank/MoveCashToBank'));

function ProtectedRoute({ children }: { children: ReactNode }) {
  const { isAuthenticated, authInitialized } = useAppSelector((state) => state.auth);
  const tokenInStorage = Boolean(localStorage.getItem(ENV.ACCESS_TOKEN_STORAGE_KEY));
  const isAuth = isAuthenticated || tokenInStorage;

  if (!authInitialized && tokenInStorage) {
    return <PageLoader />;
  }

  return isAuth ? <>{children}</> : <Navigate to="/login" replace />;
}

function PublicRoute({ children }: { children: ReactNode }) {
  const { isAuthenticated } = useAppSelector((state) => state.auth);
  const tokenInStorage = Boolean(localStorage.getItem(ENV.ACCESS_TOKEN_STORAGE_KEY));
  const isAuth = isAuthenticated || tokenInStorage;

  return isAuth ? <Navigate to="/dashboard" replace /> : <>{children}</>;
}

export default function AppRoutes() {
  const dispatch = useAppDispatch();

  useEffect(() => {
    dispatch(initializeAuth());
  }, [dispatch]);

  return (
    <Suspense fallback={<PageLoader />}>
      <Routes>
        <Route
          path="/login"
          element={
            <PublicRoute>
              <LoginPage />
            </PublicRoute>
          }
        />
        <Route
          path="/ai-chat"
          element={
            <ProtectedRoute>
              <AiChatPage />
            </ProtectedRoute>
          }
        />
        <Route
          path="/"
          element={
            <ProtectedRoute>
              <AuthLayout />
            </ProtectedRoute>
          }
        >
          <Route index element={<Navigate to="/dashboard" replace />} />
          {/* Dashboard Route */}
          <Route path="dashboard" element={<DashboardPage />} />
          {/* Masters Routes */}
          <Route path="masters/vegetable-items" element={<Vegetables />} />
          <Route path="masters/state" element={<States />} />
          <Route path="masters/district" element={<Districts />} />
          <Route path="masters/supplier" element={<Suppliers />} />
          <Route path="masters/customer" element={<Customers />} />
          <Route path="masters/employees" element={<Employees />} />
          <Route path="masters/staff" element={<Staffs />} />
          <Route path="masters/settings/upi" element={<UPI />} />
          <Route path="masters/settings/shop" element={<Shop />} />
          {/* Arrivals Routes */}
          <Route path="arrivals/addition" element={<ArrivalAddition />} />
          <Route path="arrivals/lot-history" element={<ArrivalLotHistory />} />
          <Route path="arrivals/settlements" element={<ArrivalSettlements />} />
          <Route path="purchase/arrival-addition" element={<Navigate to="/arrivals/addition" replace />} />
          <Route path="purchase/arrival-settlements" element={<Navigate to="/arrivals/settlements" replace />} />

          {/* Purchase Orders Route */}
          <Route path="purchase" element={<Purchase />} />
          <Route path="purchase/stocks" element={<Stock />} />
          <Route path="purchase/cash-purchases" element={<QuickPurchase />} />
          <Route path="purchase/quick-purchase" element={<Navigate to="/purchase/cash-purchases" replace />} />
          <Route path="purchase/supplier-payments" element={<SupplierPayments />} />
          <Route path="purchase/supplier-returns" element={<SupplierReturns />} />
          <Route path="purchase/box-returns" element={<BoxReturns />} />
          {/* Sales Routes */}
          <Route path="sales/sales-orders" element={<Sales />} />
          <Route path="sales/customer-payments" element={<CustomerPayments />} />
          <Route path="sales/quick-sales" element={<QuickSaleList />} />
          <Route path="sales/quick-sales/new" element={<QuickSale />} />
          <Route path="sales/quick-sales/:id" element={<QuickSale />} />
          <Route path="fast-billing" element={<FastBilling />} />
          {/* Expenses Routes */}
          <Route path="expenses" element={<Expenses />} />
          {/* Cash & Bank Management */}
          <Route path="cash-bank" element={<CashBank />} />
          <Route path="cash-bank/transfer" element={<MoveCashToBank />} />
          <Route path="reports/cash-bank" element={<Navigate to="/cash-bank" replace />} />
          <Route path="attendance" element={<Attendance />} />
          <Route path="profile" element={<Profile />} />
          <Route path="stock-ledgers/stock" element={<Stock />} />
          <Route path="stock-ledgers/spoils-returns" element={<SpoilsReturns />} />
          {/* Report Module */}
          <Route path="reports/purchase-report" element={<PurchaseReport />} />
          <Route path="reports/stock-report" element={<StockReport />} />
          <Route path="reports/lotwise-stock-report" element={<LotwiseStockReport />} />
          <Route path="reports/sales/wholesale/customer-wise" element={<CustomerSalesReport />} />
          <Route path="reports/sales/wholesale/vegetable-wise" element={<VegWiseSales />} />
          <Route path="reports/sales/wholesale/lot-wise" element={<LotWiseSales />} />
          <Route path="reports/sales/customer-wise-report" element={<CustomerSalesReport />} />
          <Route path="reports/sales/vegetable-wise-report" element={<VegWiseSales />} />
          <Route path="reports/sales/lot-wise" element={<LotWiseSales />} />
          <Route path="reports/sales/retail-report" element={<RetailSalesReport />} />
          <Route path="reports/customer-ledger" element={<CustomerLedger />} />
          <Route path="reports/supplier-ledger" element={<SupplierLedger />} />
          <Route path="reports/walk-in-ledger" element={<WalkInLedger />} />
          <Route path="reports/patti-ledger" element={<PattiLedger />} />
          <Route path="reports/daily-summary" element={<Navigate to="/reports/daily-summary/wholesale" replace />} />
          <Route path="reports/daily-summary/financial" element={<FinancialSummary />} />
          <Route path="reports/final-daily-report" element={<FinalDailyReport />} />
          <Route path="reports/financial-summary" element={<FinancialSummary />} />
          <Route path="reports/daily-summary/cash" element={<CashReport />} />
          <Route path="reports/daily-summary/bank" element={<BankReport />} />
          <Route path="reports/cash-report" element={<CashReport />} />
          <Route path="reports/bank-report" element={<BankReport />} />
          <Route path="reports/daily-summary/wholesale" element={<WholesaleDailySummary />} />
          <Route path="reports/daily-summary/retail" element={<RetailDailySummary />} />
          <Route path="reports/wholesale-daily-summary" element={<WholesaleDailySummary />} />
          <Route path="reports/retail-daily-summary" element={<RetailDailySummary />} />
          <Route path="reports/arrivals-report" element={<ArrivalReport />} />
          <Route path="reports/arrival-settlements-report" element={<ArrivalSettlementsReport />} />
          <Route path="reports/outstanding" element={<OutstandingReport />} />


          {/* Quotations Module */}
          <Route path="quotations" element={<Quotations />} />
          {/* Retail Module */}
          <Route path="retail/stock-allocation" element={<StockAllocation />} />
          <Route path="retail/retail-stock" element={<RetailStock />} />
          <Route path="retail/retail-sales" element={<RetailSales />} />
          {/* All Sales */}
          <Route path="sales/all-sales" element={<AllSales />} />
        </Route>
        <Route path="/error/403" element={<Forbidden />} />
        <Route path="*" element={<NotFound />} />
        <Route path="/page-loader" element={<PageLoader />} />
        {/* ── Public Invoice Preview (no auth required) ─────────────────── */}
        <Route path="/invoice/:token" element={<InvoicePreview />} />
      </Routes>
    </Suspense>
  );
}