"""
Extensiones del esquema OpenAPI.

drf-spectacular sabe describir las clases de autenticacion que conoce, pero no
las propias. Sin este registro, el esquema generado omite el esquema de
seguridad de cada endpoint y quien lea la documentacion no ve que hay que
mandar la cabecera.
"""

from drf_spectacular.extensions import OpenApiAuthenticationExtension


class TokenAuthenticationScheme(OpenApiAuthenticationExtension):
    """Token de un solo uso en `Authorization: Bearer <token>`."""

    target_class = "core.authentications.token_auth.TokenAuthentication"
    name = "bearerToken"

    def get_security_definition(self, auto_schema):
        return {
            "type": "http",
            "scheme": "bearer",
            "description": (
                "Token obtenido en `GET /auth/v1/token/`. Es de un solo uso: "
                "hay que pedir uno nuevo para cada peticion."
            ),
        }


class ApiKeyAuthenticationScheme(OpenApiAuthenticationExtension):
    """Clave de API en la cabecera `X-API-Key`."""

    target_class = "core.authentications.api_key_auth.ApiKeyAuthentication"
    name = "apiKey"

    def get_security_definition(self, auto_schema):
        return {
            "type": "apiKey",
            "in": "header",
            "name": "X-API-Key",
            "description": "Clave de API del cliente. Se canjea por un token.",
        }
