import json, random

from funcs import getName, logThis
from . import monopolyDraw

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

def monopolyStart(channel):
    logThis("Starting a monopoly game")
    with open("resources/games/monopolyGames.json", "r") as f:
        data = json.load(f)

    if channel not in data:
        buildings = [0] * 40

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

        with open("resources/games/monopolyGames.json", "w") as f:
            json.dump(data,f,indent=4)
        
        try:
            monopolyDraw.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(channel,user):
    with open("resources/games/monopolyGames.json", "r") as f:
        data = json.load(f)

    if channel in data:
        if not data[channel]["started"]:
            if user not in data[channel]["players"]:
                if len(data[channel]["players"]) < 6:

                    data[channel]["players"][user] = {"position" : 0, "properties" : [], "money" : 1500, "doubles" : 0}

                    with open("resources/games/monopolyGames.json", "w") as f:
                        json.dump(data,f,indent=4)

                    return 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(command, channel, user):
    logThis("Parsing "+command)
    commands = command.split()
    if command in [" ", ""] or commands[0] == "start":
        try:
            return monopolyStart(channel)
        except:
            logThis("Error starting game (error code 1620)")
    elif commands[0] == "join":
        try:
            return monopolyJoin(channel,user)
        except:
            logThis("Error joining game (error code 1630)")
    elif commands[0] == "roll":
        try:
            return monopolyRoll(channel,user)
        except:
            logThis("Error rolling (error code 1650)")
    else:
        return "I didn't understand that (error code 1602)", False, False, False, False

def monopolyContinue(channel):
    with open("resources/games/monopolyGames.json", "r") as f:
        data = json.load(f)

    if channel in data:
        if data[channel]["started"] == False:
            data[channel]["started"] = True
            playerList = list(data[channel]["players"].keys())
            random.shuffle(playerList)
            data[channel]["player list"] = playerList
            turn = 0
        
        else:
            if data[channel]["last roll"][0] == data[channel]["last roll"][1]:
                turn = data[channel]["turn"]
            else:
                turn = (data[channel]["turn"] + 1)%len(data[channel]["player list"])
            data[channel]["turn"] = turn
            playerList = list(data[channel]["players"].keys())
        
        with open("resources/games/monopolyGames.json", "w") as f:
            json.dump(data,f,indent=4)
        
        try:
            monopolyDraw.drawImage(channel)
        except:
            logThis("Error drawing board (error code 1640)")

        message = "It's "+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(channel,user):
    with open("resources/games/monopolyGames.json", "r") as f:
        data = json.load(f)
    
    turn = data[channel]["turn"]
    currentPlayer = data[channel]["player list"][turn]

    if user == currentPlayer:
        rolls = [random.randint(1,6),random.randint(1,6)]
        message = 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 = data[channel]["players"][user]["position"]
        newPosition = (oldPosition + roll)%40
        if newPosition < oldPosition:
            data[channel]["players"][user]["money"] += rulesAndTerms["pass go money"]
            message += "\nYou passed go and got "+str(rulesAndTerms["pass go money"])+" "+rulesAndTerms["money term"]+"."

        data[channel]["players"][user]["position"] = newPosition
        data[channel]["last roll"] = rolls

        with open("resources/games/monopolyGames.json", "w") as f:
            json.dump(data,f,indent=4)
        
        try:
            monopolyDraw.drawImage(channel)
        except:
            logThis("Error drawing board (error code 1640)")
        
        return message, True, True, False, True
    else: return "", False, False, False, False
