from __future__ import annotations import os from pathlib import Path from flask import Flask, g from app.auth import load_current_account from app.cli import register_commands from app.config import CONFIG_MAPPING from app.extensions import db, migrate from app.routes.auth import auth_bp from app.routes.admin import admin_bp from app.routes.quick_entry import quick_entry_bp from app.routes.health import health_bp from app.routes.main import main_bp from app.routes.csv import csv_bp from app.routes.share import share_bp from app.services import household_value_label def create_app(config_name: str | None = None) -> Flask: app = Flask(__name__, instance_relative_config=True) resolved_config_name = config_name or os.getenv("HW_CONFIG", "development") config_object = CONFIG_MAPPING.get(resolved_config_name, CONFIG_MAPPING["development"]) app.config.from_object(config_object) validate_config = getattr(config_object, "validate", None) if callable(validate_config): validate_config() Path(app.instance_path).mkdir(parents=True, exist_ok=True) db.init_app(app) migrate.init_app(app, db) app.register_blueprint(auth_bp) app.register_blueprint(admin_bp) app.register_blueprint(main_bp) app.register_blueprint(quick_entry_bp) app.register_blueprint(csv_bp) app.register_blueprint(share_bp) app.register_blueprint(health_bp) register_commands(app) app.before_request(load_current_account) def inject_template_context() -> dict[str, object]: return { "current_account": getattr(g, "current_account", None), "household_value_label": household_value_label, } app.context_processor(inject_template_context) return app