using System;
using System.Threading.Tasks;
using Wabbajack.Common;

namespace Wabbajack.Lib
{
    /// <summary>
    /// Wabbajack runs mostly as a batch processor of sorts, we have a list of tasks we need to perform
    /// and the Compilers/Installers run throught those tasks one at a time. At any given moment the processor
    /// will be using multiple threads to complete that task. This interface defines a common implementation of
    /// all reporting functionality of both the compilers and installers.
    ///
    /// These processors are disposible because they contain WorkQueues which must be properly shutdown to keep
    /// from leaking threads. 
    /// </summary>
    public interface IBatchProcessor : IDisposable
    {
        /// <summary>
        /// The current progress of the entire processing system on a scale of 0.0 to 1.0
        /// </summary>
        IObservable<float> PercentCompleted { get; }

        /// <summary>
        /// The current status of the processor as a text string
        /// </summary>
        IObservable<string> TextStatus { get; }
        
        /// <summary>
        /// The status of the processor's work queue
        /// </summary>
        IObservable<CPUStatus> QueueStatus { get; }

        IObservable<bool> IsRunning { get; }

        /// <summary>
        /// Begin processing
        /// </summary>
        Task<bool> Begin();

        /// <summary>
        /// Terminate any processing currently in progress by the processor. The processor should be disposed of
        /// after calling this function as processing cannot be resumed and the tasks may be half completed.
        /// Should only be called while IsRunning = true;
        /// </summary>
        void Terminate();
    }
}
