import { StudioContextType } from '../StudioContext';
import createTrack from '../createTrack';
import {
  getDerivedTiming,
  getReducedStudioClipsByTrackId,
  getSelectionStartBeats,
} from '../selectors';
import { ExtendPayload } from '../types';
import prepareExtendRequest from './prepareExtendRequest';
import resolveStyles from './resolveStyles';

export const prepareExtendSelectionRequest = async (
  studioContext: StudioContextType
) => {
  const { stateRef } = studioContext;
  const state = stateRef.current;

  if (!studioContext.studioProjectId) {
    throw new Error('No studio project id');
  }

  if (!state.selection.focusedTrackId) {
    throw new Error('No focused track id');
  }

  const { styles, excludeStyles } = resolveStyles(studioContext);
  const lyrics = studioContext.lyricsEditController.getLyricsEditSpec();

  const payload: ExtendPayload = {
    timing: getDerivedTiming(state),
    modelTier: studioContext.modelTier,
    modelOverride: studioContext.modelOverride,
    styles,
    excludeStyles,
    lyrics,
    lyricsUpdated:
      lyrics.originalPlaintextLyrics !== lyrics.editedPlaintextLyrics,
    studioProjectId: studioContext.studioProjectId,
    projectId: studioContext.projectId,
    tracks: [
      {
        ...createTrack(),
        clips:
          getReducedStudioClipsByTrackId(state)[state.selection.focusedTrackId],
      },
    ],

    extendFromBeats: getSelectionStartBeats(state),
  };

  return await prepareExtendRequest(studioContext.clipsStore, payload);
};

export const prepareExtendFromPointRequest = async (
  studioContext: StudioContextType,
  extendFromBeats: number
) => {
  const { stateRef } = studioContext;
  const state = stateRef.current;

  if (!studioContext.studioProjectId) {
    throw new Error('No studio project id');
  }

  if (!state.selection.focusedTrackId) {
    throw new Error('No focused track id');
  }

  const { styles, excludeStyles } = resolveStyles(studioContext);
  const lyrics = studioContext.lyricsEditController.getLyricsEditSpec();

  const payload: ExtendPayload = {
    timing: getDerivedTiming(state),
    modelTier: studioContext.modelTier,
    modelOverride: studioContext.modelOverride,
    styles,
    excludeStyles,
    lyrics,
    lyricsUpdated:
      lyrics.originalPlaintextLyrics !== lyrics.editedPlaintextLyrics,
    studioProjectId: studioContext.studioProjectId,
    projectId: studioContext.projectId,
    tracks: [
      {
        ...createTrack(),
        clips:
          getReducedStudioClipsByTrackId(state)[state.selection.focusedTrackId],
      },
    ],

    extendFromBeats: extendFromBeats,
  };

  return await prepareExtendRequest(studioContext.clipsStore, payload);
};
