"""DRF ViewSets for MEL reports."""
from __future__ import annotations

from rest_framework import viewsets

from apps.core.pagination.paginators import StandardResultsPagination
from apps.mel.permissions import CanViewMelData, IsMelOfficer
from apps.mel.reports.models import (
    ComplianceAlert,
    Report,
    ReportArtifact,
    ReportDistribution,
    ReportTemplate,
)
from apps.mel.reports.serializers import (
    ComplianceAlertSerializer,
    ReportArtifactSerializer,
    ReportDistributionSerializer,
    ReportSerializer,
    ReportTemplateSerializer,
)


class ReportTemplateViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = ReportTemplate.objects.all()
    serializer_class = ReportTemplateSerializer
    permission_classes = [CanViewMelData]
    pagination_class = StandardResultsPagination
    lookup_field = "slug"


class ReportViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Report.objects.select_related("template").prefetch_related("artifacts").all()
    serializer_class = ReportSerializer
    permission_classes = [CanViewMelData]
    pagination_class = StandardResultsPagination


class ReportArtifactViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = ReportArtifact.objects.select_related("report").all()
    serializer_class = ReportArtifactSerializer
    permission_classes = [CanViewMelData]
    pagination_class = StandardResultsPagination


class ReportDistributionViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = ReportDistribution.objects.select_related("report", "recipient_user").all()
    serializer_class = ReportDistributionSerializer
    permission_classes = [IsMelOfficer]
    pagination_class = StandardResultsPagination


class ComplianceAlertViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = ComplianceAlert.objects.select_related("report", "indicator").all()
    serializer_class = ComplianceAlertSerializer
    permission_classes = [IsMelOfficer]
    pagination_class = StandardResultsPagination
