using System;

namespace IndieExchange
{
    // Pure playback accounting: background time, buffering and forward seeks do not earn watch time.
    internal sealed class RewardPlayback
    {
        public double Duration { get; }
        public double Watched { get; private set; }
        private double previous, activeTime, sinceProgress;
        private bool wasActive = true, completed, invalidated;
        public RewardPlayback(double duration) { Duration = duration; }
        public void Invalidate() { invalidated = true; }
        public bool Sample(double position, double elapsed, bool active, bool ended)
        {
            if (completed || invalidated) return false;
            var delta = position - previous;
            if (active && wasActive) { activeTime += Math.Max(0, elapsed); sinceProgress += Math.Max(0, elapsed); }
            else sinceProgress = 0;
            // Some decoders update timestamps only when a new frame arrives. Compare with
            // the time since the last progress, not just this Unity rendering frame.
            if (active && wasActive && delta >= 0 && delta <= sinceProgress + .25)
                Watched += delta;
            if (delta != 0) sinceProgress = 0;
            previous = position; wasActive = active;
            if (active && ended && Duration > 0 && Watched >= Duration - .2 && activeTime >= Duration - .2 && position >= Duration - .2) {
                completed = true; return true;
            }
            return false;
        }
    }
}
