import os
import click
from flask import Flask

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


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

    os.makedirs(app.instance_path, exist_ok=True)

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

    from .models import User

    @login_manager.user_loader
    def load_user(user_id):
        return db.session.get(User, int(user_id))

    from .auth import bp as auth_bp
    from .users import bp as users_bp
    from .devices import bp as devices_bp
    from .config_mgmt import bp as config_mgmt_bp
    from .audit import bp as audit_bp

    app.register_blueprint(auth_bp)
    app.register_blueprint(users_bp)
    app.register_blueprint(devices_bp)
    app.register_blueprint(config_mgmt_bp)
    app.register_blueprint(audit_bp)

    from flask import redirect, url_for
    from flask_login import current_user

    @app.route("/")
    def index():
        if current_user.is_authenticated:
            return redirect(url_for("devices.list_devices"))
        return redirect(url_for("auth.login"))

    from flask import render_template

    @app.errorhandler(403)
    def forbidden(e):
        return render_template("errors.html", code=403, message="You don't have permission to do that."), 403

    @app.errorhandler(404)
    def not_found(e):
        return render_template("errors.html", code=404, message="Page not found."), 404

    @app.errorhandler(500)
    def server_error(e):
        return render_template("errors.html", code=500, message="Something went wrong."), 500

    register_cli(app)

    return app


def register_cli(app):
    @app.cli.command("create-admin")
    @click.option("--username", prompt=True)
    @click.option("--email", prompt=True, default="")
    @click.option("--password", prompt=True, hide_input=True, confirmation_prompt=True)
    def create_admin(username, email, password):
        """Create the first admin user."""
        from .models import User, ROLE_ADMIN

        if User.query.filter_by(username=username).first():
            click.echo(f"User '{username}' already exists.")
            return
        user = User(username=username, email=email or None, role=ROLE_ADMIN)
        user.set_password(password)
        db.session.add(user)
        db.session.commit()
        click.echo(f"Admin user '{username}' created.")
