import { FC, useEffect, useState } from "react";
import { Auth } from "./components/Auth/Auth";
import AppRouter from "./routers/AppRouter";
import { getLang, getUrlLang, setListConfigs } from "./helpers/userHelper";
import Cookies from "js-cookie";
import { apiURL, firebaseConfig } from "./untils/const";
import axios from "axios";
import { getAuth } from "firebase/auth";
import { getApp, getApps, initializeApp } from "firebase/app";
import { IUserDetails } from "./store/interface/user";
import { emptyUser } from "./store/state/user";

const app = getApps().length > 0 ? getApp() : initializeApp(firebaseConfig);
const auth = getAuth(app);

export const AppContent: FC = () => {
  const [details, setDetails] = useState<IUserDetails>(emptyUser);
  const urlLang = getUrlLang();

  useEffect(() => {
    const subscriber = auth.onAuthStateChanged(async (user) => {
      if (!user) {
        Cookies.remove("idToken");
        setDetails({
          ...emptyUser,
          loading: false,
          lang: urlLang || getLang(navigator.language),
        });
        return;
      }

      try {
        const authToken = await user.getIdToken();
        const response = await axios.post(`${apiURL}/auth/getUserAuth`, {
          email: user.email,
          uid: user.uid,
        });
        const {
          accountType,
          email,
          lang,
          orgRole,
          contracts,
          flags,
          orgID,
          orgStatus,
          configs,
          isSuperAdmin
        } = response.data.userDetail;

        Cookies.set("idToken", response.data.token);

        if (orgID) {
          await axios.post(
            `${apiURL}/auth/setClaim`,
            {
              uid: user.uid,
              orgID,
            },
            {
              headers: {
                Authorization: `Bearer ${authToken}`,
              },
            },
          );
          await user.getIdToken(true);
        }

        const userLang = urlLang || getLang(lang || navigator.language);
        setDetails({
          uid: user.uid,
          email: email,
          accountType: accountType,
          authenticated: true,
          flags: flags,
          lang: userLang,
          contracts: contracts,
          loading: false,
          orgID: orgID,
          orgStatus: orgStatus,
          orgRole: orgRole,
          configs: setListConfigs(configs),
          isSuperAdmin: isSuperAdmin,
        });
        if (!urlLang) {
          sessionStorage.setItem("lang", userLang);
        }
      } catch (error) {
        console.error("Unable to load authenticated user details", error);
        Cookies.remove("idToken");
        setDetails({
          ...emptyUser,
          loading: false,
          lang: urlLang || getLang(navigator.language),
        });
        await auth.signOut();
      }
    });
    return () => {
      subscriber();
    }; // unsubscribe on unmount
  }, []);

  return (
    <Auth details={details}>
      <AppRouter />
    </Auth>
  );
};
