"use client";
import AuthHydrator from "@/components/constend/authHydrator";
import NavbarSwitcher from "@/components/shared/navbarSwitcher";
import ToastProvider from "@/components/shared/ToastProvider";
import { RootState } from "@/redux/store";
import { usePathname, useRouter } from "next/navigation";
import React, { useEffect, useState } from "react";
import { useSelector } from "react-redux";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";

import { ThemeProvider } from "next-themes";
import { clearAuthStorage } from "@/lib/clearAuthStorage";

// ✅ Move queryClient OUTSIDE the component so it's created only once
const queryClient = new QueryClient();

const Provider = ({ children }: { children: React.ReactNode }) => {
  return (
    <ThemeProvider attribute="class" defaultTheme="light" enableSystem={false}>
      <QueryClientProvider client={queryClient}>
        <AuthHydrator />
        <NavbarSwitcher />
        <RedirectIfLoggedIn />
        <ToastProvider />
        {children}
      </QueryClientProvider>
    </ThemeProvider>
  );
};

export default Provider;

// Define routes that require a logged-out user (auth routes)
// const AUTH_ROUTES = ["/", "/login", "/register", "/login/otp/code"];

function RedirectIfLoggedIn() {
  const { user } = useSelector((state: RootState) => state.user);
  const { isLoggedIn: authIsLoggedIn, isHydrating } = useSelector(
    (state: RootState) => state.auth,
  );
  const router = useRouter();
  const pathname = usePathname();
  const PUBLIC_ROUTES = ["/login", "/register", "/login/otp/code", "/"];
  const isShareProfileRoute = /^\/[^/]+\/[^/]+$/.test(pathname);

  useEffect(() => {
    // Check token from localStorage or cookies to prevent premature redirect
    const hasToken =
      typeof window !== "undefined" &&
      (localStorage.getItem("accessToken") ||
        document.cookie.includes("token="));

    // Determine if user is logged in:
    // 1. If we have a user object in Redux, they are logged in.
    // 2. If we are still hydrating (checking token), assume logged in if a token exists.
    // 3. If hydration is finished, trust authIsLoggedIn.
    const isLoggedIn =
      !!user || (isHydrating ? hasToken : authIsLoggedIn === true);

    // 🔥 not logged in → force login
    if (!isLoggedIn && pathname.startsWith("/dashboard")) {
      router.push("/login");
      clearAuthStorage();
      return;
    }

    if (
      isLoggedIn &&
      PUBLIC_ROUTES.includes(pathname) &&
      !isShareProfileRoute // ✅ don't redirect away from share profiles
    ) {
      router.push("/dashboard");
      return;
    }
  }, [user, authIsLoggedIn, isHydrating, pathname, router]);

  return null;
}
