from .entities.User import User
import mysql.connector
from werkzeug.security import generate_password_hash
from datetime import datetime
import time


class ModelUser():
    db_config = {
        'host': '127.0.0.1',
        'user': 'seba',
        'password': 'p2PApV7b0bLkzLLxQ0ZN',
        'database': 'spxButterfly'
    }

    @classmethod
    def _connect(cls):
        return mysql.connector.connect(**cls.db_config)

    @classmethod
    def login(cls, db, user):
        connection = cls._connect()
        if connection.is_connected():
            cursor = connection.cursor()
            sql = "SELECT id, username, password, fullname, userPlan FROM user WHERE username = %s"
            cursor.execute(sql, (user.username,))
            row = cursor.fetchone()
            if row is not None:
                user = User(row[0], row[1], User.check_password(
                    row[2], user.password), fullname=row[3], userPlan=row[4])
                return user
            else:
                return None

    @classmethod
    def get_by_id(cls, db, id):
        connection = cls._connect()
        if connection.is_connected():
            cursor = connection.cursor(dictionary=True)
            sql = "SELECT * FROM user WHERE id = %s"
            cursor.execute(sql, (id,))
            row = cursor.fetchone()
            if row is not None:
                # logged_user = User(row[0], row[1], None,
                #                     row[3], *row[4:22], row[24])

                # logged_user = User(id=row['id'], username=row['username'], password=None, fullname=row['fullname'])

                logged_user = User(
                    id=row['id'],
                    username=row['username'],
                    password=None,
                    fullname=row['fullname'],
                    takeProfit1_Percen=row['takeProfit1_Percen'],
                    stopLoss1_Percen=row['stopLoss1_Percen'],
                    takeProfit2_Percen=row['takeProfit2_Percen'],
                    stopLoss2_Percen=row['stopLoss2_Percen'],
                    takeProfit3_Percen=row['takeProfit3_Percen'],
                    stopLoss3_Percen=row['stopLoss3_Percen'],
                    takeProfit4_Percen=row['takeProfit4_Percen'],
                    stopLoss4_Percen=row['stopLoss4_Percen'],
                    takeProfit5_Percen=row['takeProfit5_Percen'],
                    stopLoss5_Percen=row['stopLoss5_Percen'],
                    takeProfit6_Percen=row['takeProfit6_Percen'],
                    stopLoss6_Percen=row['stopLoss6_Percen'],
                    takeProfit7_Percen=row['takeProfit7_Percen'],
                    stopLoss7_Percen=row['stopLoss7_Percen'],
                    takeProfit8_Percen=row['takeProfit8_Percen'],
                    stopLoss8_Percen=row['stopLoss8_Percen'],
                    takeProfit9_Percen=row['takeProfit9_Percen'],
                    stopLoss9_Percen=row['stopLoss9_Percen'],
                    takeProfit10_Percen=row['takeProfit10_Percen'],
                    stopLoss10_Percen=row['stopLoss10_Percen'],

                    takeProfit1_Dollar=row['takeProfit1_Dollar'],
                    stopLoss1_Dollar=row['stopLoss1_Dollar'],
                    takeProfit2_Dollar=row['takeProfit2_Dollar'],
                    stopLoss2_Dollar=row['stopLoss2_Dollar'],
                    takeProfit3_Dollar=row['takeProfit3_Dollar'],
                    stopLoss3_Dollar=row['stopLoss3_Dollar'],
                    takeProfit4_Dollar=row['takeProfit4_Dollar'],
                    stopLoss4_Dollar=row['stopLoss4_Dollar'],
                    takeProfit5_Dollar=row['takeProfit5_Dollar'],
                    stopLoss5_Dollar=row['stopLoss5_Dollar'],
                    takeProfit6_Dollar=row['takeProfit6_Dollar'],
                    stopLoss6_Dollar=row['stopLoss6_Dollar'],
                    takeProfit7_Dollar=row['takeProfit7_Dollar'],
                    stopLoss7_Dollar=row['stopLoss7_Dollar'],
                    takeProfit8_Dollar=row['takeProfit8_Dollar'],
                    stopLoss8_Dollar=row['stopLoss8_Dollar'],
                    takeProfit9_Dollar=row['takeProfit9_Dollar'],
                    stopLoss9_Dollar=row['stopLoss9_Dollar'],
                    takeProfit10_Dollar=row['takeProfit10_Dollar'],
                    stopLoss10_Dollar=row['stopLoss10_Dollar'],


                    offset=row['offset'],
                    contracts=row['contracts'],
                    userPlan=row['userPlan'],
                    start_trial=row['start_trial']
                )
                return logged_user
            else:
                return None

    @classmethod
    def create(cls, db, username, password, name, userPlan):
        hashed_password = generate_password_hash(password)
        connection = cls._connect()
        if connection.is_connected():
            cursor = connection.cursor()
            sql = "INSERT INTO user (username, password, fullname, userPlan) VALUES (%s, %s, %s, %s)"
            values = (username, hashed_password, name, userPlan)
            cursor.execute(sql, values)
            connection.commit()

    @classmethod
    def saveData(cls, db, data, id):
        connection = cls._connect()
        if connection.is_connected():
            cursor = connection.cursor()
            sql = """
                UPDATE user SET 
                    takeProfit1_Percen = %s, stopLoss1_Percen = %s,
                    takeProfit2_Percen = %s, stopLoss2_Percen = %s,
                    takeProfit3_Percen = %s, stopLoss3_Percen = %s,
                    takeProfit4_Percen = %s, stopLoss4_Percen = %s,
                    takeProfit5_Percen = %s, stopLoss5_Percen = %s,
                    takeProfit6_Percen = %s, stopLoss6_Percen = %s,
                    takeProfit7_Percen = %s, stopLoss7_Percen = %s,
                    takeProfit8_Percen = %s, stopLoss8_Percen = %s,
                    takeProfit9_Percen = %s, stopLoss9_Percen = %s,
                    takeProfit10_Percen = %s, stopLoss10_Percen = %s,

                    takeProfit1_Dollar = %s, stopLoss1_Dollar = %s,
                    takeProfit2_Dollar = %s, stopLoss2_Dollar = %s,
                    takeProfit3_Dollar = %s, stopLoss3_Dollar = %s,
                    takeProfit4_Dollar = %s, stopLoss4_Dollar = %s,
                    takeProfit5_Dollar = %s, stopLoss5_Dollar = %s,
                    takeProfit6_Dollar = %s, stopLoss6_Dollar = %s,
                    takeProfit7_Dollar = %s, stopLoss7_Dollar = %s,
                    takeProfit8_Dollar = %s, stopLoss8_Dollar = %s,
                    takeProfit9_Dollar = %s, stopLoss9_Dollar = %s,
                    takeProfit10_Dollar = %s, stopLoss10_Dollar = %s,

                    contracts = %s, offset = %s
                WHERE id = %s
            """
            values = (
                data["takeProfit1_Percen"], data["stopLoss1_Percen"],
                data["takeProfit2_Percen"], data["stopLoss2_Percen"],
                data["takeProfit3_Percen"], data["stopLoss3_Percen"],
                data["takeProfit4_Percen"], data["stopLoss4_Percen"],
                data["takeProfit5_Percen"], data["stopLoss5_Percen"],
                data["takeProfit6_Percen"], data["stopLoss6_Percen"],
                data["takeProfit7_Percen"], data["stopLoss7_Percen"],
                data["takeProfit8_Percen"], data["stopLoss8_Percen"],
                data["takeProfit9_Percen"], data["stopLoss9_Percen"],
                data["takeProfit10_Percen"], data["stopLoss10_Percen"],

                data["takeProfit1_Dollar"], data["stopLoss1_Dollar"],
                data["takeProfit2_Dollar"], data["stopLoss2_Dollar"],
                data["takeProfit3_Dollar"], data["stopLoss3_Dollar"],
                data["takeProfit4_Dollar"], data["stopLoss4_Dollar"],
                data["takeProfit5_Dollar"], data["stopLoss5_Dollar"],
                data["takeProfit6_Dollar"], data["stopLoss6_Dollar"],
                data["takeProfit7_Dollar"], data["stopLoss7_Dollar"],
                data["takeProfit8_Dollar"], data["stopLoss8_Dollar"],
                data["takeProfit9_Dollar"], data["stopLoss9_Dollar"],
                data["takeProfit10_Dollar"], data["stopLoss10_Dollar"],

                data["contracts"], data["offset"], id
            )
            cursor.execute(sql, values)
            connection.commit()

    @classmethod
    def saveDataVIP(cls, db, username, transactionID):
        try:
            connection = cls._connect()
            if connection.is_connected():
                cursor = connection.cursor()
                sql = "UPDATE user SET userPlan = 99, idTransaction = %s WHERE username = %s"
                values = (transactionID, username)
                cursor.execute(sql, values)
                connection.commit()
                cursor.close()
                connection.close()
                return True
        except Exception as e:
            print("Error:", e)
        return False

    @classmethod
    def saveDataVIP_validatedEmail(cls, db, username):
        try:
            connection = cls._connect()
            if connection.is_connected():
                cursor = connection.cursor()
                current_time = datetime.now()  # Obtener el timestamp actual

                sql = "UPDATE user SET userPlan = 98, start_trial = %s WHERE username = %s"
                values = (current_time, username)
                cursor.execute(sql, values)
                connection.commit()
                cursor.close()
                connection.close()
                return True
        except Exception as e:
            print("Error:", e)
        return False

    @classmethod
    def check_user_exists(cls, db, username):
        connection = cls._connect()
        if connection.is_connected():
            cursor = connection.cursor()
            sql = "SELECT COUNT(*) FROM user WHERE username = %s"
            cursor.execute(sql, (username,))
            row = cursor.fetchone()
            user_count = row[0]
            return user_count > 0

        return False

    @classmethod
    def saveToken(cls, db, username, token):
        connection = cls._connect()
        if connection.is_connected():
            cursor = connection.cursor()
            sql = "UPDATE user SET token = %s WHERE username = %s"
            values = (token, username)
            cursor.execute(sql, values)
            connection.commit()
            cursor.close()
            connection.close()
            return True

        return False

    @classmethod
    def token_exists(cls, db, token):
        connection = cls._connect()
        if connection.is_connected():
            cursor = connection.cursor()
            sql = "SELECT COUNT(*) FROM user WHERE token = %s"
            cursor.execute(sql, (token,))
            row = cursor.fetchone()
            token_count = row[0]
            return token_count > 0
        else:
            return False

    @classmethod
    def reset_password(cls, db, token, new_password):
        connection = cls._connect()
        hashed_password = generate_password_hash(new_password)
        if connection.is_connected():
            cursor = connection.cursor()
            try:
                # Actualiza la contraseña del usuario en la base de datos
                sql = "UPDATE user SET password = %s WHERE token = %s"
                cursor.execute(sql, (hashed_password, token))
                connection.commit()
                return True
            except Exception as e:
                # Maneja cualquier error que pueda ocurrir al actualizar la contraseña
                print(f"Error resetting password: {e}")
                return False
            finally:
                cursor.close()
                connection.close()
        return False
