from common import userstatus, queries
from commands.common import CommandHelpers as CH

bold = "\x02"
italic = "\x1D"
underline = "\x1F"
reverse = "\x16" 	# swap background and foreground colors ("reverse video")
reset = "\x0F"
blue = "\x0302"
green = "\x0303"
red = "\x0304"
grey = "\x0314"

def do_command(self, connection, event):
    cmdtype, trigger, command, replyto = CH.disect_command(self, event)
    
    # Do nothing if there is no command.
    if not command:
        return
    try:
        command.split()[0]
    except:
        return
    
    # The actual commands:
    if command == "test":
        if cmdtype == "help":    #Display help text.
            if len(command.split()) is not 1:
                return
            connection.privmsg(replyto, "Strictly for testing purposes only!")
        elif cmdtype == "cmd":
            connection.privmsg(replyto, str(self.channels[self.homechannel].owners()))
            print(self.db.one("SELECT password FROM networks WHERE name='" + self.network + "'"))
    
    elif command == "cmd" or command == "cmds" or command == "commands":
        if cmdtype == "help":    #Display help text.
            if len(command.split()) is not 1:
                return
            connection.privmsg(replyto, "Displays a list of commands.")
        elif cmdtype == "cmd":
            if not event.target == connection.get_nickname() and not self.db.one("SELECT join_greeting FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'"):
                connection.privmsg(replyto, grey + "Public: " + CH.ccc(self, "cmd") + CH.ccc(self, "help") + CH.ccc(self, "away")[:-2] + ".")
            else:
                connection.privmsg(replyto, grey + "Public: " + CH.ccc(self, "cmd") + CH.ccc(self, "help") + CH.ccc(self, "away") + CH.ccc(self, "stopgreet")[:-2] + ".")
    
    elif command == "help":
        if cmdtype == "help":    #Display help text.
            if len(command.split()) is not 1:
                return
            connection.privmsg(replyto, "Explains how to get help on any specific command and hints the user to the commandlist.")
        elif cmdtype == "cmd":
            connection.privmsg(replyto, "Replace the " + italic + "! " + reset + "prefix of any comand with " + italic + self.helpchar + " " + reset + "for help with a specific command. Request the command list with: " + blue + "!cmd")
            connection.privmsg(replyto, grey + "Example: " + reset + blue + self.helpchar + "help")
    
    
    elif command.split()[0] == "stopgreet":
        if cmdtype == "help":    #Display help text.
            if len(command.split()) is not 1:
                return
            connection.privmsg(replyto, "Stops the bot from greeting you or a specific user. Channel, user and option to resume optional.")
            connection.privmsg(replyto, grey + "Usage: " + blue + "!stopgreet " + reset + italic + "resume " + red + "channel user")
        elif cmdtype == "cmd":
            
            # Check for resume variation of command.
            resume = False
            try:
                if command.split()[1] == "resume":
                    resume = True
                    command = command.split(' ', 1)[1]  # Remove the resume argument. Which makes the following logic easier.
            except:
                pass
            
            if len(command.split()) == 1:    # No arguments.
                if event.target == connection.get_nickname():   # PM.
                    connection.privmsg(replyto, "Specify at least a channel. For help type " + blue + self.helpchar + "stopgreet" + reset + ".")
                    return
                user = event.source.nick
                channel = event.target
                
            if len(command.split()) == 2:    # One argument.
                if command.split()[1] not in self.channels: # Argument is not a channel the bot inhabits.
                    if event.target == connection.get_nickname():   # PM.
                        connection.action(replyto, "does not inhabit " + red + command.split()[1] + reset + ".")
                        return
                    # Channel message
                    if not userstatus.atleast_halfop(self, event.source.nick, self.homechannel) and not userstatus.atleast_halfop(self, event.source.nick, event.target):  # Insufficient rights.
                        connection.privmsg(replyto, "Denied. You need to have at least halfop status in " + red + self.homechannel + reset + " or " + red + event.target + reset + ".")
                        return
                    # Stopgreet for x user in current channel
                    user = command.split()[1]
                    channel = event.target
                else:   # Bot inhabit channel.
                    user = event.source.nick
                    channel = command.split()[1]
            if len(command.split()) == 3:    # Two arguments.
                if command.split()[1] not in self.channels: # Bot does not inhabit channel.
                    connection.action(replyto, "does not inhabit " + red + command.split()[1] + reset + ".")
                    return
                if not userstatus.atleast_halfop(self, event.source.nick, self.homechannel) and not userstatus.atleast_halfop(self, event.source.nick, command.split()[1]):  # Insufficient rights.
                    connection.privmsg(replyto, "Denied. You need to have at least halfop status in " + red + self.homechannel + reset + " or " + red + command.split()[1] + reset + ".")
                    return
                user = command.split()[2]
                channel = command.split()[1]
            if len(command.split()) > 3:    # Too many arguments.
                connection.privmsg(replyto, "Too many arguments. For help type " + blue + self.helpchar + "stopgreet" + reset + ".")
                return
            
            # Check for database record.
            result = self.db.one("SELECT id, stopgreet FROM joins WHERE LOWER(\"user\")=LOWER('" + user + "') AND user_network='" + self.network + "' AND LOWER(channel)=LOWER('" + channel + "') AND channel_network='" + self.network + "'")
            if not result:  # No record in database.
                connection.action(replyto, "has not yet had the pleasure of greeting " + red + user + reset + " in " + red + channel + reset + ".")
                return
            
            if resume:
                stopgreet = False
                message = "has already every intention to greet "
            else:
                stopgreet = True
                message = "has already stopped greeting "
            if result[1] == stopgreet:
                connection.action(replyto, message + red + user + reset + " in " + red + channel + reset + ".")
                return
            print(str(stopgreet) + str(user) + str(channel))
            try:
                self.db.run("UPDATE joins SET stopgreet='" + str(stopgreet) + "' WHERE LOWER(\"user\")=LOWER('" + user + "') AND user_network='" + self.network + "' AND lower(channel)=LOWER('" + channel + "') AND channel_network='" + self.network + "'")
            except:
                connection.privmsg(replyto, "Failed to update database.")
    
    elif command.split()[0] == "away":
        if cmdtype == "help":    #Display help text.
            if len(command.split()) is not 1:
                return
            connection.privmsg(replyto, "Sets you away, optionally with reason. This affects the !seen command and the game.")
            connection.privmsg(replyto, grey + "Usage: " + blue + "!away " + reset + italic + "reason")
            
        elif cmdtype == "cmd":
            queries.create_ifnot_onrecord(self, "users", event.source.nick)
            if len(trigger.split()) == 1:
                self.db.run("UPDATE users SET away=TRUE, away_reason=NULL WHERE name='" + event.source.nick + "' AND network='" + self.network + "'")
            else:
                self.db.run("UPDATE users SET away=TRUE, away_reason=%s WHERE name='" + event.source.nick + "' AND network='" + self.network + "'", (trigger.split(maxsplit=1)[1], ))
