
from app import app
from flask import render_template, request, flash, redirect, url_for, session

# Importando mi conexión a BD
from conexion.conexionBD import connectionBD

import os


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

# Importando controllers para el modulo de login
from controllers.funciones_login import *
from flask import current_app
PATH_URL_LOGIN = "public/login"


@app.route('/', methods=['GET'])
def inicio():
    if 'conectado' in session:
        # Verificar si es admin
        if session.get('admin') == 1:
            return redirect(url_for('admin_dashboard'))
        else:
            return render_template('public/base_cpanel.html', dataLogin=dataLoginSesion())
    else:
        return render_template(f'{PATH_URL_LOGIN}/base_login.html')


@app.route('/mi-perfil', methods=['GET'])
def perfil():
    if 'conectado' in session:
        # Verificar si es admin
        if session.get('admin') == 1:
            return redirect(url_for('admin_dashboard'))
        else:
            return render_template(f'public/perfil/perfil.html', info_perfil_session=info_perfil_session())
    else:
        return redirect(url_for('inicio'))

@app.route('/colegio', methods=['GET'])
def colegio():
    if 'conectado' in session:
        # Verificar si es admin
        if session.get('admin') == 1:
            return redirect(url_for('admin_dashboard'))
        else:
            return render_template(f'public/perfil/codmodular.html', info_perfil_session=info_perfil_session())
    else:
        return redirect(url_for('inicio'))


# Crear cuenta de usuario
@app.route('/register-user', methods=['GET'])
def cpanelRegisterUser():
    if 'conectado' in session:
        return redirect(url_for('inicio'))
    else:
        return render_template(f'{PATH_URL_LOGIN}/auth_register.html')


# Recuperar cuenta de usuario
@app.route('/recovery-password', methods=['GET'])
def cpanelRecoveryPassUser():
    if 'conectado' in session:
        return redirect(url_for('inicio'))
    else:
        return render_template(f'{PATH_URL_LOGIN}/auth_forgot_password.html')


@app.route('/recovery-password', methods=['POST'])
def recovery_password_post():
    if 'conectado' in session:
        return redirect(url_for('inicio'))

    email_user = request.form.get('email_user')
    if not email_user:
        flash('Por favor ingrese un correo electrónico válido.', 'error')
        return redirect(url_for('cpanelRecoveryPassUser'))

    # Verificar si el email existe en la base de datos
    try:
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor(dictionary=True) as cursor:
                cursor.execute("SELECT * FROM users WHERE email_user = %s", (email_user,))
                user = cursor.fetchone()
                if not user:
                    flash('El correo electrónico no está registrado.', 'error')
                    return redirect(url_for('cpanelRecoveryPassUser'))
    except Exception as e:
        flash('Error al acceder a la base de datos.', 'error')
        return redirect(url_for('cpanelRecoveryPassUser'))

    # Generar token de recuperación
    secret_key = current_app.secret_key
    token = generate_reset_token(email_user, secret_key)

    # Construir URL de restablecimiento
    reset_url = url_for('reset_password_get', token=token, _external=True)

    # Configuración SMTP (configurable por variables de entorno en cPanel)
    smtp_config = {
        'smtp_server': os.environ.get('SMTP_SERVER', 'mail.ugelcondesuyos.com'),
        'smtp_port': int(os.environ.get('SMTP_PORT', 465)),
        'smtp_user': os.environ.get('SMTP_USER', 'informatica@ugelcondesuyos.com'),
        'smtp_password': os.environ.get('SMTP_PASSWORD', 'Ugel2025*'),
        'from_email': os.environ.get('SMTP_FROM_EMAIL', 'informatica@ugelcondesuyos.com'),
    }


    # Enviar correo de recuperación
    if send_recovery_email(email_user, reset_url, smtp_config):
        flash('Se ha enviado un correo para restablecer la contraseña.', 'success')
    else:
        flash('Error al enviar el correo de recuperación.', 'error')

    return redirect(url_for('cpanelRecoveryPassUser'))


@app.route('/reset-password/<token>', methods=['GET'])
def reset_password_get(token):
    if 'conectado' in session:
        return redirect(url_for('inicio'))

    secret_key = current_app.secret_key
    email = confirm_reset_token(token, secret_key)
    if not email:
        flash('El enlace de restablecimiento es inválido o ha expirado.', 'error')
        return redirect(url_for('cpanelRecoveryPassUser'))

    return render_template(f'{PATH_URL_LOGIN}/auth_reset_password.html', token=token, email=email)


