"""DRF ViewSets for MEL indicators.

Registered on the aggregate MEL router at :mod:`apps.mel.api`.
"""
from __future__ import annotations

from rest_framework import viewsets

from apps.core.pagination.paginators import StandardResultsPagination
from apps.mel.indicators.models import (
    DataPoint,
    Indicator,
    IndicatorTarget,
    LogFrame,
    LogFrameRow,
)
from apps.mel.indicators.serializers import (
    DataPointSerializer,
    IndicatorSerializer,
    IndicatorTargetSerializer,
    LogFrameRowSerializer,
    LogFrameSerializer,
)
from apps.mel.permissions import CanViewMelData, IsMelOfficer


class LogFrameViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = LogFrame.objects.prefetch_related("rows").all()
    serializer_class = LogFrameSerializer
    permission_classes = [CanViewMelData]
    pagination_class = StandardResultsPagination
    lookup_field = "slug"


class LogFrameRowViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = LogFrameRow.objects.select_related("logframe", "parent").all()
    serializer_class = LogFrameRowSerializer
    permission_classes = [CanViewMelData]
    pagination_class = StandardResultsPagination


class IndicatorViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Indicator.objects.select_related("logframe_row").all()
    serializer_class = IndicatorSerializer
    permission_classes = [CanViewMelData]
    pagination_class = StandardResultsPagination
    lookup_field = "code"


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


class DataPointViewSet(viewsets.ReadOnlyModelViewSet):
    """Read-only. Creation must go through :func:`record_data_point` so the
    idempotency + RAG + signal pipeline stays consistent."""

    queryset = DataPoint.objects.select_related("indicator").all()
    serializer_class = DataPointSerializer
    permission_classes = [IsMelOfficer]
    pagination_class = StandardResultsPagination
