using SharedLibraryCore;
using SharedLibraryCore.Commands;
using SharedLibraryCore.Configuration;
using SharedLibraryCore.Interfaces;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Data.Models;
using Data.Models.Client;
using IW4MAdmin.Application.Plugin.Script;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace IW4MAdmin.Application.Factories
{
    /// <summary>
    /// implementation of IScriptCommandFactory
    /// </summary>
    public class ScriptCommandFactory : IScriptCommandFactory
    {
        private readonly CommandConfiguration _config;
        private readonly ITranslationLookup _transLookup;
        private readonly IServiceProvider _serviceProvider;

        public ScriptCommandFactory(CommandConfiguration  config, ITranslationLookup transLookup, IServiceProvider serviceProvider)
        {
            _config = config;
            _transLookup = transLookup;
            _serviceProvider = serviceProvider;
        }

        /// <inheritdoc/>
        public IManagerCommand CreateScriptCommand(string name, string alias, string description, string permission, 
            bool isTargetRequired, IEnumerable<CommandArgument> args, Func<GameEvent, Task> executeAction, IEnumerable<Reference.Game> supportedGames)
        {
            var permissionEnum = Enum.Parse<EFClient.Permission>(permission);

            return new ScriptCommand(name, alias, description, isTargetRequired, permissionEnum, args, executeAction,
                _config, _transLookup, _serviceProvider.GetRequiredService<ILogger<ScriptCommand>>(), supportedGames);
        }
    }
}