import { v4 as uuidv4 } from 'uuid';

import createTakeLane from '../createTakeLane';
import { getTracksById } from '../selectors';
import { StudioProjectState } from '../types';
import { combineActions } from './combineActions';
import { selectTrackIds } from './dragSelect';
import toggleTakeLanes from './toggleTakeLanes';

export default function addTakeLane(trackId: string) {
  return (state: StudioProjectState): StudioProjectState => {
    const trackIndex = state.tracks.findIndex((track) => track.id === trackId);
    if (trackIndex === -1) {
      return state;
    }
    return {
      ...state,
      tracks: state.tracks.map((track) =>
        track.id === trackId
          ? {
              ...track,
              takeLanes: [
                createTakeLane(
                  track.takeLanes.filter((lane) =>
                    lane.name.includes('Version')
                  ).length + 1
                ),
                ...track.takeLanes,
              ],
            }
          : track
      ),
    };
  };
}

export const addAndSelectTakeLane = (trackId: string) => {
  return (state: StudioProjectState) => {
    const oldTakeLanes = getTracksById(state)[trackId].takeLanes;
    let result = combineActions(
      addTakeLane(trackId),
      toggleTakeLanes(trackId, true)
    )(state);
    const newTakeLanes = getTracksById(result)[trackId].takeLanes;
    const newLane = newTakeLanes.find(
      (t) => !oldTakeLanes.find((t2) => t2.id === t.id)
    );
    if (newLane) {
      result = selectTrackIds(
        newLane.id,
        newLane.id,
        newLane.id,
        false
      )(result);
    }
    return result;
  };
};

export const bumpContentToTakeLane =
  (trackId: string) => (state: StudioProjectState) => ({
    ...state,
    tracks: state.tracks.map((track) => {
      if (track.id === trackId) {
        return {
          ...track,
          takeLanes: [
            {
              ...createTakeLane(
                track.takeLanes.filter((lane) => lane.name.includes('Version'))
                  .length + 1
              ),
              clips: track.clips.map((c) => ({
                ...c,
                id: uuidv4(),
              })),
            },
            ...track.takeLanes,
          ],
        };
      }
      return track;
    }),
  });
