using System.ComponentModel;
using System.Threading.Tasks;
using DSharpPlus.Commands;
using DSharpPlus.Commands.ContextChecks;
using DSharpPlus.Commands.Processors.SlashCommands;
using DSharpPlus.Entities;
using DSharpPlus.Exceptions;

namespace SupportChild.Commands;

public class ToggleActiveCommand
{
    [RequireGuild]
    [Command("toggleactive")]
    [Description("Toggles active status for a staff member.")]
    public async Task OnExecute(SlashCommandContext command, [Parameter("user")][Description("(Optional) Staff member to toggle activity for.")] DiscordUser user = null)
    {
        DiscordUser staffUser = user == null ? command.User : user;

        // Check if ticket exists in the database
        if (!Database.TryGetStaff(staffUser.Id, out Database.StaffMember staffMember))
        {
            await command.RespondAsync(new DiscordEmbedBuilder
            {
                Color = DiscordColor.Red,
                Description = user == null ? "You have not been registered as staff." : "The user is not registered as staff."
            }, true);
            return;
        }

        if (Database.SetStaffActive(staffUser.Id, !staffMember.active))
        {
            if (user != null && user.Id != command.User.Id)
            {
                await command.RespondAsync(new DiscordEmbedBuilder
                {
                    Color = DiscordColor.Green,
                    Description = staffUser.Mention + (staffMember.active ? " is now set as inactive and will no longer be randomly assigned any support tickets."
                                                                          : " is now set as active and will be randomly assigned support tickets again.")
                }, true);
            }
            else
            {
                await command.RespondAsync(new DiscordEmbedBuilder
                {
                    Color = DiscordColor.Green,
                    Description = staffMember.active ? "You are now set as inactive and will no longer be randomly assigned any support tickets."
                                                     : "You are now set as active and will be randomly assigned support tickets again."
                }, true);
            }
        }
        else
        {
            await command.RespondAsync(new DiscordEmbedBuilder
            {
                Color = DiscordColor.Red,
                Description = "Error: Unable to update active status in database."
            }, true);
        }

        try
        {
            DiscordChannel logChannel = await SupportChild.client.GetChannelAsync(Config.logChannel);

            if (user != null && user.Id != command.User.Id)
            {
                await logChannel.SendMessageAsync(new DiscordEmbedBuilder
                {
                    Color = DiscordColor.Green,
                    Description = staffUser.Mention + " set " + command.Channel.Mention + "'s status to " + (staffMember.active ? "active" : "inactive")
                });
            }
            else
            {
                await logChannel.SendMessageAsync(new DiscordEmbedBuilder
                {
                    Color = DiscordColor.Green,
                    Description = staffUser.Mention + " set their own status to " + (staffMember.active ? "active" : "inactive")
                });
            }
        }
        catch (NotFoundException)
        {
            Logger.Error("Could not find the log channel.");
        }
    }
}