using Data.Models.Client;
using Humanizer;
using SharedLibraryCore;
using SharedLibraryCore.Commands;
using SharedLibraryCore.Configuration;
using SharedLibraryCore.Interfaces;

namespace IW4MAdmin.Plugins.Mute.Commands;

public class MuteInfoCommand : Command
{
    private readonly MuteManager _muteManager;

    public MuteInfoCommand(CommandConfiguration config, ITranslationLookup translationLookup, MuteManager muteManager) : base(config,
        translationLookup)
    {
        _muteManager = muteManager;
        Name = "muteinfo";
        Description = translationLookup["PLUGINS_MUTE_COMMANDS_MUTEINFO_DESC"];
        Alias = "mi";
        Permission = EFClient.Permission.Moderator;
        RequiresTarget = true;
        SupportedGames = Plugin.SupportedGames;
        Arguments = new[]
        {
            new CommandArgument
            {
                Name = translationLookup["COMMANDS_ARGS_PLAYER"],
                Required = true
            }
        };
    }

    public override async Task ExecuteAsync(GameEvent gameEvent)
    {
        var currentMuteMeta = await _muteManager.GetCurrentMuteState(gameEvent.Target);
        switch (currentMuteMeta.MuteState)
        {
            case MuteState.Muted when currentMuteMeta.Expiration is null:
                gameEvent.Origin.Tell(_translationLookup["PLUGINS_MUTE_COMMANDS_MUTEINFO_SUCCESS"]
                    .FormatExt(gameEvent.Target.Name, currentMuteMeta.Reason));
                return;
            case MuteState.Muted when currentMuteMeta.Expiration.HasValue && currentMuteMeta.Expiration.Value > DateTime.UtcNow:
                var remainingTime = (currentMuteMeta.Expiration.Value - DateTime.UtcNow).HumanizeForCurrentCulture();
                gameEvent.Origin.Tell(_translationLookup["PLUGINS_MUTE_COMMANDS_MUTEINFO_TM_SUCCESS"]
                    .FormatExt(gameEvent.Target.Name, currentMuteMeta.Reason, remainingTime));
                return;
            default:
                gameEvent.Origin.Tell(_translationLookup["PLUGINS_MUTE_COMMANDS_MUTEINFO_NONE"]);
                break;
        }
    }
}
