import { useCallback } from 'react';

import { useStores } from '@/app/(root)/AppProviders';
import { toast } from '@/components/toast/Toast';
import TrashToast from '@/components/toast/TrashToast';
import { useContextSelector } from '@/hooks/useContextSelector';
import { Clip } from '@/state/clipStore';

import { ClipBrowserRegistryContext } from './useClipBrowserRegistry';

//delete lines marked with backwards compat after shipping library v2
export default function useTrashActions() {
  const { clips, library, trash } = useStores();
  const clipChanged = useContextSelector(
    ClipBrowserRegistryContext,
    (context) => context.clipChanged
  );

  const restoreFromTrash = useCallback(
    async (clipIds: string[]) => {
      const selectedClips = clipIds
        .map((id) => clips.clipById[id])
        .filter((c): c is Clip => !!c);

      clips.trashClips(clipIds, false);

      clipIds.forEach((clipId) => {
        library.addToLibrary(clipId);
        clips.addToCreatePage(clipId);
        trash?.removeFromTrash(clipId);
        clipChanged(clips.clipById[clipId]);
      });

      toast({
        duration: 4000,
        isClosable: true,
        position: 'bottom',
        render: () => (
          <TrashToast
            clips={selectedClips}
            isTrashed={false}
            undoTrash={() => {
              clips.trashClips(clipIds, true);
              clipIds.forEach((clipId) => {
                trash?.addToTrash(clipId);
                clipChanged(clips.clipById[clipId]);
                library.removeFromLibrary(clipId); // backwards compat
                clips.removeFromCreatePage(clipId); // backwards compat
              });
            }}
          />
        ),
      });
    },
    [clips, library, trash, clipChanged]
  );

  const moveToTrash = useCallback(
    async (clipIds: string[]) => {
      const selectedClips = clipIds
        .map((id) => clips.clipById[id])
        .filter((c): c is Clip => !!c);

      clips.trashClips(clipIds, true);

      clipIds.forEach((clipId) => {
        library.removeFromLibrary(clipId);
        clips.removeFromCreatePage(clipId);
        trash?.addToTrash(clipId);
        clipChanged(clips.clipById[clipId]);
      });

      toast({
        duration: 4000,
        isClosable: true,
        position: 'bottom',
        render: () => (
          <TrashToast
            clips={selectedClips}
            isTrashed={true}
            undoTrash={() => {
              clips.trashClips(clipIds, false);
              clipIds.forEach((clipId) => {
                trash?.removeFromTrash(clipId);
                clipChanged(clips.clipById[clipId]);
                library.addToLibrary(clipId); // backwards compat
                clips.addToCreatePage(clipId); // backwards compat
              });
            }}
          />
        ),
      });
    },
    [clips, library, trash, clipChanged]
  );

  return { restoreFromTrash, moveToTrash };
}
