import datetime
from functions.database import utils, stats
import time


def dinks(userid):
    return getOrAddUser(userid)[1]


def dinksAll(userid):
    platinumDinks = 0

    connection = utils.connect()
    cursor = connection.cursor()
    cursor.execute("SELECT amount FROM inventory WHERE userid = %s AND itemid = %s", (int(userid), 1,))
    result = cursor.fetchall()

    if result:
        platinumDinks = result[0][0]

    return {"dinks": dinks(userid), "platinum": platinumDinks}


def getAllRows():
    connection = utils.connect()
    cursor = connection.cursor()
    cursor.execute(
        """SELECT * FROM currencytable"""
    )

    return cursor.fetchall()


def getAllPlatDinks():
    connection = utils.connect()
    cursor = connection.cursor()
    cursor.execute("SELECT userid, amount FROM inventory WHERE itemid = 1")
    result = cursor.fetchall()
    dic = {}
    for user in result:
        dic[str(user[0])] = user[1]
    return dic


def getOrAddUser(userid):
    connection = utils.connect()
    cursor = connection.cursor()
    query = "SELECT * FROM currencytable WHERE userid = %s"
    cursor.execute(
        query, (int(userid),)
    )
    result = cursor.fetchall()
    # User didn't exist yet, so create a new default file
    if len(result) == 0:
        createNewUser(userid, connection)
        return getOrAddUser(userid)
    return result[0]


# TODO check for nightly bonus & add+return that instead of 420
def nightly(userid):
    user = getOrAddUser(userid)
    today = datetime.datetime.today().date()
    lastNightly = datetime.datetime.fromtimestamp(user[9]).date()
    streak = int(user[10])
    if lastNightly < today:
        update(userid, "dinks", float(user[1]) + 420.0)
        update(userid, "nightly", int(time.time()))

        # Update the streak
        if (today - lastNightly).days > 1:
            update(userid, "nightly_streak", 1)
            streak = 1
        else:
            update(userid, "nightly_streak", streak + 1)
            streak += 1

        s = stats.getOrAddUser(userid)

        if streak > int(s[5]):
            stats.update(userid, "longest_streak", streak)

        stats.update(userid, "nightlies_count", int(s[6]) + 1)

        return [True, 420, streak]
    return [False, 0, -1]


def createNewUser(userid, connection=None):
    if connection is None:
        connection = utils.connect()
    cursor = connection.cursor()
    query = "INSERT INTO currencytable(userid, dinks, banklevel, investedamount, investeddays, profit, defense, offense, bitcoins, nightly) " \
            "VALUES (%s, 0.0, 1, 0.0, 0, 0, 1, 1, 0.0, 0)"
    cursor.execute(query, (int(userid),))
    connection.commit()


def update(userid, column, value):
    _ = getOrAddUser(userid)
    connection = utils.connect()
    cursor = connection.cursor()
    query = "UPDATE currencytable " \
            "SET {} = %s " \
            "WHERE userid = %s".format(column)
    cursor.execute(query, (value, userid,))
    connection.commit()