@app.route('/reset-password/<token>', methods=['POST'])
def reset_password_post(token):
    if 'conectado' in session:
        return redirect(url_for('inicio'))

    secret_key = current_app.secret_key
    email = confirm_reset_token(token, secret_key)
    if not email:
        flash('El enlace de restablecimiento es inválido o ha expirado.', 'error')
        return redirect(url_for('cpanelRecoveryPassUser'))

    new_password = request.form.get('new_password')
    confirm_password = request.form.get('confirm_password')

    if not new_password or not confirm_password:
        flash('Por favor complete todos los campos.', 'error')
        return redirect(url_for('reset_password_get', token=token))

    if new_password != confirm_password:
        flash('Las contraseñas no coinciden.', 'error')
        return redirect(url_for('reset_password_get', token=token))

    # Actualizar la contraseña en la base de datos
    try:
        nueva_password_hash = generate_password_hash(new_password, method='scrypt')
        with connectionBD() as conexion_MySQLdb:
            with conexion_MySQLdb.cursor() as cursor:
                cursor.execute("UPDATE users SET pass_user = %s WHERE email_user = %s", (nueva_password_hash, email))
                conexion_MySQLdb.commit()
        flash('La contraseña ha sido actualizada correctamente.', 'success')
        return redirect(url_for('inicio'))
    except Exception as e:
        flash('Error al actualizar la contraseña.', 'error')
        return redirect(url_for('reset_password_get', token=token))


# Crear cuenta de usuario
@app.route('/saved-register', methods=['POST'])
def cpanelResgisterUserBD():
    if request.method == 'POST' and 'name_surname' in request.form and 'pass_user' in request.form:
        name_surname = request.form['name_surname']
        email_user = request.form['email_user']
        pass_user = request.form['pass_user']

        resultData = recibeInsertRegisterUser(
            name_surname, email_user, pass_user)
        if (resultData != 0):
            flash('la cuenta fue creada correctamente.', 'success')
            return redirect(url_for('inicio'))
        else:
            return redirect(url_for('inicio'))
    else:
        flash('el método HTTP es incorrecto', 'error')
        return redirect(url_for('inicio'))


# Actualizar datos de mi perfil
@app.route("/actualizar-datos-perfil", methods=['POST'])
def actualizarPerfil():
    if request.method == 'POST':
        if 'conectado' in session:
            respuesta = procesar_update_perfil(request.form)
            if respuesta == 1:
                flash('Los datos fuerón actualizados correctamente.', 'success')
                return redirect(url_for('inicio'))
            elif respuesta == 0:
                flash(
                    'La contraseña actual esta incorrecta, por favor verifique.', 'error')
                return redirect(url_for('perfil'))
            elif respuesta == 2:
                flash('Ambas claves deben se igual, por favor verifique.', 'error')
                return redirect(url_for('perfil'))
            elif respuesta == 3:
                flash('La Clave actual es obligatoria.', 'error')
                return redirect(url_for('perfil'))
            else:
                flash('Error al actualizar el perfil.', 'error')
                return redirect(url_for('perfil'))
        else:
            flash('primero debes iniciar sesión.', 'error')
            return redirect(url_for('inicio'))
    else:
        flash('primero debes iniciar sesión.', 'error')
        return redirect(url_for('inicio'))
    # If none of the conditions are met, return a default response
    return redirect(url_for('inicio'))


# Validar sesión
@app.route('/login', methods=['GET', 'POST'])
def loginCliente():
    if 'conectado' in session:
        return redirect(url_for('inicio'))
    else:
        if request.method == 'POST' and 'email_user' in request.form and 'pass_user' in request.form:

            email_user = str(request.form['email_user'])
            pass_user = str(request.form['pass_user'])

            # Comprobando si existe una cuenta
            conexion_MySQLdb = connectionBD()
            cursor = conexion_MySQLdb.cursor(dictionary=True)
            cursor.execute(
                "SELECT * FROM users WHERE email_user = %s", [email_user])
            account = cursor.fetchone()

            if account:
                if check_password_hash(account['pass_user'], pass_user):
                    # Crear datos de sesión, para poder acceder a estos datos en otras rutas
                    session['conectado'] = True
                    session['id'] = account['id']
                    session['name_surname'] = account['name_surname']
                    session['email_user'] = account['email_user']
                    session['admin'] = account['admin']

                    flash('la sesión fue correcta.', 'success')
                    # Redirigir basado en el nivel de admin
                    if account['admin'] == 1:
                        return redirect(url_for('admin_dashboard'))
                    else:
                        return redirect(url_for('colegio'))
                else:
                    # La cuenta no existe o el nombre de usuario/contraseña es incorrecto
                    flash('datos incorrectos por favor revise.', 'error')
                    return render_template(f'{PATH_URL_LOGIN}/base_login.html')
            else:
                flash('el usuario no existe, por favor verifique.', 'error')
                return render_template(f'{PATH_URL_LOGIN}/base_login.html')
        else:
            flash('primero debes iniciar sesión.', 'error')
            return render_template(f'{PATH_URL_LOGIN}/base_login.html')


@app.route('/closed-session',  methods=['GET'])
def cerraSesion():
    if request.method == 'GET':
        if 'conectado' in session:
            # Eliminar datos de sesión, esto cerrará la sesión del usuario
            session.pop('conectado', None)
            session.pop('id', None)
            session.pop('name_surname', None)
            session.pop('email_user', None)
            session.pop('admin', None)
            flash('tu sesión fue cerrada correctamente.', 'success')
            return redirect(url_for('inicio'))
        else:
            flash('recuerde debe iniciar sesión.', 'error')
            return render_template(f'{PATH_URL_LOGIN}/base_login.html')
