from django.utils import timezone
from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView

from apps.notifications.delivery import dispatch_campaign, process_due_campaigns
from apps.notifications.models import NotificationCampaign
from apps.notifications.serializers import NotificationCampaignSerializer


class AdminNotificationCampaignListCreateView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def get(self, request):
        qs = NotificationCampaign.objects.all().order_by('-created_at')
        status_filter = request.query_params.get('status')
        if status_filter:
            qs = qs.filter(status=status_filter)
        serializer = NotificationCampaignSerializer(qs, many=True)
        return Response({'results': serializer.data, 'count': qs.count()}, status=status.HTTP_200_OK)

    def post(self, request):
        serializer = NotificationCampaignSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        campaign = serializer.save(created_by=request.user)
        send_now = bool(request.data.get('send_now'))

        # Fast-path queue behavior for "Create & Queue": do not dispatch here unless send_now is explicitly requested.
        if campaign.mode == 'scheduled' and campaign.scheduled_at:
            campaign.status = 'scheduled'
            campaign.save(update_fields=['status', 'updated_at'])
            return Response({'success': True, 'data': NotificationCampaignSerializer(campaign).data}, status=status.HTTP_201_CREATED)

        if campaign.mode == 'scheduled' and not campaign.scheduled_at and not send_now:
            return Response({'success': False, 'detail': 'scheduled_at is required for scheduled notifications.'}, status=status.HTTP_400_BAD_REQUEST)

        if not send_now:
            # Instant mode campaigns are queued as draft and can be sent from the list using "Send".
            campaign.status = 'draft'
            campaign.save(update_fields=['status', 'updated_at'])
            return Response({'success': True, 'data': NotificationCampaignSerializer(campaign).data}, status=status.HTTP_201_CREATED)

        result = dispatch_campaign(campaign)
        return Response({'success': True, 'data': NotificationCampaignSerializer(campaign).data, 'result': result}, status=status.HTTP_201_CREATED)


class AdminNotificationCampaignSendNowView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def post(self, request, campaign_id):
        campaign = NotificationCampaign.objects.filter(id=campaign_id).first()
        if not campaign:
            return Response({'detail': 'Not found'}, status=status.HTTP_404_NOT_FOUND)

        result = dispatch_campaign(campaign)
        return Response({'success': True, 'data': NotificationCampaignSerializer(campaign).data, 'result': result}, status=status.HTTP_200_OK)


class AdminNotificationCampaignDeleteView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def delete(self, request, campaign_id):
        campaign = NotificationCampaign.objects.filter(id=campaign_id).first()
        if not campaign:
            return Response({'detail': 'Not found'}, status=status.HTTP_404_NOT_FOUND)
        campaign.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)


class AdminProcessScheduledNotificationsView(APIView):
    permission_classes = [permissions.IsAdminUser]

    def post(self, request):
        result = process_due_campaigns()
        return Response({'success': True, 'result': result, 'processed_at': timezone.now()}, status=status.HTTP_200_OK)
