package me.lenajenichen.voicebot.commands;

import me.lenajenichen.voicebot.LoggerInit;
import me.lenajenichen.voicebot.api.CreateDescription;
import me.lenajenichen.voicebot.main.BotMain;
import me.lenajenichen.voicebot.mysql.MySQL;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.*;
import org.apache.commons.lang3.StringUtils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SetupCommand implements ServerCommand {


    @Override
    public void performCommand(Member m, TextChannel channel, Message message) {
        String[] args = message.getContentDisplay().split(" ");

        //.voice setup createchannel
        if (m.hasPermission(Permission.MANAGE_SERVER)) {
            if (args.length == 4) {
                if (args[1].equalsIgnoreCase("setup")) {
                    if (args[2].equalsIgnoreCase("createchannel")) {
                        String channel_id = args[3];
                        ResultSet guildid_exists = MySQL.queryMySQL("SELECT guild_id FROM createvoice_data WHERE guild_id = '" + channel.getGuild().getId() + "'");
                        try {
                            if (guildid_exists.next()) {
                                MySQL.updateQuery("UPDATE createvoice_data SET channel_id = '" + Long.valueOf(channel_id) + "' WHERE guild_id = '" + Long.valueOf(channel.getGuild().getId()) + "'");
                                CreateDescription.createDescriptionMessageTitle("Der Channel für das erstellen von eigenen Channels wurde geupdated!", "#00FF00", "Createchannel wurde geupdated!", channel);
                            } else {
                                MySQL.updateQuery("INSERT INTO createvoice_data(channel_id, guild_id) VALUES('" + Long.valueOf(channel_id) + "', '" + Long.valueOf(channel.getGuild().getId()) + "')");
                                CreateDescription.createDescriptionMessageTitle("Der Channel für das erstellen von eigenen Channels wurde gesetzt!", "#00FF00", "Createchannel wurde erstellt!", channel);
                            }
                        } catch (SQLException e) {
                            BotMain.sendErrorMessage(channel);
                            LoggerInit.logger.warning(e.toString());
                        }
                    } else if (args[2].equalsIgnoreCase("ignorechannel")) {
                        String channel_id = args[3];
                        ResultSet ignoredchannelid_exsits = MySQL.queryMySQL("SELECT ignored_channel_id FROM createvoice_setup WHERE ignored_channel_id = '" + Long.valueOf(channel_id) + "'");
                        try {
                            if (ignoredchannelid_exsits.next()) {
                                CreateDescription.createDescriptionMessageTitle("Dieser channel ist Bereits in der Ignoerierten Liste! \nWenn du den channel entfernen möchtest schreibe `.voice setup removeignoredchannel <channel_id>`.\n Falls du wissen möchtest welche channel bereits in der Liste sind tippe `.voice setup ignoredchannelslist`", "#FF0000", "Channel existiert bereits!", channel);
                            } else {
                                MySQL.updateQuery("INSERT INTO createvoice_setup(guild_id, ignored_channel_id, channel_name) VALUES('" + Long.valueOf(channel.getGuild().getId()) + "', '" + Long.valueOf(channel_id) + "', '" + channel.getGuild().getJDA().getTextChannelById(channel_id).getName() + "')");
                                CreateDescription.createDescriptionMessageTitle("Der channel wurde hinzugefügt!", "#00FF00", "Liste wurde geupdated!", channel);
                            }
                        } catch (SQLException e) {
                            BotMain.sendErrorMessage(channel);
                            LoggerInit.logger.warning(e.toString());
                        }
                    } else if (args[2].equalsIgnoreCase("removeignoredchannel")) {
                        String channel_id = args[3];
                        ResultSet ignoredchannelid_exsits = MySQL.queryMySQL("SELECT ignored_channel_id FROM createvoice_setup WHERE ignored_channel_id = '" + Long.valueOf(channel_id) + "'");
                        try {
                            if (ignoredchannelid_exsits.next()) {
                                MySQL.updateQuery("DELETE FROM createvoice_setup WHERE ignored_channel_id = '" + Long.valueOf(channel_id) + "'");
                                CreateDescription.createDescriptionMessageTitle("Du hast erfolgreich den channel " + channel.getGuild().getJDA().getTextChannelById(channel_id).getAsMention() + " entfernt!", "#00FF00", "Channel erfolgreich entfernt!", channel);
                            } else {
                                CreateDescription.createDescriptionMessageTitle("Dieser channel existier nicht in der Ignoerierten Liste!", "#FF0000", "Channel nicht gefunden!", channel);
                            }
                        } catch (SQLException e) {
                            BotMain.sendErrorMessage(channel);
                            LoggerInit.logger.warning(e.toString());
                        }
                    } else if (args[2].equalsIgnoreCase("logchannel")) {
                        String channel_id = args[3];
                        ResultSet logchannel_exists = MySQL.queryMySQL("SELECT channel_id FROM createvoice_logchannel WHERE channel_id = '" + Long.valueOf(channel_id) + "'");
                        try {
                            if (logchannel_exists.next()) {
                                MySQL.updateQuery("UPDATE createvoice_logchannel SET channel_id = '" + Long.valueOf(channel_id) + "', channel_name = '" + channel.getGuild().getJDA().getTextChannelById(channel_id).getName() + "' WHERE guild_id = '" + Long.valueOf(channel.getGuild().getId()) + "'");
                                CreateDescription.createDescriptionMessageTitle("Der Logchannel wurde erfolgreich auf " + channel.getGuild().getJDA().getTextChannelById(channel_id).getAsMention() + " gesetzt!", "#00FF00", "Logchannel Updated!", channel);
                            } else {
                                MySQL.updateQuery("INSERT INTO createvoice_logchannel(guild_id, channel_id, channel_name) VALUES('" + Long.valueOf(channel.getGuild().getId()) + "', '" + Long.valueOf(channel_id) + "', '" + channel.getGuild().getJDA().getTextChannelById(channel_id).getName() + "')");
                                CreateDescription.createDescriptionMessageTitle("Der Logchannel wurde erfolgreich zu " + channel.getGuild().getJDA().getTextChannelById(channel_id).getAsMention() + " gesetzt!", "#00FF00", "Logchannel created!", channel);
                            }
                        } catch (SQLException e) {
                            BotMain.sendErrorMessage(channel);
                            LoggerInit.logger.warning(e.toString());
                        }

                    } else if (args[2].equalsIgnoreCase("teamchat")) {
                        String channel_id = args[3];
                        ResultSet teamchannelExists = MySQL.queryMySQL("SELECT channel_id FROM createvoice_teamchat WHERE channel_id = '" + Long.valueOf(channel_id) + "'");
                        try {
                            if(teamchannelExists.next()) {
                                MySQL.updateQuery("UPDATE createvoice_teamchat SET channel_id = '" + Long.valueOf(channel_id) + "', channel_name = '" + channel.getGuild().getJDA().getTextChannelById(channel_id).getName() + "'");
                                CreateDescription.createDescriptionMessageTitle("Der Teamchat wurde erfolgreich auf " + channel.getGuild().getJDA().getTextChannelById(channel_id).getAsMention() + " geupdated!", "#00FF00", "Teamchat Updated!", channel);
                            } else {
                                MySQL.updateQuery("INSERT INTO createvoice_teamchat(guild_id, channel_id, channel_name) VALUES('" + channel.getGuild().getId() + "', '" + channel_id + "', '" + channel.getGuild().getJDA().getTextChannelById(channel_id) + "')");
                                CreateDescription.createDescriptionMessageTitle("Der Teamchat wurde erfolgreich zu " + channel.getGuild().getJDA().getTextChannelById(channel_id).getAsMention() + " gesetzt!", "#00FF00", "Teamchat created!", channel);
                            }
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    } else {
                        channel.sendMessage(message.getMember().getAsMention() + " folgende setup Commands existieren: \n`.voice setup createchannel <channel_id>` um den Channel festzulegen wo der Nutzer ein neuen Channel erstellen kann. \n`.voice setup ignoredchannel <channel_id>` um einen Channel hinzuzufügen wo gelöschte nachrichten nicht geloggt werden. \n`.voice setup removeignorechannel <channel_id>` um einen Channel aus der Ignorierten Liste zu entfernen. \n`.voice setup ignoredchannelslist` zeigt dir die Liste der momentan ignorierten Channel an.").queue();
                    }
                } else {
                    channel.sendMessage(message.getMember().getAsMention() + " folgende setup Commands existieren: \n`.voice setup createchannel <channel_id>` um den Channel festzulegen wo der Nutzer ein neuen Channel erstellen kann. \n`.voice setup ignoredchannel <channel_id>` um einen Channel hinzuzufügen wo gelöschte nachrichten nicht geloggt werden. \n`.voice setup removeignorechannel <channel_id>` um einen Channel aus der Ignorierten Liste zu entfernen. \n`.voice setup ignoredchannelslist` zeigt dir die Liste der momentan ignorierten Channel an.").queue();
                }
            } else if (args.length == 3) {
                if (args[1].equalsIgnoreCase("setup")) {
                    if (args[2].equalsIgnoreCase("ignoredchannelslist")) {
                        ResultSet getAllIgnoredChannels = MySQL.queryMySQL("SELECT channel_name FROM createvoice_setup WHERE guild_id = '" + Long.valueOf(channel.getGuild().getId()) + "'");
                        try {
                            if(getAllIgnoredChannels.next()) {
                                List<String> channelnames = new ArrayList<>();
                                try {
                                    do {
                                        String channels = getAllIgnoredChannels.getString("channel_name");
                                        channelnames.add(channels);
                                    } while (getAllIgnoredChannels.next());
                                    CreateDescription.createDescriptionMessageTitle(StringUtils.join(channelnames, ", "), "#00FFFF", "Ignored channel list", channel);
                                } catch (SQLException e1) {
                                    LoggerInit.logger.warning(e1.toString());
                                }
                            } else {
                                CreateDescription.createDescriptionMessageTitle("Es wurden keine ignorierten Channel in der Datenbank gefunden. Wenn du welche hinzufügen möchtest tippe einfach `.voice setup ignorechannel <channel_id>`", "#FF0000", "No Ignored channels found", channel);
                            }
                        } catch (SQLException e) {
                            LoggerInit.logger.warning(e.toString());
                        }
                    } else {
                        channel.sendMessage(message.getMember().getAsMention() + " folgende setup Commands existieren: \n`.voice setup createchannel <channel_id>` um den Channel festzulegen wo der Nutzer ein neuen Channel erstellen kann. \n`.voice setup ignoredchannel <channel_id>` um einen Channel hinzuzufügen wo gelöschte nachrichten nicht geloggt werden. \n`.voice setup removeignorechannel <channel_id>` um einen Channel aus der Ignorierten Liste zu entfernen. \n`.voice setup ignoredchannelslist` zeigt dir die Liste der momentan ignorierten Channel an.").queue();
                    }
                } else {
                    channel.sendMessage(message.getMember().getAsMention() + " folgende setup Commands existieren: \n`.voice setup createchannel <channel_id>` um den Channel festzulegen wo der Nutzer ein neuen Channel erstellen kann. \n`.voice setup ignoredchannel <channel_id>` um einen Channel hinzuzufügen wo gelöschte nachrichten nicht geloggt werden. \n`.voice setup removeignorechannel <channel_id>` um einen Channel aus der Ignorierten Liste zu entfernen. \n`.voice setup ignoredchannelslist` zeigt dir die Liste der momentan ignorierten Channel an.").queue();
                }
            }
        } else {
            channel.sendMessage(message.getMember().getAsMention() + " Dazu hast du keine Rechte!").queue();
        }

    }

}
