import logging import os from pathlib import Path from flask import Flask from flask_login import LoginManager from .core import ( LicenseService, MonitorEngine, RuntimeState, User, ensure_secret_key, load_license_key, ) from .routes import register_routes def configure_logging() -> None: logging.basicConfig( level=os.getenv("VFM_LOG_LEVEL", "INFO").upper(), format="%(asctime)s [%(levelname)s] %(message)s", ) def is_production_mode() -> bool: value = os.getenv("VFM_ENV", "").strip().lower() return value in {"prod", "production"} def create_app(base_dir: str | Path | None = None, start_monitor: bool = True) -> Flask: configure_logging() resolved_base_dir = Path(base_dir) if base_dir else Path(__file__).resolve().parent.parent secret_path = resolved_base_dir / "app_secret.key" default_password = os.getenv("VFM_DEFAULT_PASSWORD", "admin") app = Flask( __name__, template_folder=str(resolved_base_dir / "templates"), ) app.secret_key = os.getenv("VFM_APP_SECRET") or ensure_secret_key(secret_path) runtime_state = RuntimeState(resolved_base_dir, default_password) license_service = LicenseService( resolved_base_dir / "license.key", load_license_key(require_env=is_production_mode()), ) app.extensions["runtime_state"] = runtime_state app.extensions["license_service"] = license_service login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = "login" @login_manager.user_loader def load_user(user_id): return User(user_id) register_routes(app) if start_monitor: monitor_engine = MonitorEngine(runtime_state, license_service) app.extensions["monitor_engine"] = monitor_engine monitor_engine.start() return app