import asyncio
import discord

from funcs import logThis

class GameLoops():
    def __init__(self,bot):
        self.bot = bot


    # Deletes a message
    async def deleteMessage(self, imageLocation,channel):
        try:
            with open("resources/games/oldImages/"+imageLocation, "r") as f:
                messages = f.read().splitlines()

            for message in messages:
                oldMessage = await channel.fetch_message(int(message))
                logThis("Deleting old message")
                await oldMessage.delete()
        except:
            oldMessage = ""

        return oldMessage

    # Runs Four in a Row
    async def fiar(self, channel,command,user):
        try:
            response, showImage, deleteImage, gameDone, gwendoTurn = self.bot.fourInARow.parseFourInARow(command,str(channel.id),user)
        except:
            logThis("Error parsing command (error code 1410)")

        await channel.send(response)
        logThis(response,str(channel.id))
        if showImage:
            if deleteImage:
                try:
                    oldImage = await self.deleteMessage("fourInARow"+str(channel.id),channel)
                except:
                    logThis("Error deleting message (error code 1401)")
            oldImage = await channel.send(file = discord.File("resources/games/4InARowBoards/board"+str(channel.id)+".png"))
            if gameDone == False:
                if gwendoTurn:
                    try:
                        response, showImage, deleteImage, gameDone, gwendoTurn = await self.bot.fourInARow.fourInARowAI(str(channel.id))
                    except:
                        logThis("AI error (error code 1420)")
                    await channel.send(response)
                    logThis(response,str(channel.id))
                    if showImage:
                        if deleteImage:
                            await oldImage.delete()
                        oldImage = await channel.send(file = discord.File("resources/games/4InARowBoards/board"+str(channel.id)+".png"))
                        if gameDone == False:
                            with open("resources/games/oldImages/fourInARow"+str(channel.id), "w") as f:
                                f.write(str(oldImage.id))
                            try:
                                reactions = ["1️⃣","2️⃣","3️⃣","4️⃣","5️⃣","6️⃣","7️⃣"]
                                for reaction in reactions:
                                    await oldImage.add_reaction(reaction)

                            except:
                                logThis("Image deleted before I could react to all of them")

                else:
                    with open("resources/games/oldImages/fourInARow"+str(channel.id), "w") as f:
                        f.write(str(oldImage.id))
                    try:
                        reactions = ["1️⃣","2️⃣","3️⃣","4️⃣","5️⃣","6️⃣","7️⃣"]
                        for reaction in reactions:
                            await oldImage.add_reaction(reaction)
                    except:
                        logThis("Image deleted before I could react to all of them")

        if gameDone:
            game = self.bot.database["4 in a row games"].find_one({"_id":str(channel.id)})

            try:
                with open("resources/games/oldImages/fourInARow"+str(channel.id), "r") as f:
                    oldImage = await channel.fetch_message(int(f.read()))

                await oldImage.delete()
            except:
                logThis("The old image was already deleted")

            winner = game["winner"]
            difficulty = int(game["difficulty"])
            reward = difficulty**2 + 5
            if winner != 0:
                if game["players"][winner-1].lower() != "gwendolyn":
                    self.bot.money.addMoney(game["players"][winner-1].lower(),reward)

            self.bot.funcs.deleteGame("4 in a row games",str(channel.id))

    async def runMonopoly(self,channel, command, user):
        #try:
        response, showImage, deleteImage, gameStarted, gameContinue = self.bot.monopoly.parseMonopoly(command,str(channel.id),user)
        #except:
        #    logThis("Error parsing command (error code 1610)")
        if response != "":
            await channel.send(response)
        logThis(response,str(channel.id))
        if showImage:
            if deleteImage:
                try:
                    oldImage = await self.deleteMessage("monopoly"+str(channel.id),channel)
                except:
                    logThis("Error deleting message (error code 1601)")
            oldImage = await channel.send(file = discord.File("resources/games/monopolyBoards/monopolyBoard"+str(channel.id)+".png"))
            with open("resources/games/oldImages/monopoly"+str(channel.id), "w") as f:
                f.write(str(oldImage.id))

        if gameContinue:
            if gameStarted:
                await asyncio.sleep(60)
            else:
                await asyncio.sleep(3)
            response, showImage, deleteImage, gameDone = self.bot.monopoly.monopolyContinue(str(channel.id))
            em = discord.Embed(description=response,colour = 0x59f442)
            await channel.send(embed=em)
            if deleteImage:
                try:
                    oldImage = await self.deleteMessage("monopoly"+str(channel.id),channel)
                except:
                    logThis("Error deleting message (error code 1601)")

            if showImage:
                oldImage = await channel.send(file = discord.File("resources/games/monopolyBoards/monopolyBoard"+str(channel.id)+".png"))
                with open("resources/games/oldImages/monopoly"+str(channel.id), "w") as f:
                    f.write(str(oldImage.id))
                if gameDone == False:
                    try:
                        await oldImage.add_reaction("🎲")
                    except:
                        logThis("Image deleted before I could react to all of them")

    async def runHangman(self,channel,user,command = "start"):
        try:
            response, showImage, deleteImage, remainingLetters = self.bot.hangman.parseHangman(str(channel.id),user,command)
        except:
            logThis("Error parsing command (error code 1701)")
        if response != "":
            await channel.send(response)
            logThis(response,str(channel.id))
        if showImage:
            if deleteImage:
                await self.deleteMessage("hangman"+str(channel.id),channel)
            oldImage = await channel.send(file = discord.File("resources/games/hangmanBoards/hangmanBoard"+str(channel.id)+".png"))

            if len(remainingLetters) > 15:
                otherMessage  = await channel.send("_ _")
                reactionMessages = {oldImage : remainingLetters[:15],otherMessage : remainingLetters[15:]}
            else:
                otherMessage = ""
                reactionMessages = {oldImage : remainingLetters}

            oldMessages = str(oldImage.id)
            if otherMessage != "":
                oldMessages += "\n"+str(otherMessage.id)
            with open("resources/games/oldImages/hangman"+str(channel.id), "w") as f:
                f.write(oldMessages)

            try:
                for message, letters in reactionMessages.items():
                    for letter in letters:
                        emoji = chr(ord(letter)+127397)
                        await message.add_reaction(emoji)
            except:
                logThis("Image deleted before adding all reactions")

    # Runs Hex
    async def runHex(self,channel,command,user):
        try:
            response, showImage, deleteImage, gameDone, gwendoTurn = self.bot.hex.parseHex(command,str(channel.id),user)
        except:
            logThis("Error parsing command (error code 1510)")

        await channel.send(response)

        logThis(response,str(channel.id))
        if showImage:
            if deleteImage:
                try:
                    oldImage = await self.deleteMessage("hex"+str(channel.id),channel)
                except:
                    logThis("Error deleting old image (error code 1501)")
            oldImage = await channel.send(file = discord.File("resources/games/hexBoards/board"+str(channel.id)+".png"))
            if gwendoTurn and not gameDone:
                try:
                    response, showImage, deleteImage, gameDone, gwendoTurn = self.bot.hex.hexAI(str(channel.id))
                except:
                    response, showImage, deleteImage, gameDone, gwendoTurn = "An AI error occured",False,False,False,False
                    logThis("AI error (error code 1520)")
                await channel.send(response)
                logThis(response,str(channel.id))
                if showImage:
                    if deleteImage:
                        await oldImage.delete()
                    oldImage = await channel.send(file = discord.File("resources/games/hexBoards/board"+str(channel.id)+".png"))
            if not gameDone:
                with open("resources/games/oldImages/hex"+str(channel.id), "w") as f:
                    f.write(str(oldImage.id))

        if gameDone:
            game = self.bot.database["hex games"].find_one({"_id":str(channel.id)})
            
            winner = game["winner"]
            if winner != 0 and game["players"][0] != game["players"][1]: # player1 != player2
                winnings = game["difficulty"]*10
                self.bot.money.addMoney(game["players"][winner-1].lower(),winnings)

            self.bot.funcs.deleteGame("hex games",str(channel.id))
    

    # Runs Love letter
    async def runLoveletter(self,channel,command,user,userchannel):
        try:
            response, showImage, deleteImage = self.bot.loveletter.parseLove(command,str(channel.id),user,userchannel)
        except:
            logThis("Error parsing command (error code 1810)")

        await channel.send(response)
        logThis(response,str(channel.id))
        if showImage:
            if deleteImage:
                await self.deleteMessage("loveletter"+str(channel.id),channel)
            oldImage = await channel.send(file = discord.File("resources/games/loveletterBoards/loveletterBoard"+str(channel.id)+".png"))

            if len(remainingLetters) > 15:
                otherMessage  = await channel.send("_ _")
                reactionMessages = {oldImage : remainingLetters[:15],otherMessage : remainingLetters[15:]}
            else:
                otherMessage = ""
                reactionMessages = {oldImage : remainingLetters}

            oldMessages = str(oldImage.id)
            if otherMessage != "":
                oldMessages += "\n"+str(otherMessage.id)
            with open("resources/games/oldImages/hangman"+str(channel.id), "w") as f:
                f.write(oldMessages)

            try:
                for message, letters in reactionMessages.items():
                    for letter in letters:
                        emoji = chr(ord(letter)+127397)
                        await message.add_reaction(emoji)
            except:
                logThis("Image deleted before adding all reactions")