import { useCallback, useContext, useMemo } from 'react';

import { useStores } from '@/app/(root)/AppProviders';
import { ModalTypes } from '@/components/modal/constants/ModalTypes';
import { useModalContext } from '@/context/ModalContext';
import PublishSongEventType from '@/logging/eventTypes/PublishSongEventType';
import logWebUserEvent from '@/logging/logWebUserEvent';
import { Clip } from '@/state/clipStore';

import ContestClipContext from './useContestClip';

export default function usePublishClip(clip: Clip | null) {
  const { library, menus } = useStores();
  const { openModalWithData } = useModalContext();
  const { isContestSubmission, isContestEligible } =
    useContext(ContestClipContext);

  const isPublished = useMemo(() => {
    return clip?.is_public || false;
  }, [clip?.is_public]);

  const publishClicked = useCallback(() => {
    if (!clip) return;

    const isEligibleForContest = isContestEligible({ clip });

    const eventProps: PublishSongEventType = isEligibleForContest
      ? {
          actionName: 'SubmitRemixButtonClicked',
          principalObjectType: 'song',
          principalObjectValue: clip.id,
        }
      : {
          actionName: 'PublishButtonPublishClicked',
          principalObjectType: 'song',
          principalObjectValue: clip.id,
        };

    logWebUserEvent(eventProps);
    library.setActiveClip(clip);
    menus.openModal(ModalTypes.PUBLISH_SONG);
  }, [library, menus, clip, isContestEligible]);

  const unpublishClicked = useCallback(() => {
    if (!clip) return;

    const isSubmission = isContestSubmission({ clip });

    const eventProps: PublishSongEventType = isSubmission
      ? {
          actionName: 'SubmitRemixButtonUnpublishClicked',
          principalObjectType: 'song',
          principalObjectValue: clip.id,
          context: {
            contestId: clip.metadata?.contest_ids?.[0] ?? null,
          },
        }
      : {
          actionName: 'PublishButtonUnpublishClicked',
          principalObjectType: 'song',
          principalObjectValue: clip.id,
        };
    logWebUserEvent(eventProps);
    openModalWithData(ModalTypes.UNPUBLISH_SONG, { clipId: clip.id });
  }, [openModalWithData, clip, isContestSubmission]);

  const togglePublishClicked = useCallback(() => {
    if (!clip) return;
    if (isPublished) {
      unpublishClicked();
    } else {
      publishClicked();
    }
  }, [isPublished, publishClicked, unpublishClicked, !!clip]);

  return {
    togglePublishClicked,
    publishClicked,
    unpublishClicked,
    isPublished,
  };
}
