using Discord;
using Discord.WebSocket;
using Victoria.Node;

namespace Lunaris2.Handler.MusicPlayer;

public static class Extensions
{
    public static SocketGuild GetGuild(this SocketSlashCommand message, DiscordSocketClient client)
    {
        if (message.GuildId == null)
        {
            throw new Exception("Guild ID is null!");
        }
            
        return client.GetGuild(message.GuildId.Value);
    }
        
    public static IVoiceState GetVoiceState(this SocketSlashCommand message)
    {
        var voiceState = message.User as IVoiceState;
            
        if (voiceState?.VoiceChannel == null)
        {
            throw new Exception("You must be connected to a voice channel!");
        }

        return voiceState;
    }
        
    public static async Task RespondAsync(this SocketSlashCommand message, string content)
    {
        await message.RespondAsync(content, ephemeral: true);
    }
        
    public static async Task EnsureConnected(this LavaNode lavaNode)
    {
        if(!lavaNode.IsConnected)
            await lavaNode.ConnectAsync();
    }
        
    public static async Task JoinVoiceChannel(this SocketSlashCommand context, LavaNode lavaNode)
    {
        try
        {
            var textChannel = context.Channel as ITextChannel;
            await lavaNode.JoinAsync(context.GetVoiceState().VoiceChannel, textChannel);
            await context.RespondAsync($"Joined {context.GetVoiceState().VoiceChannel.Name}!");
        }
        catch (Exception exception) {
            Console.WriteLine(exception);
        }
    }
        
    public static string GetOptionValueByName(this SocketSlashCommand command, string optionName)
    {
        return command.Data.Options.FirstOrDefault(option => option.Name == optionName)?.Value.ToString() ?? string.Empty;
    }
}