import { isBoolean, isObject, isValidFiniteNumber, makeFixer } from './utils';

export type ClipLoop = {
  enabled: boolean;
  startBeats: number;
  endBeats: number;
};

export const fixClipLoopEnabled = makeFixer(isBoolean, false);

export const fixClipLoopStartBeats = makeFixer(isValidFiniteNumber, 0);

export const fixClipLoopEndBeats = makeFixer(isValidFiniteNumber, 0);

export default function fixClipLoop(loop: unknown): ClipLoop {
  if (!isObject(loop)) {
    return {
      enabled: fixClipLoopEnabled(undefined),
      startBeats: fixClipLoopStartBeats(undefined),
      endBeats: fixClipLoopEndBeats(undefined),
    };
  }

  const l = loop as {
    enabled: unknown;
    startBeats: unknown;
    endBeats: unknown;
  };

  const enabled = fixClipLoopEnabled(l.enabled);
  const startBeats = fixClipLoopStartBeats(l.startBeats);
  let endBeats = fixClipLoopEndBeats(l.endBeats);

  // Ensure end is strictly greater than start
  if (endBeats <= startBeats) {
    endBeats = startBeats + 1;
  }

  l.enabled = enabled;
  l.startBeats = startBeats;
  l.endBeats = endBeats;

  return loop as ClipLoop;
}
