import { isArray, isObject, isString, isValidFiniteNumber } from './utils';

export type StudioSelection = {
  anchorBeats: number;
  focusBeats: number;
  trackIds: string[];
  focusedTrackId: string | null;
  focusedArea: 'tracks' | 'timeline' | null;
};

export const fixSelectionAnchorBeats = (
  anchorBeats: unknown,
  legacyStartBeats: unknown
): number => {
  if (isValidFiniteNumber(anchorBeats)) {
    return anchorBeats;
  }
  // Migration: old selection used startBeats instead of anchorBeats
  if (isValidFiniteNumber(legacyStartBeats)) {
    return legacyStartBeats;
  }
  return 0;
};

export const fixSelectionFocusBeats = (
  focusBeats: unknown,
  legacyEndBeats: unknown
): number => {
  if (isValidFiniteNumber(focusBeats)) {
    return focusBeats;
  }
  // Migration: old selection used endBeats instead of focusBeats
  if (isValidFiniteNumber(legacyEndBeats)) {
    return legacyEndBeats;
  }
  return 0;
};

export const fixSelectionTrackIds = (trackIds: unknown): string[] => {
  if (!isArray(trackIds)) {
    return [];
  }
  return trackIds.filter(isString);
};

export const fixSelectionFocusedTrackId = (
  focusedTrackId: unknown
): string | null => {
  if (focusedTrackId === null) {
    return null;
  }
  if (isString(focusedTrackId)) {
    return focusedTrackId;
  }
  return null;
};

export const fixSelectionFocusedArea = (
  focusedArea: unknown
): 'tracks' | 'timeline' | null => {
  if (focusedArea === null) {
    return null;
  }
  if (focusedArea === 'tracks' || focusedArea === 'timeline') {
    return focusedArea;
  }
  return null;
};

export default function fixSelection(selection: unknown): StudioSelection {
  if (!isObject(selection)) {
    return {
      anchorBeats: 0,
      focusBeats: 0,
      trackIds: [],
      focusedTrackId: null,
      focusedArea: null,
    };
  }

  const s = selection as {
    anchorBeats: unknown;
    focusBeats: unknown;
    startBeats?: unknown;
    endBeats?: unknown;
    trackIds: unknown;
    focusedTrackId: unknown;
    focusedArea: unknown;
  };

  s.anchorBeats = fixSelectionAnchorBeats(s.anchorBeats, s.startBeats);
  s.focusBeats = fixSelectionFocusBeats(s.focusBeats, s.endBeats);
  s.trackIds = fixSelectionTrackIds(s.trackIds);
  s.focusedTrackId = fixSelectionFocusedTrackId(s.focusedTrackId);
  s.focusedArea = fixSelectionFocusedArea(s.focusedArea);

  return selection as StudioSelection;
}
