import { useCallback, useState, type FC, type ReactNode } from "react";
import { OAuthContext } from ".";
import { codeApi } from "@/api/code";

interface IOAuthProvider {
  children: ReactNode;
}

export const OAuthProvider: FC<IOAuthProvider> = ({ children }) => {
  const [active, setActive] = useState(false);
  const [clientID, setClientID] = useState("");
  const [redirectURI, setRedirectURI] = useState("");
  const [scope, setScope] = useState<string[]>([]);
  const [state, setState] = useState("");
  const [nonce, setNonce] = useState("");

  const selectSession = useCallback(
    async (token: string) => {
      if (active && redirectURI) {
        const codeResponse = await codeApi(token, nonce);

        const params = new URLSearchParams({
          code: codeResponse.code,
          state,
        });

        window.location.replace(`${redirectURI}?${params.toString()}`);
      }
    },
    [active, nonce, redirectURI, state],
  );

  return (
    <OAuthContext.Provider
      value={{
        active,
        clientID,
        redirectURI,
        scope,
        state,
        nonce,
        setActive,
        setClientID,
        setRedirectURI,
        setScope,
        setState,
        setNonce,
        selectSession,
      }}
    >
      {children}
    </OAuthContext.Provider>
  );
};
