import { BrowserRouter, Route, Routes } from "react-router";

import { useReferralFromUrl } from "@/features/referral";
import {
  AccountPage,
  CreateDistributionProfilePage,
  CreateEventPage,
  CreatePlacePage,
  CreatePlaceUnifiedPage,
  EditEventPage,
  EventAttendeesPage,
  EventsDetailsPage,
  EventsListPage,
  HomePage,
  ManageLocalprovidersPage,
  ManagePlacesPage,
  ManageStaffPage,
  ManageVerificationStatsPage,
  ManageVerifiedShamansPage,
  MapPage,
  NotificationsPage,
  Page404,
  PurchasePage,
  ShamanVerificationPage,
  SocialsPage,
  TxHashPlaceholderPage,
  UpdatePlacePage,
  UserPage,
} from "@/pages";
import { NavContainer } from "@/shared/widgets/layout/NavContainer";
import { AuthProvider, GoogleMapsProvider, QueryProvider } from "../providers";
import { ProtectedRoute } from "../providers/authProvider/ui/ProtectedRoute";
import { RestrictedTo } from "../providers/restrictToProvider/RestrictedTo";

const ReferralHandler = () => {
  useReferralFromUrl();
  return null;
};

export const Router = () => {
  return (
    <BrowserRouter>
      <QueryProvider>
        <GoogleMapsProvider>
          <ReferralHandler />
          <Routes>
            <Route element={<AuthProvider />}>
              <Route element={<NavContainer />}>
                <Route path="/" index element={<HomePage />} />
                <Route path="/map" element={<MapPage />} />

                <Route path="/events">
                  <Route index element={<EventsListPage />} />
                  <Route
                    path="/events/:eventId"
                    element={<EventsDetailsPage />}
                  />
                  <Route
                    path="/events/:eventId/attendees"
                    element={<EventAttendeesPage />}
                  />
                  <Route element={<ProtectedRoute />}>
                    <Route
                      path="/events/:eventId/edit"
                      element={<EditEventPage />}
                    />
                  </Route>
                  <Route path="/events/create" element={<CreateEventPage />} />
                </Route>

                <Route
                  path="/place/create"
                  element={<CreatePlaceUnifiedPage />}
                />

                <Route path="/account">
                  <Route index element={<AccountPage />} />
                  <Route element={<ProtectedRoute />}>
                    <Route
                      path="distribution-profiles/create"
                      element={<CreateDistributionProfilePage />}
                    />
                  </Route>
                </Route>

                <Route element={<ProtectedRoute />}>
                  <Route
                    path="/manage/place"
                    element={<RestrictedTo view="manage-places" />}
                  >
                    <Route index element={<ManagePlacesPage />} />
                    <Route
                      path="/manage/place/create"
                      element={<CreatePlacePage />}
                    />
                    <Route
                      path="/manage/place/update"
                      element={<UpdatePlacePage />}
                    />
                  </Route>
                  <Route
                    path="/manage/staff"
                    element={<RestrictedTo view="manage-staff" />}
                  >
                    <Route index element={<ManageStaffPage />} />
                  </Route>
                  <Route
                    path="/manage/localproviders"
                    element={<RestrictedTo view="manage-localproviders" />}
                  >
                    <Route index element={<ManageLocalprovidersPage />} />
                  </Route>
                  <Route
                    path="/manage/verifiedshamans"
                    element={<RestrictedTo view="manage-verifiedshamans" />}
                  >
                    <Route index element={<ManageVerifiedShamansPage />} />
                  </Route>
                  <Route
                    path="/manage/verification-stats"
                    element={<RestrictedTo view="manage-verification-stats" />}
                  >
                    <Route index element={<ManageVerificationStatsPage />} />
                  </Route>
                  <Route
                    path="/notifications"
                    element={<NotificationsPage />}
                  />
                </Route>
                <Route path="/purchase" element={<PurchasePage />} />
                <Route
                  path="/txhash/:txHash"
                  element={<TxHashPlaceholderPage />}
                />
                <Route path="/socials" element={<SocialsPage />} />
                <Route path="/user/:address" element={<UserPage />} />
              </Route>
              <Route path="verify" element={<ShamanVerificationPage />} />
            </Route>
            <Route path="*" element={<Page404 />} />
          </Routes>
        </GoogleMapsProvider>
      </QueryProvider>
    </BrowserRouter>
  );
};

Graph