import random

from funcs import logThis
from .monopolyDraw import DrawMonopoly

rulesAndTerms = {
    "pass go money" : 200,
    "money term" : "GP"
}

class Monopoly():
    def __init__(self, bot):
        self.bot = bot
        self.draw = DrawMonopoly(bot)

    def monopolyStart(self, channel):
        logThis("Starting a monopoly game")
        game = self.bot.database["monopoly games"].find_one({"_id":channel})

        if game == None:
            buildings = [0] * 40

            newGame = {"_id":channel,"players" : {}, "player list" : [],"turn" : 0, "buildings" : buildings, "last roll" : [0,0], "started" : False}

            self.bot.database["monopoly games"].insert_one(newGame)

            #try:
            self.draw.drawImage(channel)
            #except:
            #    logThis("Error drawing board (error code 1640)")

            return "Started a monopoly game. Use \"!monopoly join\" to join within the next minute.", True, False, True, True
        else:
            return "There's already a monopoly game going on.", False, False, False, False

    def monopolyJoin(self,channel,user):
        game = self.bot.database["monopoly games"].find_one({"_id":channel})

        if game != None:
            if not game["started"]:
                if user not in game["players"]:
                    if len(game["players"]) < 6:

                        newPlayer = {"position" : 0, "properties" : [], "money" : 1500, "doubles" : 0}

                        self.bot.database["monopoly games"].update_one({"_id":channel},{"$set":{"players."+user:newPlayer}})

                        return self.bot.funcs.getName(user)+" has joined the game.", False, False, False, False
                    else:
                        return "There are already 6 players in the game.", False, False, False, False
                else:
                    return "You're already in the game!", False, False, False, False
            else:
                return "It's too late to join.", False, False, False, False
        else:
            return "There's no game going on.", False, False, False, False

    def parseMonopoly(self, command, channel, user):
        logThis("Parsing "+command)
        commands = command.split()
        if command in [" ", ""] or commands[0] == "start":
            try:
                return self.monopolyStart(channel)
            except:
                logThis("Error starting game (error code 1620)")
        elif commands[0] == "join":
            try:
                return self.monopolyJoin(channel,user)
            except:
                logThis("Error joining game (error code 1630)")
        elif commands[0] == "roll":
            try:
                return self.monopolyRoll(channel,user)
            except:
                logThis("Error rolling (error code 1650)")
        elif commands[0] == "stop":
            return self.monopolyStop(channel)
        else:
            return "I didn't understand that (error code 1602)", False, False, False, False

    def monopolyContinue(self, channel):
        game = self.bot.database["monopoly games"].find_one({"_id":channel})

        if game != None:
            if game["started"] == False:
                self.bot.database["monopoly games"].update_one({"_id":channel},{"$set":{"started":True}})
                playerList = list(game["players"].keys())
                random.shuffle(playerList)
                self.bot.database["monopoly games"].update_one({"_id":channel},{"$set":{"player list":playerList}})
                turn = 0

            else:
                if game["last roll"][0] == game["last roll"][1]:
                    turn = game["turn"]
                else:
                    turn = (game["turn"] + 1)%len(game["player list"])
                self.bot.database["monopoly games"].update_one({"_id":channel},{"$set":{"turn":turn}})
                playerList = list(game["players"].keys())

            #try:
            self.draw.drawImage(channel)
            #except:
            #    logThis("Error drawing board (error code 1640)")

            if playerList == []:
                return "No one joined. Ending game.", False, True, True
            else:
                message = "It's "+self.bot.funcs.getName(playerList[turn])+"'s turn. Use the 🎲 reaction to roll. You can also use \"!monopoly trade\" at any time."
                return message, True, True, False

    def monopolyRoll(self, channel,user):
        game = self.bot.database["monopoly games"].find_one({"_id":channel})

        turn = game["turn"]
        currentPlayer = game["player list"][turn]

        if user == currentPlayer or self.bot.options.testing:
            rolls = [random.randint(1,6),random.randint(1,6)]
            message = self.bot.funcs.getName(user)+" rolled a "+str(rolls[0])+" and a "+str(rolls[1])+"."
            if rolls[0] == rolls[1]:
                message += " Doubbles!"

            roll  = rolls[0] + rolls[1]
            oldPosition = game["players"][user]["position"]
            newPosition = (oldPosition + roll)%40
            if newPosition < oldPosition:
                self.bot.database["monopoly games"].update_one({"_id":channel},
                    {"$inc":{"players."+user+".money":rulesAndTerms["pass go money"]}})
                message += "\nYou passed go and got "+str(rulesAndTerms["pass go money"])+" "+rulesAndTerms["money term"]+"."

            self.bot.database["monopoly games"].update_one({"_id":channel},{"$set":{"players."+user+".position":newPosition}})
            self.bot.database["monopoly games"].update_one({"_id":channel},{"$set":{"last roll":rolls}})

            #try:
            self.draw.drawImage(channel)
            #except:
            #    logThis("Error drawing board (error code 1640)")

            return message, True, True, False, True
        else: return "", False, False, False, False

    def monopolyStop(self,channel):
        self.bot.funcs.deleteGame("monopoly games",channel)
        return "Stopped game", False, False, False, False
