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

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

export const fixProjectLoopEnabled = makeFixer(isBoolean, false);

export const fixProjectLoopStartBeats = makeFixer(isValidFiniteNumber, 0);

export const fixProjectLoopEndBeats = makeFixer(isValidFiniteNumber, 32);

export default function fixProjectLoop(loop: unknown): ProjectLoop {
  if (!isObject(loop)) {
    return {
      enabled: fixProjectLoopEnabled(undefined),
      startBeats: fixProjectLoopStartBeats(undefined),
      endBeats: fixProjectLoopEndBeats(undefined),
    };
  }

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

  const enabled = fixProjectLoopEnabled(l.enabled);
  const startBeats = fixProjectLoopStartBeats(l.startBeats);
  let endBeats = fixProjectLoopEndBeats(l.endBeats);

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

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

  return loop as ProjectLoop;
}
