
from  users.serializers import *
from rest_framework import viewsets
from rest_framework.views import APIView
from users.models import * 
from users.helper import * 
from organisations.models import * 
from rest_framework.response import Response
from notifications.serializers import *
from customers.models import *
from django.db.models import Q
from datetime import datetime, timedelta
from django.utils.dateparse import parse_date



# Create your views here.

class NotificationTypesView(viewsets.ModelViewSet):
    serializer_class = NotificationTypesSerializer
    def get_queryset(self):
        return NotificationTypes.objects.all()

class NotificationSubscriptionsViewset(APIView):
    serializer_class = NotificationSubscriptionSerializer

    def get(self, request):
        user_id = request.GET.get('user_id')
        subscriptions = []

        notification_types = NotificationTypes.objects.all()

        for notification_type in notification_types:
            subscription = NotificationSubscribers.objects.filter(user_id=user_id, type=notification_type.id).first()
            if subscription:
                subscriptions.append({
                    "id":notification_type.id,
                    "type": notification_type.title,
                    "is_subscribed": subscription.is_subscribed
                })
            else:
                subscriptions.append({
                    "id":notification_type.id,
                    "type": notification_type.title,
                    "is_subscribed": False
                })

        return Response({"count": len(subscriptions), "results": subscriptions})


    def post(self, request):
        request_data    = request.data
        process_type    = request_data['process_type']
        if process_type == 'process_single':
            user_id     = request_data['user_id']
            if user_id:
                user = User.objects.get(pk=user_id)
                subscriptions   = request_data['subscriptions']
                for subscription in subscriptions:
                    user_notification_sub = NotificationSubscribers.objects.filter(type__id=subscription['subscription_id'],user__id=user_id).first()
                    if user_notification_sub:
                        user_notification_sub.is_subscribed = subscription['is_subscribed']
                        user_notification_sub.sub_last_updated_by = self.request.user
                        user_notification_sub.save()
                    else:
                        data = {"user":user,"is_subscribed":subscription['is_subscribed'], "type":NotificationTypes.objects.get(pk=subscription['subscription_id']), "sub_added_by":self.request.user, "sub_last_updated_by":self.request.user}
                        NotificationSubscribers.objects.create(**data)

        return Response({"message":"Success"})
    
class NotificationsView(APIView):
    def get(self, request):
          notifications = Notifications.objects.all()
          data = NotificationSerializer(notifications,many=True).data
          return Response({"count": len(data), "results": data})
    
class UserNotificationsView(APIView):
    serializer_class = UserNotificationSerializer
    def get(self,request):
        filter_query = {}
        org_id = request.query_params.get('org_id',None)
        user_id = request.GET.get('user_id')
        status  = request.GET.get('status')
        start_date=request.GET.get('start_date')
        end_date=request.GET.get('end_date')

        if org_id:
            filter_query['notification__branch__branch_organisation__id'] = org_id
        if user_id:
            filter_query['subscriber__user__id'] = user_id
        if status =='read' or status =='un-read':
            filter_query['status'] = status
        if end_date:
            filter_query['date_added__lte'] = end_date
        if start_date:
            filter_query['date_added__gte'] = start_date
        user_notifications = UserNotifications.objects.filter(**filter_query).order_by('-id')
        data = UserNotificationSerializer(user_notifications,many=True).data
        return Response({"count":len(data),"results":data})
    
    def post(self, request, *args, **kwargs):
            notification_id = request.GET.get('notification')
            status          = request.data.get('status')
            clear_type      = request.data.get('type')
            user_id         = self.request.user.id

            if clear_type == "single":
                notification = UserNotifications.objects.get(notification__id=notification_id)
                if notification:
                    notification.status = status
                    notification.save()

            elif clear_type == "all":
                user_notifications = UserNotifications.objects.filter(subscriber__user__id=user_id, status='un-read')
                for notification in user_notifications:
                    notification.status=status
                    notification.save()
            return Response({"message":"Success"})