import { isEqual } from 'lodash-es';
import { usePathname } from 'next/navigation';
import { useEffect, useRef } from 'react';

import { useStores } from '@/app/(root)/AppProviders';
import PageViewedEventType from '@/logging/eventTypes/PageViewedEventType';
import logWebUserEvent from '@/logging/logWebUserEvent';

export default function usePageViewLog(pageViewedEvent: PageViewedEventType) {
  const pathname = usePathname();
  const { session, featureSession } = useStores();
  const lastPageViewedProps = useRef<PageViewedEventType | null>(null);
  const resetSessionTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(
    null
  );
  useEffect(() => {
    if (!session.sessionIsLoaded) return;
    if (resetSessionTimeoutRef.current) {
      // if this `useEffect` is run twice in rapid succession, we don't want to reset the feature session.
      // resetFeatureSession should only run if we're permanently leaving the page.
      clearTimeout(resetSessionTimeoutRef.current);
      resetSessionTimeoutRef.current = null;
    }
    if (isEqual(lastPageViewedProps.current, pageViewedEvent)) {
      return;
    }
    lastPageViewedProps.current = pageViewedEvent;
    featureSession.initializeFeatureSession(pathname);
    logWebUserEvent(pageViewedEvent);
    return () => {
      resetSessionTimeoutRef.current = setTimeout(
        () => featureSession.resetFeatureSession(),
        150
      );
    };
  }, [session.sessionIsLoaded, pageViewedEvent, featureSession, pathname]);
}
