/*
 * Thresholds that decide when a run of repeated subtitle events is one animation.
 *
 * Three consumers have to agree on these numbers or the same karaoke line is one cue in
 * the sidebar and two hundred in the stats: the file-level cue dedup
 * (`subtitle-cue-dedup`), the live gate that decides what immersion stats record
 * (`subtitle-line-dedup-gate`), and the retroactive database cleanup
 * (`immersion-tracker/duplicate-line-cleanup`).
 */

/**
 * Back-to-back frames of the same animation are authored flush against each other; a
 * tiny tolerance absorbs the centisecond rounding of the ASS timestamp format.
 */
export const DUPLICATE_CUE_GAP_TOLERANCE_SECONDS = 0.05;

/**
 * A burst is a *sequence*. Two adjacent events are two events, not an animation --
 * characters do repeat each other, and a repeated line can legitimately be short.
 */
export const MIN_BURST_EVENTS = 3;

/**
 * Real dialogue holds on screen for about a second, so a run with a couple of much
 * shorter events among them looks like frames. Used only alongside authoring evidence.
 */
export const ANIMATION_FRAME_MAX_SECONDS = 0.3;

/** A karaoke run usually ends on a long "hold" frame, so not every event is short. */
export const MIN_TAGGED_BURST_FRAMES = 2;

/**
 * SRT and VTT carry no authoring metadata at all, so timing is the only signal available
 * -- which makes it the easiest one to get wrong. ASS->SRT conversion leaves frames at
 * ~0.04s, well under any real utterance, and a burst leaves many of them behind. Both
 * bounds are deliberately far stricter than the ASS path: a run of ordinary short lines
 * (`えっ` traded between characters) must not clear them.
 */
export const TIMING_ONLY_FRAME_MAX_SECONDS = 0.1;
export const MIN_TIMING_ONLY_FRAMES = 5;

/**
 * The live gate can only recognise a streaming burst from the inside, so it records the
 * first `MIN_TIMING_ONLY_FRAMES - 1` frames before it starts dropping. That stored
 * residue is one frame short of the timing-only minimum, and the retroactive cleanup
 * accepts it only when every event also sits under the strict timing-only frame bound.
 */
export const MIN_STREAM_RESIDUE_FRAMES = MIN_TIMING_ONLY_FRAMES - 1;
