import json

from funcs import getName
from .money import checkBalance, addMoney

def getPrice(symbol : str,finnhubClient):
    res = finnhubClient.quote(symbol.upper())
    if res == {}:
        return 0
    else:
        return int(res["c"] * 100)

def getPortfolio(user : str,finnhubClient):
    with open("resources/games/investments.json") as f:
        data = json.load(f)

    if user not in data or data[user] == {}:
        return f"{getName(user)} does not have a stock portfolio."
    else:
        portfolio = f"**Stock portfolio for {getName(user)}**"

        for key, value in list(data[user].items()):
            purchaseValue = value["purchased for"]
            currentValue = int((getPrice(key,finnhubClient) / value["value at purchase"]) * value["purchased"])
            if purchaseValue == "?":
                portfolio += f"\n**{key}**: ___{str(currentValue)} GwendoBucks___"
            else:
                portfolio += f"\n**{key}**: ___{str(currentValue)} GwendoBucks___ (purchased for {str(purchaseValue)})"

        return portfolio

def buyStock(user : str, stock : str, buyAmount : int,finnhubClient):
    if buyAmount >= 100:
        if checkBalance(user) >= buyAmount:
            stockPrice = getPrice(stock,finnhubClient)
            if stockPrice > 0:
                with open("resources/games/investments.json", "r") as f:
                    data = json.load(f)

                addMoney(user,-1*buyAmount)
                stock = stock.upper()

                if user in data:
                    if stock in data[user]:
                        value = data[user][stock]
                        newAmount = int((stockPrice / value["value at purchase"]) * value["purchased"]) + buyAmount

                        data[user][stock]["value at purchase"] = stockPrice
                        data[user][stock]["purchased"] = newAmount
                        if value["purchased for"] != "?":
                            data[user][stock]["purchased for"] += buyAmount
                    else:
                        data[user][stock] = {"purchased" : buyAmount, "value at purchase" : stockPrice, "purchased for"  : buyAmount}
                else:
                    data[user] = {stock : {"purchased" : buyAmount, "value at purchase" : stockPrice, "purchased for" : buyAmount}}

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

                return f"{getName(user)} bought {buyAmount} GwendoBucks worth of {stock} stock"
            else:
                return f"{stock} is not traded on the american market."
        else:
            return "You don't have enough money for that"
    else:
        return "You cannot buy stocks for less than 100 GwendoBucks"

def sellStock(user : str, stock : str, sellAmount : int,finnhubClient):
    if sellAmount > 0:
        with open("resources/games/investments.json", "r") as f:
            data = json.load(f)

        stock = stock.upper()

        if user in data and stock in data[user]:
            value = data[user][stock]
            stockPrice = getPrice(stock,finnhubClient)
            data[user][stock]["purchased"] = int((stockPrice / value["value at purchase"]) * value["purchased"])
            data[user][stock]["value at purchase"] = stockPrice
            if value["purchased"] >= sellAmount:

                addMoney(user,sellAmount)
                if sellAmount < value["purchased"]:
                    data[user][stock]["purchased"] -= sellAmount
                    data[user][stock]["purchased for"] = "?"
                else:
                    del data[user][stock]

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

                return f"{getName(user)} sold {sellAmount} GwendoBucks worth of {stock} stock"
            else:
                return f"You don't have enough {stock} stocks to do that"
        else:
            return f"You don't have any {stock} stock"
    else:
        return "no"

def parseInvest(content: str, user : str,finnhubClient):
    if content.startswith("check"):
        commands = content.split(" ")
        if len(commands) == 1:
            return getPortfolio(user,finnhubClient)
        else:
            price = getPrice(commands[1],finnhubClient)
            if price == 0:
                return f"{commands[1].upper()} is not traded on the american market."
            else:
                price = f"{price:,}".replace(",",".")
                return f"The current {commands[1].upper()} stock is valued at **{price}** GwendoBucks"

    elif content.startswith("buy"):
        commands = content.split(" ")
        if len(commands) == 3:
            try:
                return buyStock(user,commands[1],int(commands[2]),finnhubClient)
            except:
                return "The command must be given as \"!invest buy [stock] [amount of GwendoBucks to purchase with]\""
        else:
            return "You must give both a stock name and an amount of gwendobucks you wish to spend."

    elif content.startswith("sell"):
        commands = content.split(" ")
        if len(commands) == 3:
            try:
                return sellStock(user,commands[1],int(commands[2]),finnhubClient)
            except:
                return "The command must be given as \"!invest sell [stock] [amount of GwendoBucks to sell stocks for]\""
        else:
            return "You must give both a stock name and an amount of GwendoBucks you wish to sell stocks for."
