package listeners;

import data.*;
import discord4j.core.event.domain.guild.GuildDeleteEvent;
import discord4j.core.object.entity.TextChannel;
import discord4j.core.object.util.Snowflake;
import reactor.core.publisher.Flux;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import util.ClientConfig;
import util.Reporter;

import java.util.Optional;
import java.util.OptionalInt;

/**
 * Created by steve on 14/07/2016.
 */
public class GuildLeaveListener {

    private final static Logger LOG = LoggerFactory.getLogger(GuildLeaveListener.class);

    public GuildLeaveListener(){
        super();
    }

    public void onReady(GuildDeleteEvent event) {
        try {

            Optional<Guild> optionalGuild = event.getGuild().map(guildEvent -> Guild.getGuild(guildEvent, false));
            if (optionalGuild.isPresent()) {
                Guild guild = optionalGuild.get();
                guild.removeToDatabase();

                LOG.info("La guilde " + event.getGuildId().asString() + " - " + guild.getName()
                        + " a supprimé " + Constants.name);

                ClientConfig.DISCORD()
                        .flatMap(cli -> cli.getChannelById(Snowflake.of(Constants.chanReportID)))
                        .filter(chan -> chan instanceof TextChannel)
                        .map(chan -> (TextChannel) chan)
                        .distinct()
                        .flatMap(chan -> chan.createMessage("[LOSE] **" + optionalGuild.get().getName() + "**, -"
                                        + event.getGuild().map(discord4j.core.object.entity.Guild::getMemberCount)
                                .orElse(OptionalInt.empty()).orElse(0) +  " utilisateurs"))
                        .subscribe();
            }
        } catch(Exception e){
            Reporter.report(e, event.getGuild().orElse(null));
            LOG.error("onReady", e);
        }
    }
}