#nullable disable
using EllieBot.Common.TypeReaders;
using EllieBot.Modules.Permissions.Services;

namespace EllieBot.Modules.Permissions;

public partial class Permissions
{
    [Group]
    public partial class GlobalPermissionCommands : EllieModule
    {
        private readonly GlobalPermissionService _service;
        private readonly DbService _db;

        public GlobalPermissionCommands(GlobalPermissionService service, DbService db)
        {
            _service = service;
            _db = db;
        }

        [Cmd]
        [OwnerOnly]
        public async Task GlobalPermList()
        {
            var blockedModule = _service.BlockedModules;
            var blockedCommands = _service.BlockedCommands;
            if (!blockedModule.Any() && !blockedCommands.Any())
            {
                await Response().Error(strs.lgp_none).SendAsync();
                return;
            }

            var embed = CreateEmbed().WithOkColor();

            if (blockedModule.Any())
                embed.AddField(GetText(strs.blocked_modules), string.Join("\n", _service.BlockedModules));

            if (blockedCommands.Any())
                embed.AddField(GetText(strs.blocked_commands), string.Join("\n", _service.BlockedCommands));

            await Response().Embed(embed).SendAsync();
        }

        [Cmd]
        [OwnerOnly]
        public async Task GlobalModule(ModuleOrExpr module)
        {
            var moduleName = module.Name.ToLowerInvariant();

            var added = _service.ToggleModule(moduleName);

            if (added)
            {
                await Response().Confirm(strs.gmod_add(Format.Bold(module.Name))).SendAsync();
                return;
            }

            await Response().Confirm(strs.gmod_remove(Format.Bold(module.Name))).SendAsync();
        }

        [Cmd]
        [OwnerOnly]
        public async Task GlobalCommand(CommandOrExprInfo cmd)
        {
            var commandName = cmd.Name.ToLowerInvariant();
            var added = _service.ToggleCommand(commandName);

            if (added)
            {
                await Response().Confirm(strs.gcmd_add(Format.Bold(cmd.Name))).SendAsync();
                return;
            }

            await Response().Confirm(strs.gcmd_remove(Format.Bold(cmd.Name))).SendAsync();
        }
    }
}