"""Account app fragment endpoints.

Exposes sx fragments at ``/internal/fragments/<type>`` for consumption
by other coop apps via the fragment client.

All handlers are defined declaratively in .sx files under
``account/sx/handlers/`` and dispatched via the sx handler registry.
"""

from __future__ import annotations

from quart import Blueprint, Response, request

from shared.infrastructure.fragments import FRAGMENT_HEADER
from shared.sx.handlers import get_handler, execute_handler


def register():
    bp = Blueprint("fragments", __name__, url_prefix="/internal/fragments")

    @bp.before_request
    async def _require_fragment_header():
        if not request.headers.get(FRAGMENT_HEADER):
            return Response("", status=403)

    @bp.get("/<fragment_type>")
    async def get_fragment(fragment_type: str):
        handler_def = get_handler("account", fragment_type)
        if handler_def is not None:
            result = await execute_handler(
                handler_def, "account", args=dict(request.args),
            )
            return Response(result, status=200, content_type="text/sx")
        return Response("", status=200, content_type="text/sx")

    return bp
