"""MEL public read-only API.

PRD §5.3 — every viewset is gated behind :class:`CanViewMelData` so that
programme-officer / grants-manager / mel-officer / admin roles see the data
and ordinary applicants/learners do not. The MEL schema (LogFrame / Indicator
/ IndicatorTarget / DataPoint) has no per-programme FK, so role gating is the
available enforcement point. When a programme/funding-record FK is added on
LogFrame in a future sprint, fold it into ``get_queryset()`` here.
"""
from rest_framework import viewsets

from apps.mel.indicators.models import DataPoint, Indicator, IndicatorTarget, LogFrame
from apps.mel.indicators.serializers import (
    DataPointSerializer,
    IndicatorSerializer,
    IndicatorTargetSerializer,
    LogFrameSerializer,
)
from apps.mel.permissions import CanViewMelData


class LogFrameViewSet(viewsets.ReadOnlyModelViewSet):
    permission_classes = [CanViewMelData]
    serializer_class = LogFrameSerializer
    queryset = LogFrame.objects.filter(active=True).prefetch_related("rows")
    lookup_field = "slug"


class IndicatorViewSet(viewsets.ReadOnlyModelViewSet):
    permission_classes = [CanViewMelData]
    serializer_class = IndicatorSerializer
    queryset = (
        Indicator.objects.filter(is_active=True)
        .select_related("logframe_row__logframe")
        .prefetch_related("targets")
    )
    lookup_field = "code"


class IndicatorTargetViewSet(viewsets.ReadOnlyModelViewSet):
    permission_classes = [CanViewMelData]
    serializer_class = IndicatorTargetSerializer
    queryset = IndicatorTarget.objects.select_related("indicator").all()


class DataPointViewSet(viewsets.ReadOnlyModelViewSet):
    permission_classes = [CanViewMelData]
    serializer_class = DataPointSerializer
    queryset = DataPoint.objects.select_related("indicator").all()
    filterset_fields = ["indicator", "period_label", "status", "source_module"]
