import "@/styles/globals.css";
import type { AppProps } from "next/app";
import UserLayout from "@/components/home/UserLayout";
import AdminLayout from "@/components/admin/AdminLayout";
import { useRouter } from "next/router";
import { Provider } from "react-redux";
import store from "../Redux/store";
import { QueryClient, QueryClientProvider } from "react-query";
import AuthProvider from "../components/AuthProviders/AuthProvider";
import { SessionProvider } from "next-auth/react"; // Import SessionProvider
import Cookies from "js-cookie";
import { useEffect, useState } from "react";


function decodeJWT(token: string): { [key: string]: any } | null {
  try {
    const base64Url = token.split('.')[1];
    const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
    const payload = JSON.parse(atob(base64));
    return payload;
  } catch (error) {
    console.error("Invalid token", error);
    return null;
  }
}

function checkIssuer(type:'admin'|'user'): boolean {
  const jazz_token = Cookies.get("jazz_token");
  if (!jazz_token) {
    console.error("Jazz token not found in cookies");
    return false;
  }

  const payload = decodeJWT(jazz_token);
  if (!payload) {
    console.error("Failed to decode JWT");
    return false;
  }

  const expectedIssuer = (type == 'admin')
    ? "https://api.jazzagain.com/public/index.php/api/auth/adminLogin"
    : "https://api.jazzagain.com/public/index.php/api/auth/otpVerify"
  ;

  return payload.iss === expectedIssuer;
}

const queryClient = new QueryClient();

export default function App({ Component, pageProps }: AppProps) {
  const [authroized, setAuthroized] = useState(false)
  const router = useRouter();
  const path = router.pathname;

  const isAdminLogin = path === '/admin/login';
  const isAdminRoute = path.startsWith("/admin");
  const isNoLayoutRoute = path === "/airtel";

  const Layout = isAdminRoute ? AdminLayout : UserLayout;

  useEffect(() => {
    function verifyAuthroized() {
      if (isAdminRoute && !isAdminLogin && !checkIssuer('admin')) {
        router.push('/')
        return
      }
      setAuthroized(true)
    }
    if (!authroized) verifyAuthroized()
  }, [])
  
  return (!isAdminRoute || (isAdminRoute && authroized)) && (
    <QueryClientProvider client={queryClient}>
      <Provider store={store}>
        <SessionProvider session={pageProps.session}>
          {(path === '/admin/login') ? (
            <Component {...pageProps} />
          ) : isNoLayoutRoute ? (
            <AuthProvider>
              <Component {...pageProps} />
            </AuthProvider>
          ) : (
            <Layout route={path}>
              <AuthProvider>
                <Component {...pageProps} />
              </AuthProvider>
            </Layout>
          )}
        </SessionProvider>
      </Provider>
    </QueryClientProvider>
  );
}
