"""Notifications API: list, register token, mark read."""
from django.utils import timezone
from rest_framework.views import APIView

from core.models import DeviceToken, Notification
from .auth_utils import ok, err
from .permissions import IsAppUser
from .serializers import NotificationSerializer


class NotificationListView(APIView):
    permission_classes = [IsAppUser]

    def get(self, request):
        unread_only = request.query_params.get('unreadOnly', 'false').lower() == 'true'
        qs = Notification.objects.filter(user=request.app_user)
        if unread_only:
            qs = qs.filter(is_read=False)
        return ok(NotificationSerializer(qs[:50], many=True).data)


class RegisterTokenView(APIView):
    permission_classes = [IsAppUser]

    def post(self, request):
        token = request.data.get('token', '').strip()
        platform = request.data.get('platform', 'android')
        if not token:
            return err('token is required.', 400)
        DeviceToken.objects.update_or_create(
            token=token,
            defaults={
                'user': request.app_user,
                'platform': platform,
                'updated_at': timezone.now(),
            },
        )
        return ok(message='Token registered.')


class MarkNotificationReadView(APIView):
    permission_classes = [IsAppUser]

    def patch(self, request, pk):
        updated = Notification.objects.filter(
            id=pk, user=request.app_user,
        ).update(is_read=True)
        if not updated:
            return err('Notification not found.', 404)
        return ok(message='Marked as read.')


class MarkAllReadView(APIView):
    permission_classes = [IsAppUser]

    def patch(self, request):
        Notification.objects.filter(
            user=request.app_user, is_read=False,
        ).update(is_read=True)
        return ok(message='All notifications marked as read.')
