import { Clip } from '@/state/clipStore';

export default function describeClip(
  clip: Clip,
  expectedMetadataDuration: number | null = null
): {
  expectedContentDurationSeconds: number | null;
  expectedContentEndSeconds: number | null;

  contentDurationSeconds: number | null;
  contentStartSeconds: number;
  contentEndSeconds: number | null;
} {
  const knownDuration = clip.metadata.duration ?? null;

  const isInfill = [
    'infill',
    'cover_infill',
    'artist_infill',
    'infill_intro',
    'infill_outro',
  ].includes(clip.metadata.task!);

  const isFixedInfill = ['fixed_infill'].includes(clip.metadata.task!);

  const isExtend = [
    'extend',
    'upload_extend',
    'artist_extend',
    'artist_cover_extend',
  ].includes(clip.metadata.task!);

  if (isFixedInfill) {
    const historyEntry = clip.metadata.history?.slice(-1)[0] as any;
    const infillStartSeconds =
      historyEntry.infill_start_s - historyEntry.infill_context_start_s;
    const infillEndSeconds =
      historyEntry.infill_end_s - historyEntry.infill_context_start_s;

    return {
      expectedContentDurationSeconds: infillEndSeconds - infillStartSeconds,
      expectedContentEndSeconds: infillEndSeconds,

      contentDurationSeconds: infillEndSeconds - infillStartSeconds,
      contentStartSeconds: infillStartSeconds,
      contentEndSeconds: infillEndSeconds,
    };
  } else if (isInfill) {
    const historyEntry = clip.metadata.history?.slice(-1)[0] as any;

    const startPaddingSeconds = Math.min(
      historyEntry.include_history_s,
      historyEntry.infill_start_s - historyEntry.infill_context_start_s
    );
    const endPaddingSeconds = Math.min(
      historyEntry.include_future_s,
      historyEntry.infill_context_end_s - historyEntry.infill_end_s
    );

    const infillDurationSeconds = knownDuration
      ? knownDuration - (startPaddingSeconds + endPaddingSeconds)
      : null;

    const expectedContentDurationSeconds = expectedMetadataDuration
      ? expectedMetadataDuration - (startPaddingSeconds + endPaddingSeconds)
      : null;
    const expectedContentEndSeconds = expectedMetadataDuration
      ? expectedMetadataDuration - endPaddingSeconds
      : null;

    const infillStartSeconds = startPaddingSeconds;
    const infillEndSeconds = infillDurationSeconds
      ? infillStartSeconds + infillDurationSeconds
      : null;
    return {
      expectedContentDurationSeconds,
      expectedContentEndSeconds,

      contentDurationSeconds: infillDurationSeconds,
      contentStartSeconds: infillStartSeconds,
      contentEndSeconds: infillEndSeconds,
    };
  } else if (isExtend) {
    const historyEntry = clip.metadata.history?.slice(-1)[0] as any;
    const startPaddingSeconds = historyEntry?.include_history_s || 0;
    return {
      expectedContentDurationSeconds: expectedMetadataDuration
        ? expectedMetadataDuration - startPaddingSeconds
        : null,
      expectedContentEndSeconds: expectedMetadataDuration,

      contentDurationSeconds: knownDuration
        ? knownDuration - startPaddingSeconds
        : null,
      contentStartSeconds: startPaddingSeconds,
      contentEndSeconds: knownDuration,
    };
  } else {
    return {
      expectedContentDurationSeconds: knownDuration ?? expectedMetadataDuration,
      expectedContentEndSeconds: knownDuration ?? expectedMetadataDuration,

      contentDurationSeconds: knownDuration ?? expectedMetadataDuration,
      contentStartSeconds: 0,
      contentEndSeconds: knownDuration ?? expectedMetadataDuration,
    };
  }
}
