package stream.flarebot.flarebot.audio;

import com.arsenarsen.lavaplayerbridge.player.Player;
import com.arsenarsen.lavaplayerbridge.player.Track;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
import java.util.Queue;
import net.dv8tion.jda.core.Permission;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.TextChannel;
import stream.flarebot.flarebot.FlareBotManager;
import stream.flarebot.flarebot.Getters;
import stream.flarebot.flarebot.commands.music.SkipCommand;
import stream.flarebot.flarebot.commands.music.SongCommand;
import stream.flarebot.flarebot.objects.GuildWrapper;
import stream.flarebot.flarebot.util.MessageUtils;
import stream.flarebot.flarebot.util.general.FormatUtils;
import stream.flarebot.flarebot.util.general.GuildUtils;
import stream.flarebot.flarebot.util.votes.VoteUtil;

public class PlayerListener extends AudioEventAdapter {

    private Player player;

    public PlayerListener(Player player) {
        this.player = player;
    }

    @Override
    public void onTrackEnd(AudioPlayer aplayer, AudioTrack atrack, AudioTrackEndReason reason) {
        GuildWrapper wrapper = FlareBotManager.instance().getGuild(player.getGuildId());

        if (wrapper == null) return;

        // No song on next
        if (player.getPlaylist().isEmpty()) {
            FlareBotManager.instance().getLastActive().put(Long.parseLong(player.getGuildId()), System.currentTimeMillis());
        }

        VoteUtil.remove(SkipCommand.getSkipUUID(), wrapper.getGuild());

        if (wrapper.isSongnickEnabled()) {
            if (GuildUtils.canChangeNick(player.getGuildId())) {
                Guild c = wrapper.getGuild();
                if (c == null) {
                    wrapper.setSongnick(false);
                } else {
                    if (player.getPlaylist().isEmpty())
                        c.getController().setNickname(c.getSelfMember(), null).queue();
                }
            } else {
                if (!GuildUtils.canChangeNick(player.getGuildId())) {
                    MessageUtils.sendPM(Getters.getGuildById(player.getGuildId()).getOwner().getUser(),
                            "FlareBot can't change it's nickname so SongNick has been disabled!");
                }
            }
        }
    }

    @Override
    public void onTrackStart(AudioPlayer aplayer, AudioTrack atrack) {
        FlareBotManager.instance().getLastActive().remove(Long.parseLong(player.getGuildId()));

        GuildWrapper wrapper = FlareBotManager.instance().getGuild(player.getGuildId());
        if (wrapper.getMusicAnnounceChannelId() != null) {
            TextChannel c = Getters.getChannelById(wrapper.getMusicAnnounceChannelId());
            if (c != null) {
                if (c.getGuild().getSelfMember().hasPermission(c,
                        Permission.MESSAGE_EMBED_LINKS,
                        Permission.MESSAGE_READ,
                        Permission.MESSAGE_WRITE)) {
                    Track track = player.getPlayingTrack();
                    Queue<Track> playlist = player.getPlaylist();
                    c.sendMessage(MessageUtils.getEmbed()
                            .addField("Now Playing", SongCommand.getLink(track), false)
                            .addField("Duration", FormatUtils
                                    .formatDuration(track.getTrack().getDuration()), false)
                            .addField("Requested by",
                                    String.format("<@!%s>", track.getMeta()
                                            .get("requester")), false)
                            .addField("Next up", playlist.isEmpty() ? "Nothing" :
                                    SongCommand.getLink(playlist.peek()), false)
                            .setImage("https://img.youtube.com/vi/" + track.getTrack().getIdentifier() + "/hqdefault.jpg")
                            .build()).queue();
                } else {
                    wrapper.setMusicAnnounceChannelId(null);
                }
            } else {
                wrapper.setMusicAnnounceChannelId(null);
            }
        }
        if (wrapper.isSongnickEnabled()) {
            Guild c = wrapper.getGuild();
            if (c == null || !GuildUtils.canChangeNick(player.getGuildId())) {
                if (!GuildUtils.canChangeNick(player.getGuildId())) {
                    wrapper.setSongnick(false);
                    MessageUtils.sendPM(wrapper.getGuild().getOwner().getUser(),
                            "FlareBot can't change it's nickname so SongNick has been disabled!");
                }
            } else {
                Track track = player.getPlayingTrack();
                String str = null;
                if (track != null) {
                    str = track.getTrack().getInfo().title;
                    if (str.length() > 32)
                        str = str.substring(0, 32);
                    str = str.substring(0, str.lastIndexOf(' ') + 1);
                } // Even I couldn't make this a one-liner
                c.getController()
                        .setNickname(c.getSelfMember(), str)
                        .queue();
            }
        }
    }
}