#nullable disable
using EllieBot.Modules.Administration.Services;

namespace EllieBot.Modules.Administration;

public partial class Administration
{
    [Group]
    public partial class VcRoleCommands : EllieModule<VcRoleService>
    {
        [Cmd]
        [UserPerm(GuildPerm.ManageRoles)]
        [BotPerm(GuildPerm.ManageRoles)]
        [RequireContext(ContextType.Guild)]
        public async Task VcRoleRm(ulong vcId)
        {
            if (_service.RemoveVcRole(ctx.Guild.Id, vcId))
                await Response().Confirm(strs.vcrole_removed(Format.Bold(vcId.ToString()))).SendAsync();
            else
                await Response().Error(strs.vcrole_not_found).SendAsync();
        }

        [Cmd]
        [UserPerm(GuildPerm.ManageRoles)]
        [BotPerm(GuildPerm.ManageRoles)]
        [RequireContext(ContextType.Guild)]
        public async Task VcRole([Leftover] IRole role = null)
        {
            var user = (IGuildUser)ctx.User;

            var vc = user.VoiceChannel;

            if (vc is null || vc.GuildId != user.GuildId)
            {
                await Response().Error(strs.must_be_in_voice).SendAsync();
                return;
            }

            if (role is null)
            {
                if (_service.RemoveVcRole(ctx.Guild.Id, vc.Id))
                    await Response().Confirm(strs.vcrole_removed(Format.Bold(vc.Name))).SendAsync();
            }
            else
            {
                _service.AddVcRole(ctx.Guild.Id, role, vc.Id);
                await Response().Confirm(strs.vcrole_added(Format.Bold(vc.Name), Format.Bold(role.Name))).SendAsync();
            }
        }

        [Cmd]
        [RequireContext(ContextType.Guild)]
        public async Task VcRoleList()
        {
            var guild = (SocketGuild)ctx.Guild;
            string text;
            if (_service.VcRoles.TryGetValue(ctx.Guild.Id, out var roles))
            {
                if (!roles.Any())
                    text = GetText(strs.no_vcroles);
                else
                {
                    text = string.Join("\n",
                        roles.Select(x
                            => $"{Format.Bold(guild.GetVoiceChannel(x.Key)?.Name ?? x.Key.ToString())} => {x.Value}"));
                }
            }
            else
                text = GetText(strs.no_vcroles);

            await Response().Embed(_sender.CreateEmbed()
                                            .WithOkColor()
                                            .WithTitle(GetText(strs.vc_role_list))
                                            .WithDescription(text)).SendAsync();
        }
    }
}