import {usePlayerStore} from '@common/player/hooks/use-player-store';
import {useCallback, useEffect, useState} from 'react';
import {YoutubeMediaItem} from '@common/player/media-item';
import {usePlayerActions} from '@common/player/hooks/use-player-actions';
import {youtubeIdFromSrc} from '@common/player/utils/youtube-id-from-src';

const queryString =
  '&controls=0&disablekb=1&enablejsapi=1&iv_load_policy=3&modestbranding=1&playsinline=1&rel=0&showinfo=0';

export function useYoutubeProviderSrc(
  loadVideoById: (videoId: string) => void
) {
  const {getState, emit} = usePlayerActions();
  const options = usePlayerStore(s => s.options);
  const media = usePlayerStore(s => s.cuedMedia) as
    | YoutubeMediaItem
    | undefined;

  const origin = options.youtube?.useCookies
    ? 'https://www.youtube.com'
    : 'https://www.youtube-nocookie.com';

  const [initialVideoId, setInitialVideoId] = useState(() => {
    if (media?.src && media.src !== 'resolve') {
      return youtubeIdFromSrc(media.src);
    }
  });

  const updateVideoIds = useCallback(
    (src: string) => {
      const videoId = youtubeIdFromSrc(src);
      if (!videoId) return;

      // use setState callback, so we don't need to use "initialVideoId" in the dependency array
      setInitialVideoId(prevId => {
        if (!prevId) {
          return videoId;
        } else {
          // changing src of iframe will cause it to fully reload, use "loadVideoById" api method instead
          loadVideoById(videoId);
          return prevId;
        }
      });
    },
    [loadVideoById]
  );

  useEffect(() => {
    if (media?.src && media.src !== 'resolve') {
      updateVideoIds(media.src);
    } else if (media) {
      emit('buffering', {isBuffering: true});
      options.youtube?.srcResolver?.(media).then(item => {
        // check if resolved media matches the one currently in the store to prevent race conditions.
        // check against current value in store, because this callback will close over old value
        if (item?.src && getState().cuedMedia?.id === item.id) {
          updateVideoIds(item.src);
        }
      });
    }
    // only update when media id changes to prevent infinite loops
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [options, updateVideoIds, media?.id]);

  return {
    initialVideoUrl: initialVideoId
      ? `${origin}/embed/${initialVideoId}?${queryString}&autoplay=${
          options.autoPlay ? '1' : '0'
        }&mute=${getState().muted ? '1' : '0'}&start=${media?.initialTime ?? 0}`
      : undefined,
    origin,
  };
}
