// app/context/AuthContext.jsx
import { createContext, useContext, useEffect, useMemo, useState } from "react";
import { useApolloClient } from "@apollo/client/react";
import { useGoogleReCaptcha } from "react-google-recaptcha-v3";

import { LogoutSuccessModal } from "../../components/modals/LogoutSuccessModal";
import { getCustomerToken, getStoredCustomer, setStoredCustomer, setCustomerToken } from "../lib/session/sessionStorage";
import { loadCustomerProfile, loginWithMagento, logoutMagento, registerMagentoCustomer } from "../services/authService";

export const AuthContext = createContext(null);

export function AuthProvider({ children }) {
  const apollo = useApolloClient();
  const { executeRecaptcha } = useGoogleReCaptcha();
  const recaptchaReady = typeof executeRecaptcha === "function";

  const [customerTokenState, setCustomerTokenState] = useState(null);
  const [customerState, setCustomerState] = useState(null);
  const [isReady, setIsReady] = useState(false);
  const [logoutSuccessOpen, setLogoutSuccessOpen] = useState(false);

  useEffect(() => {
    try {
      const token = getCustomerToken();
      const cust = getStoredCustomer();
      if (token) setCustomerTokenState(token);
      if (cust) setCustomerState(cust);
    } finally {
      setIsReady(true);
    }
  }, []);

  useEffect(() => {
    if (!customerTokenState) return;
    if (customerState?.group_id != null) return;

    let cancelled = false;

    const loadCustomer = async () => {
      try {
        const customer = await loadCustomerProfile(apollo, customerTokenState);
        if (!customer || cancelled) return;

        setStoredCustomer(customer);
        setCustomerState(customer);
      } catch {
        // Keep the existing session usable even if the refresh call fails.
      }
    };

    loadCustomer();

    return () => {
      cancelled = true;
    };
  }, [apollo, customerState?.group_id, customerTokenState]);

  const login = async (email, password) => {
    const { token, customer } = await loginWithMagento({ apollo, email, password });
    setCustomerTokenState(token);
    setCustomerState(customer);
    return { token, customer };
  };

  const logout = async () => {
    await logoutMagento({ apollo });
    setCustomerToken(null);
    setStoredCustomer(null);

    setCustomerTokenState(null);
    setCustomerState(null);

    setLogoutSuccessOpen(true);
  };

  const registerCustomer = async (first, last, email, password) => {
    return registerMagentoCustomer({
      apollo,
      executeRecaptcha,
      first,
      last,
      email,
      password,
    });
  };

  const value = useMemo(
    () => ({
      isReady,
      customerToken: customerTokenState,
      customer: customerState,
      recaptchaReady,
      login,
      logout,
      registerCustomer,
    }),
    [isReady, customerTokenState, customerState, recaptchaReady]
  );

  return (
    <AuthContext.Provider value={value}>
      <LogoutSuccessModal
        open={logoutSuccessOpen}
        onClose={() => setLogoutSuccessOpen(false)}
        title="Logged out"
        message="You’ve been logged out successfully."
      />
      {children}
    </AuthContext.Provider>
  );
}

export const useAuth = () => useContext(AuthContext);
