"""DRF endpoints for the schema engine."""

from __future__ import annotations

from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from simorgh.apps.iam.engine import is_allowed
from simorgh.apps.iam.permissions import HasPermission
from simorgh.apps.schema.registry import (
    EntitySchema,
    SchemaError,
    get_entity,
    list_entities,
)
from simorgh.core.context import current_request_context


def _visible(entity: EntitySchema) -> bool:
    if not entity.view_permission:
        return True
    return is_allowed(current_request_context(), entity.view_permission)


class EntitySchemaListView(APIView):
    """`GET /api/v1/schema/` — every entity the caller is allowed to see."""

    permission_classes = (IsAuthenticated,)

    def get(self, request):
        payload = [e.serialize() for e in list_entities() if _visible(e)]
        return Response({"results": payload})


class EntitySchemaDetailView(APIView):
    """`GET /api/v1/schema/<name>/` — one entity, gated by its view permission."""

    permission_classes = (IsAuthenticated, HasPermission)

    def get_required_permission(self, request, view):
        name = view.kwargs.get("name", "")
        try:
            return get_entity(name).view_permission or None
        except SchemaError:
            return None

    def get(self, request, name: str):
        try:
            entity = get_entity(name)
        except SchemaError:
            return Response({"detail": "Unknown entity"}, status=404)
        return Response(entity.serialize())
