/**
 * Pure helpers for the video → background-audio handoff (UR-040).
 *
 * TRACES: UR-040 | DR-052 | UT-060
 *
 * Kept free of Svelte/DOM so the handoff arithmetic and state transitions are
 * unit-testable without mounting the player. The component
 * (VideoPlayer.svelte) owns the actual `<video>` teardown and IPC calls.
 */

/**
 * Absolute playback position to resume the audio stream at.
 *
 * Transcoded HLS playback tracks time as `videoElement.currentTime + seekOffset`
 * (the element resets to 0 after each transcode reload; `seekOffset` carries the
 * cumulative offset). Background audio must resume at that ABSOLUTE position, so
 * both terms are summed here — mirroring the `effectiveTime` used elsewhere in
 * the player.
 */
export function computeHandoffPosition(elementCurrentTime: number, seekOffset: number): number {
  const pos = elementCurrentTime + seekOffset;
  return pos > 0 ? pos : 0;
}

/**
 * The handoff state. `wasPlaying` is captured on the way out so play/pause is
 * restored when the app returns to the foreground.
 */
export interface BackgroundAudioState {
  active: boolean;
  wasPlaying: boolean;
}

export const initialHandoffState: BackgroundAudioState = {
  active: false,
  wasPlaying: false,
};

/**
 * Whether a background signal should trigger the audio handoff right now.
 * Only when the toggle is on and we're not already handed off.
 */
export function shouldEnterBackgroundAudio(
  toggleOn: boolean,
  state: BackgroundAudioState
): boolean {
  return toggleOn && !state.active;
}

/**
 * Whether a foreground signal should trigger the return to WebView video.
 * Only when we actually handed off (regardless of the current toggle value, so
 * turning the toggle off while backgrounded still returns cleanly).
 */
export function shouldExitBackgroundAudio(state: BackgroundAudioState): boolean {
  return state.active;
}

/**
 * Whether the `<video>` should start playing again once it reloads on foreground.
 *
 * `wasPlaying` is what the video was doing when we handed off, but the native
 * audio player kept going after that — and the lockscreen/notification can pause
 * it while backgrounded. The player is the authoritative source of play/pause,
 * so an explicit `paused` from it overrides the handoff snapshot; anything less
 * definite (loading, seeking, already-stopped, no state at all) falls back to
 * the snapshot.
 *
 * TRACES: UR-040, UR-005 | DR-052 | UT-060
 */
export function shouldResumeOnForeground(
  wasPlaying: boolean,
  nativeStateKind: string | undefined
): boolean {
  return wasPlaying && nativeStateKind !== "paused";
}
