import { getTrackAndExpandedTakeLaneIds } from '../selectors';
import { StudioProjectState } from '../types';

export default function deleteTracks(trackIdsToDelete: string[]) {
  return (state: StudioProjectState) => {
    let firstUnselectedTrackId = null;
    let lastWasTargetedToDelete = false;
    const trackIds = getTrackAndExpandedTakeLaneIds(state);
    for (let i = 0; i < trackIds.length; i++) {
      const trackId = trackIds[i];
      if (trackIdsToDelete.includes(trackId)) {
        lastWasTargetedToDelete = true;
      } else {
        if (lastWasTargetedToDelete) {
          firstUnselectedTrackId = trackId;
        }
        lastWasTargetedToDelete = false;
      }
    }

    return {
      ...state,
      selection: {
        ...state.selection,
        trackIds: firstUnselectedTrackId ? [firstUnselectedTrackId] : [],
        focusedTrackId: firstUnselectedTrackId,
      },
      tracks: state.tracks
        .filter((track) => !trackIdsToDelete.includes(track.id))
        .map((t) => {
          if (t.takeLanes.some((tl) => trackIdsToDelete.includes(tl.id))) {
            const newTakeLanes = t.takeLanes.filter(
              (tl) => !trackIdsToDelete.includes(tl.id)
            );
            let newSoloTakeLaneId = t.soloTakeLaneId;
            if (
              t.soloTakeLaneId &&
              trackIdsToDelete.includes(t.soloTakeLaneId)
            ) {
              newSoloTakeLaneId = null;
            }
            return {
              ...t,
              soloTakeLaneId: newSoloTakeLaneId,
              takeLanes: newTakeLanes,
              takeLanesExpanded: t.takeLanesExpanded && newTakeLanes.length > 0,
            };
          }
          return t;
        }),
    };
  };
}
