import { useCallback } from 'react';

import { useContextSelector } from '@/hooks/useContextSelector';

import StudioContext, { hasExtendTask } from './StudioContext';
import { ClipInsertionSpec, getTimelineInsertionSpecs } from './insertion';
import { getFocusedStudioClip } from './selectors';
import { ClipArrangementPackage } from './types';
import useStudioClipArrangementPackage from './useStudioClipArrangementPackage';

const EMPTY_ARRAY: ClipInsertionSpec[] = [];

export default function useGetInsertionSpecs(
  clipArrangementPackage: ClipArrangementPackage | null
) {
  const focusedStudioClip = useContextSelector(StudioContext, (ctx) =>
    getFocusedStudioClip(ctx.nonPreviewState)
  );
  const mode = useContextSelector(StudioContext, (ctx) => ctx.mode);
  const nonPreviewState = useContextSelector(
    StudioContext,
    (ctx) => ctx.nonPreviewState
  );
  const oneTrackMode = useContextSelector(
    StudioContext,
    (ctx) => ctx.oneTrackMode
  );
  const magnetMode = useContextSelector(StudioContext, (ctx) => ctx.magnetMode);

  const focusedClipArrangementPackage =
    useStudioClipArrangementPackage(focusedStudioClip);

  const getInsertionSpecs = useCallback(() => {
    if (!clipArrangementPackage) return EMPTY_ARRAY;

    const insertionSpecs = getTimelineInsertionSpecs(
      clipArrangementPackage,
      focusedClipArrangementPackage,
      nonPreviewState,
      !hasExtendTask(clipArrangementPackage.clip) && mode === 'edit', // TEMPORARY. disable when tempo alignment for inserts works better.
      oneTrackMode && magnetMode
    );

    return insertionSpecs;
  }, [
    clipArrangementPackage,
    nonPreviewState.tracks,
    oneTrackMode,
    magnetMode,
    mode,
  ]);

  return getInsertionSpecs;
}
