import { useEffect } from "react";
import { OAUTH_RESPONSE_MESSAGE_TYPE, OAUTH_STATE_STORAGE_KEY } from "../../commons/costants";

const checkState = (receivedState: string) => {
  const state = sessionStorage.getItem(OAUTH_STATE_STORAGE_KEY);
  console.log("received:", receivedState, "expceted:", state);
  return state === receivedState;
}

const queryToObject = (query: string) => {
  const parameters = new URLSearchParams(query);
  return Object.fromEntries(parameters.entries());
}

export const OAuthPopup = () => {
  useEffect(() => {
    const payload = queryToObject(window.location.search.split("?")[1])
    const state = payload && payload.state;
    const error = payload && payload.error;
    
    if (!window.opener) {
      throw new Error("No window opener");
    }

    if (error) {
      window.opener.postMessage({
        type: OAUTH_RESPONSE_MESSAGE_TYPE,
        error: decodeURI(error) || "OAuth error: An error has occured."
      });
    } else if (state && checkState(state)) {
      window.opener.postMessage({
        type: OAUTH_RESPONSE_MESSAGE_TYPE,
        payload
      })
    } else {
      window.opener.postMessage({
        type: OAUTH_RESPONSE_MESSAGE_TYPE,
        error: "OAuth error: State mismatch."
      });
    }
  }, []);

  return (
    <div className="font-lg mx-auto mt-10">
      Loading...
    </div>
  );
}