import { Switch, Route, Redirect, Router as WouterRouter, useLocation } from "wouter";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { Toaster } from "@/components/ui/toaster";
import { TooltipProvider } from "@/components/ui/tooltip";
import { AuthProvider } from "@/contexts/AuthContext";
import { IncomingNotePopupProvider } from "@/contexts/IncomingNotePopupContext";
import { IncomingNotePopup } from "@/components/notes/incoming-note-popup";
import { useNotificationsSocket } from "@/hooks/use-notifications-socket";
import { useAudioUnlock } from "@/hooks/use-audio-unlock";
import { useAutoplayHint } from "@/hooks/use-autoplay-hint";
// #625-followup: the global keyboard hooks (useScrollFocusedDialogField,
// useVisualViewportVars) were removed because they fired on touch-screen
// laptops too and broke desktop dialog layout. A more targeted approach
// will replace them.
import { UpcomingMeetingAlert } from "@/components/executive-meetings/upcoming-meeting-alert";
import { PushEnablePrompt } from "@/components/push-enable-prompt";
import NotFound from "@/pages/not-found";
import LoginPage from "@/pages/login";
import RegisterPage from "@/pages/register";
import ForgotPasswordPage from "@/pages/forgot-password";
import ResetPasswordPage from "@/pages/reset-password";
import HomePage from "@/pages/home";
import ServicesPage from "@/pages/services";
import NotificationsPage from "@/pages/notifications";
import AdminPage from "@/pages/admin";
import NotesPage from "@/pages/notes";
import MyOrdersPage from "@/pages/my-orders";
import OrdersIncomingPage from "@/pages/orders-incoming";
import ExecutiveMeetingsPage from "@/pages/executive-meetings";
import ProtocolPage from "@/pages/protocol";
import ProtocolRequestPage from "@/pages/protocol-request";
import EmbeddedAppPage from "@/pages/embedded-app";

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      retry: false,
      staleTime: 30_000,
    },
  },
});

function ExecutiveMeetingsRedirect() {
  const [location] = useLocation();
  const suffix =
    typeof window !== "undefined" ? window.location.search + window.location.hash : "";
  const subPath = location.replace(/^\/executive-meetings/, "");
  return <Redirect to={`/meetings${subPath}${suffix}`} replace />;
}

function NotificationsSocketBridge() {
  useNotificationsSocket();
  useAudioUnlock();
  useAutoplayHint();
  return null;
}

function Router() {
  return (
    <AuthProvider>
      <IncomingNotePopupProvider>
      <NotificationsSocketBridge />
      <UpcomingMeetingAlert />
      <IncomingNotePopup />
      <PushEnablePrompt />
      <Switch>
        <Route path="/login" component={LoginPage} />
        <Route path="/register" component={RegisterPage} />
        <Route path="/forgot-password" component={ForgotPasswordPage} />
        <Route path="/reset-password" component={ResetPasswordPage} />
        <Route path="/services" component={ServicesPage} />
        <Route path="/notifications" component={NotificationsPage} />
        <Route path="/admin" component={AdminPage} />
        <Route path="/notes" component={NotesPage} />
        <Route path="/my-orders" component={MyOrdersPage} />
        <Route path="/orders/incoming" component={OrdersIncomingPage} />
        <Route path="/meetings" component={ExecutiveMeetingsPage} />
        <Route path="/protocol" component={ProtocolPage} />
        <Route path="/protocol/:tab" component={ProtocolPage} />
        {/* Back-compat redirect: the page used to live at
            /executive-meetings. Stored PDFs, email links, and bookmarks
            still point there, so catch the old path (and any deep
            sub-path) and forward to /meetings while preserving the
            user's query string and hash. */}
        <Route path="/executive-meetings" component={ExecutiveMeetingsRedirect} />
        <Route path="/executive-meetings/:rest*" component={ExecutiveMeetingsRedirect} />
        <Route path="/embedded/:id" component={EmbeddedAppPage} />
        <Route path="/" component={HomePage} />
        <Route component={NotFound} />
      </Switch>
      </IncomingNotePopupProvider>
    </AuthProvider>
  );
}

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <TooltipProvider>
        <WouterRouter base={import.meta.env.BASE_URL.replace(/\/$/, "")}>
          {/* The public room booking request form must render for logged-OUT
              guests, so it lives OUTSIDE <Router> (and thus outside
              AuthProvider, which redirects unauthenticated users to /login).
              The catch-all falls through to the authenticated app. */}
          <Switch>
            <Route path="/protocol/request" component={ProtocolRequestPage} />
            <Route>
              <Router />
            </Route>
          </Switch>
        </WouterRouter>
        <Toaster />
      </TooltipProvider>
    </QueryClientProvider>
  );
}

export default App;
