from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from ..models import NotificationHistory
from ..serializers import  NotificationHistorySerializer
from django.utils.timezone import now
from rest_framework import generics, permissions
from rest_framework.permissions import IsAuthenticated
from suscription.custom_pagination import CustomPagination
import logging

logger = logging.getLogger(__name__)

class VendorNotificationAPIView(generics.ListAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = NotificationHistorySerializer
    pagination_class = CustomPagination

    def list(self, request, *args, **kwargs):

        user = request.user

        notifications_qs = NotificationHistory.objects.filter(vendor=user).order_by('-sent_at')
        unread_count = notifications_qs.filter(is_read=False).count()

        # Apply pagination
        page = self.paginate_queryset(notifications_qs)

        serializer = self.get_serializer(page, many=True, context={'request': request})
        return Response({
            "status": True,
            'message': 'Buyer notifications retrieved successfully',
            'unread_count': unread_count,
            "data": self.get_paginated_response(serializer.data).data
        })

    
class VendorMarkNotificationReadAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        try:
            user = request.user

            unread_qs = NotificationHistory.objects.filter(vendor=user, is_read=False)
            unread_count = unread_qs.count()

            if unread_count == 0:
                logger.info(f"No unread notifications for vendor: {user.id}")
                return Response({
                    'status': False,
                    'message': 'No unread notifications found for this vendor.'
                }, status=status.HTTP_404_NOT_FOUND)

            unread_qs.update(is_read=True)

            logger.info(f"{unread_count} notifications marked as read for vendor: {user.id}")
            return Response({
                'status': True,
                'message': f'{unread_count} notifications marked as read.'
            }, status=status.HTTP_200_OK)

        except Exception as e:
            logger.exception(f"Error in VendorMarkNotificationReadAPIView for vendor={request.user.id}: {str(e)}")
            return Response({
                'status': False,
                'message': 'Internal server error.'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
        
class VendorDeleteNotificationAPIView(APIView) :

    permission_classes = [IsAuthenticated]

    def delete(self, request):
        notification_id = request.data.get('notification_id')

        if not notification_id :
            return Response({
                'status': False,
                'message': "notification_id is required.",
                'error': "Missing parameter: notification_id"
            }, status=status.HTTP_400_BAD_REQUEST)
        
        try :
            history = NotificationHistory.objects.filter(id=notification_id, vendor=request.user).first()

            if history :
                history.delete()
                
                logger.info(f"Vendor {request.user.id} deleted notification ID {notification_id}")

                return Response({
                    'status': True,
                    'message': 'Notification deleted successfully.'
                }, status=status.HTTP_200_OK)
            else :
                logger.warning(f"Vendor {request.user.id} tried to delete nonexistent or unauthorized notification ID {notification_id}")

                return Response({
                    'status': False,
                    'message': "Notification not found.",
                    'error': "Invalid notification ID or not owned by vendor."
                }, status=status.HTTP_404_NOT_FOUND)
            
        except Exception as e:
            logger.exception(f"Error deleting notification ID {notification_id} for vendor {request.user.id}")
            return Response({
                'status': False,
                'message': 'Internal server error.'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
   
   