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


def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    # Ensure upload/results dirs exist
    os.makedirs(app.config.get('UPLOAD_FOLDER', 'uploads'), exist_ok=True)
    os.makedirs(app.config.get('RESULTS_FOLDER', 'results'), exist_ok=True)

    # Init extensions
    db.init_app(app)
    migrate.init_app(app, db)
    login_manager.init_app(app)
    csrf.init_app(app)

    # Register blueprints
    from app.blueprints.auth import bp as auth_bp
    app.register_blueprint(auth_bp)

    from app.blueprints.datasets import bp as datasets_bp
    app.register_blueprint(datasets_bp)

    from app.blueprints.analysis import bp as analysis_bp
    app.register_blueprint(analysis_bp)

    from app.blueprints.api import bp as api_bp
    app.register_blueprint(api_bp, url_prefix='/api')

    # Init Celery
    from app.tasks import init_celery
    init_celery(app)

    # Serve result images
    @app.route('/results/<path:filename>')
    def result_file(filename):
        from flask import send_from_directory
        return send_from_directory(app.config['RESULTS_FOLDER'], filename)

    # Landing page
    @app.route('/')
    def index():
        from flask import render_template
        return render_template('index.html')

    return app
