import { v4 as uuidv4 } from 'uuid';

import clearTimeFromClipCreationIntentList from '../clearTimeFromClipCreationIntentList';
import clearTimeFromClipList from '../clearTimeFromClipList';
import cutClips from '../cutClips';
import getClipsInRange from '../getClipsInRange';
import insertClipsToList from '../insertClipsToList';
import { getDerivedTiming } from '../selectors';
import { StudioProjectState } from '../types';

export default function promoteTakeLane(
  takeLaneId: string,
  startBeats: number,
  endBeats: number
) {
  if (startBeats === endBeats) {
    return (state: StudioProjectState) => state;
  }
  return (state: StudioProjectState) => {
    const track = state.tracks.find((t) =>
      t.takeLanes.some((tl) => tl.id === takeLaneId)
    );
    if (!track) {
      return state;
    }
    const takeLane = track.takeLanes.find((tl) => tl.id === takeLaneId);
    if (!takeLane) {
      return state;
    }

    const newTracks = state.tracks.map((t) =>
      t.id === track.id
        ? {
            ...t,
            clips: insertClipsToList(
              getDerivedTiming(state),
              [
                ...getClipsInRange(
                  startBeats,
                  endBeats,
                  cutClips(
                    getDerivedTiming(state),
                    takeLane.clips,
                    startBeats,
                    endBeats
                  )
                ).map((c) => ({
                  ...c,
                  id: uuidv4(),
                })),
              ],
              clearTimeFromClipList(
                getDerivedTiming(state),
                startBeats,
                endBeats,
                t.clips
              )
            ),
            clipCreationIntents: clearTimeFromClipCreationIntentList(
              startBeats,
              endBeats,
              t.clipCreationIntents
            ),
          }
        : t
    );
    return {
      ...state,
      tracks: newTracks,
    };
  };
}
