from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .models import UserNotificationPreference
from .serializers import UserNotificationPreferenceSerializer, UserNotificationPreferenceUpdateSerializer

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def get_notification_preferences(request):
    print("Authenticated user:", request.user)
    if not request.user.is_authenticated:
        return Response({"error": "Authentication required."}, status=401)
    prefs = UserNotificationPreference.objects.filter(user=request.user).select_related('notification_type')
    serializer = UserNotificationPreferenceSerializer(prefs, many=True)
    return Response(serializer.data)


@api_view(['POST'])
@permission_classes([IsAuthenticated])
def update_notification_preferences(request):
    data = request.data.get('preferences', [])
    for item in data:
        try:
            pref = UserNotificationPreference.objects.get(id=item['id'], user=request.user)
            serializer = UserNotificationPreferenceUpdateSerializer(pref, data=item, partial=True)
            if serializer.is_valid():
                serializer.save()
        except UserNotificationPreference.DoesNotExist:
            continue
    return Response({"success": True, "message": "Preferences updated."})


from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status

from .models import Notification
from .serializers import NotificationSerializer

class NotificationListAPI(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        """
        GET /api/notifications/?unread=true
        Returns current user's notifications (optionally only unread), newest first.
        """
        qs = Notification.objects.filter(user=request.user).order_by("-created_at")

        unread = request.query_params.get("unread")
        if unread in ("1", "true", "True", "yes"):
            qs = qs.filter(is_read=False)

        data = NotificationSerializer(qs, many=True).data
        return Response({"count": qs.count(), "results": data}, status=status.HTTP_200_OK)

    def patch(self, request):
        """
        PATCH /api/notifications/
        Body: { "ids": [1,2,3] }  -> marks those as read
        Body: {}                  -> marks *all unread* as read
        """
        ids = request.data.get("ids")
        qs = Notification.objects.filter(user=request.user, is_read=False)
        if ids:
            qs = qs.filter(id__in=ids)

        updated = qs.update(is_read=True)
        return Response({"updated": updated}, status=status.HTTP_200_OK)


class NotificationDetailAPI(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, note_id):
        """
        GET /api/notifications/<note_id>/
        Marks as read (if unread) and returns the note.
        """
        note = get_object_or_404(Notification, id=note_id, user=request.user)
        if not note.is_read:
            note.is_read = True
            note.save(update_fields=["is_read"])

        data = NotificationSerializer(note).data
        return Response(data, status=status.HTTP_200_OK)
