using System;
namespace Spectre.Console
{
    /// 
    /// Represents a context that can be used to interact with a .
    /// 
    public sealed class StatusContext
    {
        private readonly ProgressContext _context;
        private readonly ProgressTask _task;
        private readonly SpinnerColumn _spinnerColumn;
        /// 
        /// Gets or sets the current status.
        /// 
        public string Status
        {
            get => _task.Description;
            set => SetStatus(value);
        }
        /// 
        /// Gets or sets the current spinner.
        /// 
        public Spinner Spinner
        {
            get => _spinnerColumn.Spinner;
            set => SetSpinner(value);
        }
        /// 
        /// Gets or sets the current spinner style.
        /// 
        public Style? SpinnerStyle
        {
            get => _spinnerColumn.Style;
            set => _spinnerColumn.Style = value;
        }
        internal StatusContext(ProgressContext context, ProgressTask task, SpinnerColumn spinnerColumn)
        {
            _context = context ?? throw new ArgumentNullException(nameof(context));
            _task = task ?? throw new ArgumentNullException(nameof(task));
            _spinnerColumn = spinnerColumn ?? throw new ArgumentNullException(nameof(spinnerColumn));
        }
        /// 
        /// Refreshes the status.
        /// 
        public void Refresh()
        {
            _context.Refresh();
        }
        private void SetStatus(string status)
        {
            if (status is null)
            {
                throw new ArgumentNullException(nameof(status));
            }
            _task.Description = status;
        }
        private void SetSpinner(Spinner spinner)
        {
            if (spinner is null)
            {
                throw new ArgumentNullException(nameof(spinner));
            }
            _spinnerColumn.Spinner = spinner;
        }
    }
}