# Importandopaquetes desde flask
from flask import session, flash, current_app

# Importando conexion a BD
from conexion.conexionBD import connectionBD
# Para  validar contraseña
from werkzeug.security import check_password_hash

import re
# Para encriptar contraseña generate_password_hash
from werkzeug.security import generate_password_hash

# Para tokens de recuperación
from itsdangerous import URLSafeTimedSerializer

# Para enviar emails
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


def recibeInsertRegisterUser(name_surname, email_user, pass_user):
    respuestaValidar = validarDataRegisterLogin(
        name_surname, email_user, pass_user)

    if (respuestaValidar):
        nueva_password = generate_password_hash(pass_user, method='scrypt')
        try:
            with connectionBD() as conexion_MySQLdb:
                with conexion_MySQLdb.cursor(dictionary=True) as mycursor:
                    sql = "INSERT INTO users(name_surname, email_user, pass_user) VALUES (%s, %s, %s)"
                    valores = (name_surname, email_user, nueva_password)
                    mycursor.execute(sql, valores)
                    conexion_MySQLdb.commit()
                    resultado_insert = mycursor.rowcount
                    return resultado_insert
        except Exception as e:
            print(f"Error en el Insert users: {e}")
            return []
    else:
        return False


# Validando la data del Registros para el login
def validarDataRegisterLogin(name_surname, email_user, pass_user):
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                querySQL = "SELECT * FROM users WHERE email_user = %s"
                cursor.execute(querySQL, (email_user,))
                userBD = cursor.fetchone()  # Obtener la primera fila de resultados

                if userBD is not None:
                    flash('el registro no fue procesado ya existe la cuenta', 'error')
                    return False
                elif not re.match(r'[^@]+@[^@]+\.[^@]+', email_user):
                    flash('el Correo es invalido', 'error')
                    return False
                elif not name_surname or not email_user or not pass_user:
                    flash('por favor llene los campos del formulario.', 'error')
                    return False
                else:
                    # La cuenta no existe y los datos del formulario son válidos, puedo realizar el Insert
                    return True
    except Exception as e:
        print(f"Error en validarDataRegisterLogin : {e}")
        return []


def info_perfil_session():
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                querySQL = "SELECT name_surname, email_user, codmodular, codmodular2, codmodular3 FROM users WHERE id = %s"
                cursor.execute(querySQL, (session['id'],))
                info_perfil = cursor.fetchall()
        return info_perfil
    except Exception as e:
        print(f"Error en info_perfil_session : {e}")
        return []


def procesar_update_perfil(data_form):
    # Extraer datos del diccionario data_form
    id_user = session['id']
    name_surname = data_form['name_surname']
    email_user = data_form['email_user']
    pass_actual = data_form['pass_actual']
    new_pass_user = data_form['new_pass_user']
    repetir_pass_user = data_form['repetir_pass_user']

    if not pass_actual or not email_user:
        return 3

    with connectionBD() as conexion_MySQLdb:
        with conexion_MySQLdb.cursor(dictionary=True) as cursor:
            querySQL = """SELECT * FROM users WHERE email_user = %s LIMIT 1"""
            cursor.execute(querySQL, (email_user,))
            account = cursor.fetchone()
            if account:
                if check_password_hash(account['pass_user'], pass_actual):
                    # Verificar si new_pass_user y repetir_pass_user están vacías
                    if not new_pass_user or not repetir_pass_user:
                        return updatePefilSinPass(id_user, name_surname)
                    else:
                        if new_pass_user != repetir_pass_user:
                            return 2
                        else:
                            try:
                                nueva_password = generate_password_hash(
                                    new_pass_user, method='scrypt')
                                with connectionBD() as conexion_MySQLdb:
                                    with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                                        querySQL = """
                                            UPDATE users
                                            SET
                                                name_surname = %s,
                                                pass_user = %s
                                            WHERE id = %s
                                        """
                                        params = (name_surname,
                                                  nueva_password, id_user)
                                        cursor.execute(querySQL, params)
                                        conexion_MySQLdb.commit()
                                        rowcount = cursor.rowcount
                                return rowcount or []
                            except Exception as e:
                                print(
                                    f"Ocurrió en procesar_update_perfil: {e}")
                                return []
            else:
                return 0


def updatePefilSinPass(id_user, name_surname):
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                querySQL = """
                    UPDATE users
                    SET 
                        name_surname = %s
                    WHERE id = %s
                """
                params = (name_surname, id_user)
                cursor.execute(querySQL, params)
                conexion_MySQLdb.commit()
        return cursor.rowcount
    except Exception as e:
        print(f"Ocurrió un error en la funcion updatePefilSinPass: {e}")
        return []


def dataLoginSesion():
    inforLogin = {
        "id": session['id'],
        "name_surname": session['name_surname'],
        "email_user": session['email_user']
        
    }
    return inforLogin


def generate_reset_token(email, secret_key, expiration=3600):
    serializer = URLSafeTimedSerializer(secret_key)
    return serializer.dumps(email, salt='password-recovery-salt')


def confirm_reset_token(token, secret_key, expiration=3600):
    serializer = URLSafeTimedSerializer(secret_key)
    try:
        email = serializer.loads(
            token,
            salt='password-recovery-salt',
            max_age=expiration
        )
    except Exception:
        return False
    return email


def send_recovery_email(to_email, reset_url, smtp_config):
    try:
        msg = MIMEMultipart('alternative')
        msg['Subject'] = "Restablecer contraseña"
        msg['From'] = smtp_config['from_email']
        msg['To'] = to_email

        html = f"""
        <html>
        <body>
            <p>Hola,</p>
            <p>Has solicitado restablecer tu contraseña. Haz clic en el siguiente enlace para cambiarla:</p>
            <p><a href="{reset_url}">Restablecer contraseña</a></p>
            <p>Si no solicitaste este cambio, ignora este correo.</p>
        </body>
        </html>
        """
        part = MIMEText(html, 'html')
        msg.attach(part)

        port = smtp_config['smtp_port']
        if port == 465:
            # Use SSL
            with smtplib.SMTP_SSL(smtp_config['smtp_server'], port) as server:
                server.login(smtp_config['smtp_user'], smtp_config['smtp_password'])
                server.sendmail(smtp_config['from_email'], to_email, msg.as_string())
        else:
            # Use TLS
            with smtplib.SMTP(smtp_config['smtp_server'], port) as server:
                server.starttls()
                server.login(smtp_config['smtp_user'], smtp_config['smtp_password'])
                server.sendmail(smtp_config['from_email'], to_email, msg.as_string())
        return True
    except Exception as e:
        print(f"Error sending recovery email: {e}")
        return False
