import clearTimeFromTrack from '../actionHelpers/clearTimeFromTrack';
import moveTrackContentAfter from '../actionHelpers/moveTrackContentAfter';
import {
  getDerivedTiming,
  getFocusedClipCreationIntent,
  getSongStartBeats,
} from '../selectors';
import { StudioProjectState } from '../types';

export default function magneticDelete(startBeats: number, endBeats: number) {
  return (state: StudioProjectState): StudioProjectState => {
    const focusedClipCreationIntent = getFocusedClipCreationIntent(state);
    if (focusedClipCreationIntent) {
      return {
        ...state,
        metadata: {
          ...state.metadata,
          [startBeats === endBeats ? 'usedSplit' : 'usedDelete']: true,
        },
        tracks: state.tracks.map((track) =>
          track.clipCreationIntents.find(
            (c) => c.id === focusedClipCreationIntent.id
          )
            ? {
                ...track,
                clipCreationIntents: track.clipCreationIntents.filter(
                  (c) => c.id !== focusedClipCreationIntent.id
                ),
              }
            : track
        ),
      };
    }
    const songStartBeats = getSongStartBeats(state);
    const selectionDuration = endBeats - startBeats;
    const roundedSelectionDuration = Math.round(selectionDuration);

    const adjustmentDelta =
      startBeats > songStartBeats + 0.00001
        ? -selectionDuration
        : endBeats >= 0
          ? -endBeats
          : -roundedSelectionDuration;

    const timing = getDerivedTiming(state);

    return {
      ...state,
      metadata: {
        ...state.metadata,
        [startBeats === endBeats ? 'usedSplit' : 'usedDelete']: true,
      },
      tracks: state.tracks.map((track) => {
        if (state.selection.trackIds.includes(track.id)) {
          let newTrack = clearTimeFromTrack(
            timing,
            startBeats,
            endBeats,
            track
          );
          newTrack = moveTrackContentAfter(
            timing,
            newTrack,
            startBeats,
            adjustmentDelta
          );
          return newTrack;
        } else {
          return track;
        }
      }),
      selection: {
        ...state.selection,
        anchorBeats: endBeats + adjustmentDelta,
        focusBeats: endBeats + adjustmentDelta,
        focusedArea: 'timeline',
      },
    };
  };
}
