// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using Microsoft.Extensions.CommandLineUtils;
using Microsoft.Extensions.Tools.Internal;

namespace Microsoft.Extensions.ApiDescription.Tool.Commands
{
    internal abstract class CommandBase
    {
        private readonly IConsole _console;

        public bool IsQuiet { get; private set; }

        public bool IsVerbose { get; private set; }

        protected IReporter Reporter { get; private set; }

        protected CommandBase(IConsole console)
        {
            _console = console ?? throw new ArgumentNullException(nameof(console));
            Reporter = new ConsoleReporter(_console);
        }

        public virtual void Configure(CommandLineApplication command)
        {
            var prefixOutput = command.Option("--prefix-output", Resources.PrefixDescription);
            var quiet = command.Option("-q|--quiet", Resources.QuietDescription);
            var verbose = command.VerboseOption();

            command.OnExecute(
                () =>
                {
                    IsQuiet = quiet.HasValue();
                    IsVerbose = verbose.HasValue() || CliContext.IsGlobalVerbose();
                    ReporterExtensions.PrefixOutput = prefixOutput.HasValue();

                    // Update the reporter now that we know the option values.
                    Reporter = new ConsoleReporter(_console, IsVerbose, IsQuiet);

                    Validate();

                    return Execute();
                });
        }

        protected virtual void Validate()
        {
            if (IsQuiet && IsVerbose)
            {
                throw new CommandException(Resources.QuietAndVerboseSpecified);
            }
        }

        protected virtual int Execute() => 0;
    }
}
