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 { BrowserRouter, Routes, Route, useLocation } from "react-router-dom";
import { AnimatePresence } from "framer-motion";
import DynamicSlugPage from "./pages/DynamicSlugPage";
import PagePreview from "./pages/PagePreview";
import Login from "./pages/Login";
import { AiAssistant } from "./components/AiAssistant";
import { AuthProvider, useAuth } from "./contexts/AuthContext";
import { SiteSettingsProvider } from "./contexts/SiteSettingsContext";
import { SiteChromeProvider } from "./contexts/SiteChromeContext";
import { ProtectedRoute } from "./components/ProtectedRoute";
import { GuestRoute } from "./components/GuestRoute";
import { SiteLayout } from "./components/SiteLayout";

const queryClient = new QueryClient();

const AnimatedRoutes = () => {
  const location = useLocation();
  return (
    <AnimatePresence mode="wait">
      <Routes location={location} key={location.pathname}>
        <Route path="/signin" element={<GuestRoute><Login /></GuestRoute>} />
        <Route element={<ProtectedRoute><SiteLayout /></ProtectedRoute>}>
          <Route path="/preview/*" element={<PagePreview />} />
          <Route path="/" element={<DynamicSlugPage />} />
          <Route path="*" element={<DynamicSlugPage />} />
        </Route>
      </Routes>
    </AnimatePresence>
  );
};

const AuthenticatedAiAssistant = () => {
  const { isAuthenticated } = useAuth();
  if (!isAuthenticated) return null;
  return <AiAssistant />;
};

const App = () => (
  <QueryClientProvider client={queryClient}>
    <TooltipProvider>
      <Toaster />
      <Sonner />
      <BrowserRouter>
        <SiteSettingsProvider>
          <SiteChromeProvider>
            <AuthProvider>
              <AnimatedRoutes />
              <AuthenticatedAiAssistant />
            </AuthProvider>
          </SiteChromeProvider>
        </SiteSettingsProvider>
      </BrowserRouter>
    </TooltipProvider>
  </QueryClientProvider>
);

export default App;
