from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from ..models import Device, NotificationHistory
from ..serializers import DeviceSerializer, 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
from login_signup.models import User

logger = logging.getLogger(__name__)

class RegisterDeviceAPIView(APIView):
    def post(self, request):
        device_id = request.data.get('device_id')
        platform = request.data.get('platform', 'android')
        status_flag = request.data.get('status', None) 
        user_id = request.data.get('user_id', None)

        if not device_id:
            return Response({'status': False, 'message': 'device_id is required', 'error': 'device_id is required'}, status=status.HTTP_400_BAD_REQUEST)

        try:
            device = Device.objects.get(device_id=device_id)
            message = "Device already exists"

            if status_flag is not None:
                device.status = status_flag
                device.save(update_fields=['status'])
                message = "Device status updated successfully"

            if user_id:
                try:
                    user = User.objects.get(id=user_id)
                    user.device = device
                    user.save(update_fields=['device'])
                except User.DoesNotExist:
                    pass

            return Response({
                "status": True,
                "message": message,
                "data": DeviceSerializer(device).data
            }, status=status.HTTP_200_OK)
            # else:
            #     return Response({
            #         "status": True,
            #         "message": "Device already exists",
            #         "data": DeviceSerializer(device).data
            #     }, status=status.HTTP_200_OK)

        except Device.DoesNotExist:
            device = Device.objects.create(
                device_id=device_id,
                platform=platform,
                status=True  # Always true on creation
            )
            
            if user_id:
                try:
                    user = User.objects.get(id=user_id)
                    user.device = device
                    user.save(update_fields=['device'])
                except User.DoesNotExist:
                    pass

            return Response({
                "status": True,
                "message": "Device created successfully",
                "data": DeviceSerializer(device).data
            }, status=status.HTTP_201_CREATED)
        
class BuyerNotificationAPIView(generics.ListAPIView):
    # permission_classes = [IsAuthenticated]
    serializer_class = NotificationHistorySerializer
    pagination_class = CustomPagination

    def list(self, request, *args, **kwargs):
        device_id = request.query_params.get('device_id')

        if not device_id:
            return Response({
                'status': False,
                'message': 'device_id is required'
            }, status=status.HTTP_400_BAD_REQUEST)

        device = Device.objects.filter(id=device_id).first()
        if not device:
            return Response({
                'status': False,
                'message': 'Device not found'
            }, status=status.HTTP_404_NOT_FOUND)

        # Fetch notifications
        notifications_qs = NotificationHistory.objects.filter(device=device).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 BuyerMarkNotificationReadAPIView(APIView):
    def post(self, request):
        try:
            device_id = request.data.get('device_id')

            if not device_id:
                logger.info("device_id missing in request.")
                return Response({
                    'status': False,
                    'message': 'device_id is required.'
                }, status=status.HTTP_400_BAD_REQUEST)

            device = Device.objects.filter(id=device_id).first()

            if not device:
                logger.info(f"Device not found or inactive: {device_id}")
                return Response({
                    'status': False,
                    'message': 'Active device not found.'
                }, status=status.HTTP_404_NOT_FOUND)

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

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

            unread_qs.update(is_read=True)

            logger.info(f"{unread_count} notifications marked as read for device: {device_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 BuyerMarkNotificationReadAPIView for device_id={request.data.get('device_id')}: {str(e)}")
            return Response({
                'status': False,
                'message': 'Internal server error.'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)