import { lazy, Suspense, useEffect, useState } from "react";
import { Routes, Route, Navigate, useLocation } from "react-router-dom";
import AppLayout from "./layouts/AppLayout.jsx";
import AdminLayout from "./layouts/AdminLayout.jsx";
import ErrorBoundary from "./components/ErrorBoundary.jsx";
import ScrollToTop from "./components/ScrollToTop.jsx";
import { ROUTES } from "./constants/routes.js";
import { sessionService } from "./services/sessionService.js";
import { HomeConfigProvider } from "./contexts/HomeConfigContext.jsx";
import { CartProvider } from "./contexts/CartContext.jsx";
import { activityLogService } from "./services/activityLogService.js";
import { subscribeToGlobalLoading } from "./services/api.js";
import GlobalLoader from "./components/GlobalLoader.jsx";

// Lazy-loaded user pages
const Home = lazy(() => import("./modules/user/Home.jsx"));
const CategoryPage = lazy(() => import("./modules/user/CategoryPage.jsx"));
const ProductDetails = lazy(() => import("./modules/user/ProductDetails.jsx"));
const Cart = lazy(() => import("./modules/user/Cart.jsx"));
const Wishlist = lazy(() => import("./modules/user/Wishlist.jsx"));
const Profile = lazy(() => import("./modules/user/Profile.jsx"));
const Checkout = lazy(() => import("./modules/user/Checkout.jsx"));
const Orders = lazy(() => import("./modules/user/Orders.jsx"));
const OrderDetails = lazy(() => import("./modules/user/OrderDetails.jsx"));
const Unauthorized = lazy(() => import("./modules/user/Unauthorized.jsx"));
const NotFound = lazy(() => import("./modules/user/NotFound.jsx"));
const AboutUs = lazy(() => import("./modules/user/AboutUs.jsx"));
const ContactUs = lazy(() => import("./modules/user/ContactUs.jsx"));
const PrivacyPolicy = lazy(() => import("./modules/user/PrivacyPolicy.jsx"));
const TermsConditions = lazy(
  () => import("./modules/user/TermsConditions.jsx"),
);
const FAQ = lazy(() => import("./modules/user/FAQ.jsx"));
const ShippingReturns = lazy(
  () => import("./modules/user/ShippingReturns.jsx"),
);
const Search = lazy(() => import("./modules/user/Search.jsx"));

// Lazy-loaded admin pages
const AdminDashboard = lazy(() => import("./modules/admin/AdminDashboard.jsx"));
const AdminLogin = lazy(() => import("./modules/admin/AdminLogin.jsx"));
const AdminHome = lazy(() => import("./modules/admin/AdminHome.jsx"));
const AdminProducts = lazy(() => import("./modules/admin/AdminProducts.jsx"));
const AdminCategories = lazy(
  () => import("./modules/admin/AdminCategories.jsx"),
);
const AdminSubcategories = lazy(
  () => import("./modules/admin/AdminSubcategories.jsx"),
);
const AdminOrders = lazy(() => import("./modules/admin/AdminOrders.jsx"));
const AdminLogs = lazy(() => import("./modules/admin/AdminLogs.jsx"));
const AdminPincodes = lazy(() => import("./modules/admin/AdminPincodes.jsx"));

function RequireAuth({ children }) {
  if (!sessionService.isAuthenticated()) {
    return <Navigate to={ROUTES.user.profile} replace />;
  }
  return children;
}

function RequireAdmin({ children }) {
  const user = sessionService.getUser();
  if (!sessionService.isAuthenticated()) {
    return <Navigate to={ROUTES.admin.login} replace />;
  }
  if (!user || user.role !== "admin") {
    return <Navigate to={ROUTES.user.unauthorized} replace />;
  }
  return children;
}

export default function App() {
  const location = useLocation();
  const [globalLoading, setGlobalLoading] = useState(false);

  useEffect(() => {
    const unsubscribe = subscribeToGlobalLoading(setGlobalLoading);
    return unsubscribe;
  }, []);

  useEffect(() => {
    if (!sessionService.isAuthenticated()) {
      return;
    }

    activityLogService
      .logVisit({
        page: location.pathname,
        title: document?.title || "",
        source: "web-app",
      })
      .catch(() => {});
  }, [location.pathname]);

  return (
    <ErrorBoundary>
      <CartProvider>
        <HomeConfigProvider>
          <ScrollToTop />
          <Suspense fallback={<GlobalLoader open />}>
            <Routes>
              <Route element={<AppLayout />}>
                <Route path={ROUTES.user.home} element={<Home />} />
                <Route
                  path={ROUTES.user.categories}
                  element={<CategoryPage />}
                />
                <Route
                  path={ROUTES.user.categoryBrowse}
                  element={<CategoryPage />}
                />
                <Route
                  path={ROUTES.user.product}
                  element={<ProductDetails />}
                />
                <Route path={ROUTES.user.search} element={<Search />} />
                <Route path={ROUTES.user.cart} element={<Cart />} />
                <Route
                  path={ROUTES.user.wishlist}
                  element={
                    <RequireAuth>
                      <Wishlist />
                    </RequireAuth>
                  }
                />
                <Route path={ROUTES.user.profile} element={<Profile />} />
                <Route
                  path={ROUTES.user.checkout}
                  element={
                    <RequireAuth>
                      <Checkout />
                    </RequireAuth>
                  }
                />
                <Route
                  path={ROUTES.user.orders}
                  element={
                    <RequireAuth>
                      <Orders />
                    </RequireAuth>
                  }
                />
                <Route
                  path={ROUTES.user.orderDetails}
                  element={
                    <RequireAuth>
                      <OrderDetails />
                    </RequireAuth>
                  }
                />
                <Route path={ROUTES.user.about} element={<AboutUs />} />
                <Route path={ROUTES.user.contact} element={<ContactUs />} />
                <Route
                  path={ROUTES.user.privacyPolicy}
                  element={<PrivacyPolicy />}
                />
                <Route path={ROUTES.user.terms} element={<TermsConditions />} />
                <Route path={ROUTES.user.faq} element={<FAQ />} />
                <Route
                  path={ROUTES.user.shippingReturns}
                  element={<ShippingReturns />}
                />
                <Route
                  path={ROUTES.user.unauthorized}
                  element={<Unauthorized />}
                />
                <Route path={ROUTES.admin.login} element={<AdminLogin />} />
                <Route
                  path="/"
                  element={<Navigate to={ROUTES.user.home} replace />}
                />
              </Route>

              <Route
                path={ROUTES.admin.root}
                element={
                  <RequireAdmin>
                    <AdminLayout />
                  </RequireAdmin>
                }
              >
                <Route index element={<AdminDashboard />} />
                <Route path={ROUTES.admin.home} element={<AdminHome />} />
                <Route
                  path={ROUTES.admin.products}
                  element={<AdminProducts />}
                />
                <Route
                  path={ROUTES.admin.categories}
                  element={<AdminCategories />}
                />
                <Route
                  path={ROUTES.admin.subcategories}
                  element={<AdminSubcategories />}
                />
                <Route path={ROUTES.admin.orders} element={<AdminOrders />} />
                <Route
                  path={ROUTES.admin.pincodes}
                  element={<AdminPincodes />}
                />
                <Route path={ROUTES.admin.logs} element={<AdminLogs />} />
              </Route>

              <Route path={ROUTES.fallback.notFound} element={<NotFound />} />
            </Routes>
          </Suspense>
          <GlobalLoader open={globalLoading} />
        </HomeConfigProvider>
      </CartProvider>
    </ErrorBoundary>
  );
}
