"""Apex application factory."""
import logging
import os
import sys
from datetime import timedelta
from flask import Flask
from flask_cors import CORS

sys.dont_write_bytecode = True
APEX_ROOT = os.path.abspath(os.path.dirname(__file__))
if APEX_ROOT not in sys.path:
    sys.path.insert(0, APEX_ROOT)

from config import Config
from errors import register_error_handlers
from extensions import init_extensions


def create_app(config: Config | None = None) -> Flask:
    if config is None:
        config = Config()

    app = Flask(__name__)  # No static/template folder — Next.js handles frontend

    CORS(app,
         origins=["https://apex.rptechindia.com", "http://localhost:3000"],
         supports_credentials=True,
         allow_headers=["Content-Type", "Authorization"],
         methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"])

    app.secret_key = config.FLASK_SECRET_KEY
    app.permanent_session_lifetime = timedelta(days=26)
    app.config["SESSION_PERMANENT"] = False
    app.config["SESSION_COOKIE_HTTPONLY"] = True
    app.config["SESSION_COOKIE_SAMESITE"] = "None"
    app.config["SESSION_COOKIE_SECURE"] = True
    app.config["DEBUG"] = os.getenv("FLASK_DEBUG", "false").lower() == "true"

    init_extensions(app, config)

    from extensions import digest_scheduler
    digest_scheduler.start()

    from blueprints.auth import auth_bp
    from blueprints.home import home_bp
    from blueprints.workspace import workspace_bp
    from blueprints.sap import sap_bp
    from blueprints.assistant import assistant_bp
    from blueprints.admin import admin_bp
    from blueprints.pdf_extractor import pdf_extractor_bp
    from blueprints.po_tracker import po_tracker_bp

    app.register_blueprint(auth_bp, url_prefix="/auth")
    app.register_blueprint(admin_bp, url_prefix="/admin")
    for bp in (home_bp, workspace_bp, sap_bp, assistant_bp, pdf_extractor_bp, po_tracker_bp):
        app.register_blueprint(bp)

    @app.route("/health")
    def health_check():
        import time as _time
        from flask import jsonify as _json
        import extensions as _ext
        checks = {}; overall = "ok"
        try:
            rc = _ext.redis_client
            if rc and rc.enabled: rc.client.ping(); checks["redis"] = {"status":"ok"}
            else: checks["redis"] = {"status":"fallback"}
        except Exception as exc:
            checks["redis"] = {"status":"error","error":str(exc)[:120]}; overall = "degraded"
        try:
            hana_host = os.getenv("HANA_HOST","")
            checks["sap_hana"] = {"status":"configured" if hana_host else "not_configured"}
        except: pass
        return _json({"status":overall,"checks":checks}), (200 if overall=="ok" else 503)

    register_error_handlers(app)
    logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s")
    return app


if __name__ == "__main__":
    _app = create_app()
    _app.run(host="0.0.0.0", port=8005, debug=False, threaded=True)