import os

from flask import Flask
from dotenv import load_dotenv

from app.config import Config
from app.extensions import db, login_manager, migrate, csrf

load_dotenv()


def create_app(config_class: type = Config) -> Flask:
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object(config_class)

    os.makedirs(app.config["UPLOAD_FOLDER"], exist_ok=True)

    db.init_app(app)
    login_manager.init_app(app)
    migrate.init_app(app, db)
    csrf.init_app(app)

    from app import models  # noqa: F401 (registers models with SQLAlchemy)

    from app.auth.routes import auth_bp
    from app.documents.routes import documents_bp
    from app.summary.routes import summary_bp
    from app.admin.routes import admin_bp
    from app.profiles.routes import profiles_bp
    from app.emergency.routes import emergency_bp
    from app.legal.routes import legal_bp

    app.register_blueprint(auth_bp)
    app.register_blueprint(documents_bp)
    app.register_blueprint(summary_bp)
    app.register_blueprint(admin_bp)
    app.register_blueprint(profiles_bp)
    app.register_blueprint(emergency_bp)
    app.register_blueprint(legal_bp)
    # Public page shown to a doctor/paramedic with no account — no CSRF token available.
    csrf.exempt(emergency_bp)

    if app.config.get("WHATSAPP_ENABLED"):
        from app.whatsapp.routes import whatsapp_bp
        # Meta calls this webhook directly (no browser session/CSRF token available).
        csrf.exempt(whatsapp_bp)
        app.register_blueprint(whatsapp_bp)

    if app.config.get("TELEGRAM_ENABLED"):
        from app.telegram.routes import telegram_bp
        # Telegram calls this webhook directly (no browser session/CSRF token available).
        csrf.exempt(telegram_bp)
        app.register_blueprint(telegram_bp)

    @app.context_processor
    def inject_profile_nav():
        from flask_login import current_user

        if current_user.is_authenticated and not current_user.is_admin():
            from app.profiles.helpers import get_active_patient
            return {"nav_active_patient": get_active_patient(), "nav_patients": current_user.patients}
        return {}

    @app.route("/")
    def index():
        from flask import redirect, url_for
        from flask_login import current_user

        if current_user.is_authenticated:
            if current_user.is_admin():
                return redirect(url_for("admin.index"))
            target = "summary.view" if current_user.patients else "profiles.new_profile"
            return redirect(url_for(target))
        return redirect(url_for("auth.login"))

    return app
