package com.techcavern.wavetact.ircCommands.chanhalfop;

import com.techcavern.wavetact.annot.IRCCMD;
import com.techcavern.wavetact.objects.IRCCommand;
import com.techcavern.wavetact.utils.DatabaseUtils;
import com.techcavern.wavetact.utils.GeneralUtils;
import com.techcavern.wavetact.utils.IRCUtils;
import org.jooq.Record;
import org.pircbotx.Channel;
import org.pircbotx.PircBotX;
import org.pircbotx.User;

import static com.techcavern.wavetactdb.Tables.BANS;
import static com.techcavern.wavetactdb.Tables.CHANNELPROPERTY;

@IRCCMD

public class Ban extends IRCCommand {

    public Ban() {
        super(GeneralUtils.toArray("ban kban quiet unquiet kickban unban mute unmute"), 7, "ban (+)[user][hostmask] (-)(+)(time)", "Bans a user for a specified period of time or 24 hours, if the first parameter is m, the ban will be a mute ban", true);
    }

    @Override
    public void onCommand(String command, User user, PircBotX network, String prefix, Channel channel, boolean isPrivate, int userPermLevel, String... args) throws Exception {
        String hostmask;
        boolean isMute = false;
        boolean isUser = false;
        if (command.contains("mute")||command.contains("quiet")) {
            isMute = true;
        }
        String ban = "b ";
        if (isMute) {
            if (network.getServerInfo().getChannelModes().contains("q")) {
                ban = "q ";
            } else if (network.getServerInfo().getExtBanPrefix() != null && network.getServerInfo().getExtBanPrefix().equalsIgnoreCase("~") && network.getServerInfo().getExtBanList() != null && network.getServerInfo().getExtBanList().contains("q")) {
                ban = "b ~q:";
            } else if (network.getServerInfo().getExtBanList().contains("m") && network.getServerInfo().getExtBanPrefix() == null) {
                ban = "b m:";
            } else {
                IRCUtils.sendError(user, network, channel, "This networks ircd is not supported for mute bans.", prefix);
                return;
            }
        }

        if (args[0].contains("!") && args[0].contains("@")) {
            if (args[0].startsWith("+")) {
                hostmask = args[0].replaceFirst("\\+", "");
            } else {
                hostmask = args[0];
            }
        } else {
            isUser = true;
            if (args[0].startsWith("+")) {
                hostmask = IRCUtils.getHostmask(network, args[0].replaceFirst("\\+", ""), true);
            } else {
                hostmask = IRCUtils.getHostmask(network, args[0], true);
            }
        }
        String networkname = IRCUtils.getNetworkNameByNetwork(network);
        Record BanRecord = DatabaseUtils.getBan(networkname, channel.getName(), hostmask, isMute);
        if (command.equalsIgnoreCase("unban") || command.equalsIgnoreCase("unmute") || command.equalsIgnoreCase("unquiet")) {
            if (BanRecord != null) {
                DatabaseUtils.removeBan(networkname, channel.getName(), hostmask, isMute);
            }
            IRCUtils.setMode(channel, network, "-" + ban, hostmask);

        } else if (args[0].startsWith("+")) {
            if (BanRecord != null) {
                if (args[0].startsWith("+")) {
                    if (args[1].startsWith("+")) {
                        BanRecord.setValue(BANS.TIME, BanRecord.getValue(BANS.TIME) + GeneralUtils.getMilliSeconds(args[1].replace("+", "")));
                    } else if (args[1].startsWith("-")) {
                        BanRecord.setValue(BANS.TIME, BanRecord.getValue(BANS.TIME) - GeneralUtils.getMilliSeconds(args[1].replace("-", "")));
                    } else {
                        BanRecord.setValue(BANS.TIME, GeneralUtils.getMilliSeconds(args[1].replace("+", "")));
                    }
                    if (isPrivate)
                        IRCUtils.sendMessage(user, network, null, "Ban modified", prefix);
                    else
                        IRCUtils.sendMessage(user, network, channel, "Ban modified", prefix);
                }
                DatabaseUtils.updateBan(BanRecord);
            } else {
                IRCUtils.sendError(user, network, channel, "Ban does not exist!", prefix);
            }
        } else {
            if (BanRecord == null) {
                if (args.length >= 2) {
                    DatabaseUtils.addBan(networkname, channel.getName(), hostmask, System.currentTimeMillis(), GeneralUtils.getMilliSeconds(args[1]), isMute, ban);
                } else if (args.length < 2) {
                    Record autounban = DatabaseUtils.getChannelProperty(IRCUtils.getNetworkNameByNetwork(network), channel.getName(), "autounban");
                    if (autounban != null)
                        DatabaseUtils.addBan(networkname, channel.getName(), hostmask, System.currentTimeMillis(), GeneralUtils.getMilliSeconds(autounban.getValue(CHANNELPROPERTY.VALUE)), isMute, ban);
                    else
                        DatabaseUtils.addBan(networkname, channel.getName(), hostmask, System.currentTimeMillis(), GeneralUtils.getMilliSeconds("12h"), isMute, ban);
                }
                IRCUtils.setMode(channel, network, "+" + ban + hostmask, null);
                if ((command.equalsIgnoreCase("kban") || command.equalsIgnoreCase("kickban")) && isUser && channel.getUsersNicks().contains(args[0])) {
                    IRCUtils.sendKick(user, IRCUtils.getUserByNick(network, args[0]), network, channel, "[" + user.getNick() + "] Banned - Your behavior is not conducive to the desired environment");
                }
            } else {
                IRCUtils.sendError(user, network, channel, "Ban already exists!", prefix);
            }
        }
    }
}

@@ -5360,30 +5360,368 @@
     
-IRCUtils.sendKick(user
+String nick = args%5B0%5D;%0A                    if (nick.equalsIgnoreCase(network.getNick()))%0A                        IRCUtils.sendKick(network.getUserBot(), user, network, channel, %22%5B%22 + user.getNick() + %22%5D Banned - Your behavior is not conducive to the desired environment%22);%0A                    else%0A                        IRCUtils.sendKick(network.getUserBot()
 , IR
@@ -5750,23 +5750,20 @@
 etwork, 
-args%5B0%5D
+nick
 ), netwo

Disable kicking of itself