from rest_framework import status
from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from core.responses import success_response, error_response
from core.permissions import IsAdmin

from .models import Notification, NotificationTemplate
from .serializers import NotificationSerializer, NotificationTemplateSerializer


class NotificationTemplateViewSet(ModelViewSet):
    """Admin CRUD for candidate-notification templates (Email/WhatsApp/SMS)."""
    queryset = NotificationTemplate.objects.all()
    serializer_class = NotificationTemplateSerializer
    permission_classes = [IsAdmin]

    def list(self, request, *args, **kwargs):
        qs = self.get_queryset()
        ch = request.query_params.get("channel")
        active = request.query_params.get("is_active")
        if ch:
            qs = qs.filter(channel=ch)
        if active in ("true", "1"):
            qs = qs.filter(is_active=True)
        return success_response(self.get_serializer(qs, many=True).data)

    def perform_create(self, serializer):
        serializer.save(created_by=self.request.user)

    def create(self, request, *args, **kwargs):
        s = self.get_serializer(data=request.data); s.is_valid(raise_exception=True)
        self.perform_create(s)
        return success_response(s.data, "Template created.", status_code=status.HTTP_201_CREATED)

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop("partial", False)
        s = self.get_serializer(self.get_object(), data=request.data, partial=partial)
        s.is_valid(raise_exception=True); s.save()
        return success_response(s.data, "Template updated.")

    def destroy(self, request, *args, **kwargs):
        self.get_object().delete()
        return success_response(None, "Template deleted.")


class ActiveTemplatesView(APIView):
    """GET /notifications/templates/active/?channel=EMAIL — active templates for
    the candidate notify picker (any authenticated staff user)."""
    permission_classes = [IsAuthenticated]

    def get(self, request):
        qs = NotificationTemplate.objects.filter(is_active=True)
        ch = request.query_params.get("channel")
        if ch:
            qs = qs.filter(channel=ch)
        return success_response(NotificationTemplateSerializer(qs, many=True).data)


class NotificationListView(ListAPIView):
    serializer_class = NotificationSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        return Notification.objects.filter(user=self.request.user)[:50]


class MarkNotificationReadView(APIView):
    permission_classes = [IsAuthenticated]

    def patch(self, request, pk):
        notification = Notification.objects.filter(pk=pk, user=request.user).first()
        if not notification:
            return error_response("Notification not found.", status_code=404)
        notification.is_read = True
        notification.save(update_fields=["is_read"])
        return success_response(NotificationSerializer(notification).data, "Notification marked as read")


class MarkAllNotificationsReadView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        Notification.objects.filter(user=request.user, is_read=False).update(is_read=True)
        return success_response(None, "All notifications marked as read")
