/**
 * This component is responsible for updating the title of the page when
 * different state changes occur.
 * If the stream live state changes, or chat messages come in while the
 * page is backgrounded, this component will update the title to reflect it. *
 * @component
 */
import { FC, useEffect } from 'react';
import { useRecoilValue } from 'recoil';
import { serverStatusState, chatMessagesAtom } from '../stores/ClientConfigStore';

export const TitleNotifier: FC = () => {
  const chatMessages = useRecoilValue(chatMessagesAtom);
  const serverStatus = useRecoilValue(serverStatusState);

  let backgrounded = false;
  let defaultTitle = '';

  const onBlur = () => {
    backgrounded = true;
    defaultTitle = window.document.title;
  };

  const onFocus = () => {
    backgrounded = false;
    window.document.title = defaultTitle;
  };

  const listenForEvents = () => {
    // Listen for events that should update the title
    window.addEventListener('blur', onBlur);
    window.addEventListener('focus', onFocus);
  };

  useEffect(() => {
    defaultTitle = window.document.title;
    listenForEvents();

    return () => {
      window.removeEventListener('focus', onFocus);
      window.removeEventListener('blur', onBlur);
    };
  }, []);

  useEffect(() => {
    const { online } = serverStatus;

    if (!backgrounded || !online) {
      return;
    }

    window.document.title = `💬 :: ${defaultTitle}`;
  }, [chatMessages]);

  useEffect(() => {
    if (!backgrounded) {
      return;
    }

    const { online } = serverStatus;

    if (online) {
      window.document.title = ` 🟢 :: ${defaultTitle}`;
    } else if (!online) {
      window.document.title = ` 🔴 :: ${defaultTitle}`;
    }
  }, [serverStatusState]);

  return null;
};
