using System;
using System.Reactive.Subjects;
using Wabbajack.Common.StatusFeed;

namespace Wabbajack.Common
{
    public class StatusUpdateTracker
    {
        private Subject<string> _stepName = new Subject<string>();
        public IObservable<string> StepName => _stepName;

        private Subject<int> _step = new Subject<int>();
        public IObservable<int> Step => _step;

        private Subject<int> _maxStep = new Subject<int>();
        public IObservable<int> MaxStep => _maxStep;

        private Subject<float> _progress = new Subject<float>();
        public IObservable<float> Progress => _progress;

        private int _internalCurrentStep;
        private int _internalMaxStep;

        public StatusUpdateTracker(int maxStep)
        {
            _internalMaxStep = maxStep;
        }

        public void Reset()
        {
            _maxStep.OnNext(_internalMaxStep);
        }

        public void NextStep(string name)
        {
            _internalCurrentStep += 1;
            Utils.Log(name);
            _step.OnNext(_internalCurrentStep);
            _stepName.OnNext(name);
            MakeUpdate(0.0f);
        }

        private float OverAllStatus(float sub_status)
        {
            var per_step = 1.0f / _internalMaxStep;
            var macro = _internalCurrentStep * per_step;
            return macro + (per_step * sub_status);
        }

        public void MakeUpdate(float progress)
        {
            _progress.OnNext(OverAllStatus(progress));
        }

        public void MakeUpdate(int max, int curr)
        {
            MakeUpdate((float)curr / (max == 0 ? 1 : max));
        }
    }

}