import { createContext, useEffect, useRef } from 'react';
import { User, UserRole, UserTier } from '../types';
import { identifyUser } from './trackAnalyticsEvent';
import useApiFetchedValue from './useApiFetchedValue';

const SERVER_URL = process.env.NEXT_PUBLIC_SERVER_URL;

const loadingAccount = {
  id: 0,
  username: 'Loading...',
  role: UserRole.Unknown,
  tier: UserTier.Basic,
} as User;

const loggedOutAccount = {
  id: 0,
  username: 'Logged Out',
  role: UserRole.LoggedOut,
  tier: UserTier.Basic,
} as User;

const fetchSelfOrRedirect = async () => {
  const res = await (await fetch(`${SERVER_URL}/auth/whoami`, { credentials: 'include' })).json();
  if (typeof res === 'object' && !res.error) {
    return res;
  }
  return loggedOutAccount;
};

const useAccount = () => {
  const [account, refetch] = useApiFetchedValue<[], User>(fetchSelfOrRedirect);
  const refetchTimeoutRef = useRef<NodeJS.Timeout>();

  useEffect(() => {
    if (account?.role === UserRole.LoggedOut) {
      refetchTimeoutRef.current = setInterval(() => {
        refetch();
      }, 30000);
    }
    window.addEventListener('focus', refetch);
    return () => {
      clearTimeout(refetchTimeoutRef.current);
      window.removeEventListener('focus', refetch);
    };
  }, [account, refetch]);

  useEffect(() => {
    if (account?.id) {
      identifyUser({ userId: String(account.id), traits: { email: account.email, name: account.username } });
    }
  }, [account]);

  return { account: account || loadingAccount, refetch };
};

export const AccountContext = createContext<ReturnType<typeof useAccount>>(undefined as never);

export default useAccount;
