"""CORS **sur un seul chemin** — l'upload direct navigateur → FastAPI (spec Imports, n°8).

La règle du projet est « appels api côté serveur uniquement ». La décision utilisateur n°8 y
pose **une** dérogation, et une seule : `POST /imports/files` est appelé directement par le
navigateur, avec le JWT Better Auth récupéré en même-origine. C'est ce qui contourne à la fois
la limite de 4,5 Mo des route handlers Vercel et la double traversée de bande passante — un
export Positions de 50 000 lignes dépasse couramment ce plafond.

Le middleware CORS de Starlette s'applique, lui, à **toute** l'application : le poser tel quel
ouvrirait `/sites`, `/jobs`, `/keywords` et le reste au navigateur, ce que la décision n°8 ne
demande pas et que personne ne relirait ensuite. `ScopedCORS` le confine donc à un chemin exact
— tout autre chemin passe à l'application sans qu'aucun en-tête CORS ne soit ajouté, préflight
compris (le navigateur refusera alors la requête, ce qui est exactement l'effet voulu).

Pas de `allow_credentials` : l'autorisation voyage dans l'en-tête `Authorization`, jamais dans
un cookie. Le mode CORS reste donc non credentialisé, et l'origine autorisée est exactement
`AUTH_BASE_URL` (= `BETTER_AUTH_URL` côté web), jamais `*`.
"""

from starlette.middleware.cors import CORSMiddleware
from starlette.types import ASGIApp, Receive, Scope, Send

UPLOAD_PATH = "/imports/files"


class ScopedCORS:
    """Délègue à `CORSMiddleware` pour un chemin exact, et à l'application pour tout le reste."""

    def __init__(self, app: ASGIApp, *, path: str, allow_origin: str) -> None:
        self._app = app
        self._path = path
        self._cors = CORSMiddleware(
            app,
            allow_origins=[allow_origin],
            allow_methods=["POST"],
            allow_headers=["Authorization", "Content-Type"],
            max_age=600,
        )

    async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
        if scope["type"] == "http" and scope.get("path") == self._path:
            await self._cors(scope, receive, send)
            return
        await self._app(scope, receive, send)
