from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from account.permissions import accessible_shops
from shop_management.models.data.notification import OperationalAlert
from shop_management.serializers.data.notification import OperationalAlertSerializer
from shop_management.services.notifications import sync_operational_alerts
from shop_management.views.data.pagination import CustomPagination


class OperationalAlertViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = OperationalAlertSerializer
    permission_classes = [IsAuthenticated]
    pagination_class = CustomPagination
    filterset_fields = ["alert_type", "severity", "is_read", "shop"]

    def get_queryset(self):
        return OperationalAlert.objects.filter(
            recipient=self.request.user,
            shop__in=accessible_shops(self.request.user, self.request),
            is_active=True,
        ).select_related("shop")

    def list(self, request, *args, **kwargs):
        sync_operational_alerts(request.user, request)
        return super().list(request, *args, **kwargs)

    def partial_update(self, request, *args, **kwargs):
        alert = self.get_object()
        serializer = self.get_serializer(alert, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

    @action(detail=False, methods=["get"], url_path="unread-count")
    def unread_count(self, request):
        sync_operational_alerts(request.user, request)
        return Response({"count": self.get_queryset().filter(is_read=False).count()})

    @action(detail=False, methods=["post"], url_path="mark-all-read")
    def mark_all_read(self, request):
        count = self.get_queryset().filter(is_read=False).update(is_read=True)
        return Response({"updated": count})
