import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy  # Importar SQLAlchemy
from flask_migrate import Migrate  # Importar Migrate
from .extensions import db, login_manager
from flask_wtf.csrf import CSRFProtect
from .models import User
from dotenv import load_dotenv
import urllib.parse

load_dotenv()

def create_app():
    app = Flask(__name__)
    migrate = Migrate(app, db)

    # Configuración de la base de datos
    db_user = os.getenv('DB_USER')
    db_password = os.getenv('DB_PASSWORD')
    db_host = os.getenv('DB_HOST')
    db_name = os.getenv('DB_NAME')
    secret_key = os.getenv('SECRET_KEY')

    # Escapar la contraseña y el usuario
    db_user = urllib.parse.quote_plus(db_user)
    db_password = urllib.parse.quote_plus(db_password)

    # Imprimir las variables de entorno para depuración
    print(f"DB_USER: {db_user}")
    print(f"DB_PASSWORD: {db_password}")
    print(f"DB_HOST: {db_host}")
    print(f"DB_NAME: {db_name}")

    app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}?charset=utf8mb4'
    app.config['SECRET_KEY'] = secret_key
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # Para suprimir la advertencia

    # Inicialización de CSRFProtect
    csrf = CSRFProtect(app)

    # Inicialización de extensiones
    db.init_app(app)
    login_manager.init_app(app)

    # Registro del Blueprint
    from .routes import bp as auth_bp
    app.register_blueprint(auth_bp)

    # Cargador de usuario
    @login_manager.user_loader
    def load_user(user_id):
        return User.query.get(int(user_id))

    return app
