import { useEffect, useRef } from 'react'

type Options = {
    targetLatency?: number
    maxLatency?: number
    catchupRate?: number
    interval?: number
    enabled?: boolean
}

export function useLiveCatchup(
    videoRef: React.RefObject<HTMLVideoElement>,
    options: Options = {}
) {
    const {
        targetLatency = 2.5,
        maxLatency = 6,
        catchupRate = 1.05,
        interval = 1000,
        enabled = true,
    } = options

    const timerRef = useRef<number>()

    useEffect(() => {
        if (!enabled) return
        const video = videoRef.current
        if (!video) return
        timerRef.current = window.setInterval(() => {
            if (!video.buffered.length) return
            const liveEdge = video.buffered.end(video.buffered.length - 1)
            const latency = liveEdge - video.currentTime
            if (latency <= targetLatency) {
                if (video.playbackRate !== 1) {
                    video.playbackRate = 1
                }
                return
            }
            if (latency <= maxLatency) {
                video.playbackRate = catchupRate
                return
            }
            video.playbackRate = 1
            video.currentTime = liveEdge - targetLatency
        }, interval)

        return () => {
            if (timerRef.current) {
                clearInterval(timerRef.current)
            }
            const video = videoRef.current
            if (video && video.playbackRate !== 1) {
                video.playbackRate = 1
            }
        }
    }, [videoRef, targetLatency, maxLatency, catchupRate, interval, enabled])
}

