from django.shortcuts import render
from .models import *
from rest_framework import generics
from common.views import *
from .serializers import *
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from django.http import JsonResponse
# Create your views here.

# Parent Mobile Views
class ParentSignInMobileView(generics.ListAPIView):
    authentication_classes = [APIKeyAuthentication, LoginAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["phone",'password']
    queryset = Parent.objects.all()
    serializer_class = ParentSerializer


class ParentForgetOrChangePasswordMobileView(generics.GenericAPIView):
    authentication_classes = [APIKeyAuthentication]
    serializer_class = ForgetOrChangePasswordSerializer
    queryset = []

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        result = serializer.save()
        return result


class ParentSignUpMobileView(generics.GenericAPIView):
    authentication_classes = [APIKeyAuthentication]
    serializer_class = SignUpSerializer
    queryset = []

    def post(self, request, *args, **kwargs):
        print(request.data)
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        result = serializer.save()
        return result


class ParentDetailSignUpMobileView(generics.CreateAPIView):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    serializer_class = ParentDetailSerializer


class ParentDataMobileView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    queryset = Parent.objects.all()
    serializer_class = ParentSerializer


# Parent Dashboard Views


class ParentListDashboardView(generics.ListAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    queryset = Parent.objects.all()
    serializer_class = ParentSerializer


class ParentDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    queryset = Parent.objects.all()
    serializer_class = ParentSerializer


# Emergency Contact


class EmergencyContactListMobileView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["parentId"]
    queryset = EmergencyContact.objects.all()
    serializer_class = EmergencyContactSerializer


class EmergencyContactDetailMobileView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    lookup_field = "id"
    queryset = EmergencyContact.objects.all()
    serializer_class = EmergencyContactSerializer


# Child


class ChildListMobileView(SubscriptionPlanMixin, generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["parentId", "childTypeId", "genderId"]
    queryset = Child.objects.all()
    serializer_class = ChildSerializer


class ChildDetailMobileView(
    SubscriptionPlanMixin, generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    lookup_field = "id"
    queryset = Child.objects.all()
    serializer_class = ChildSerializer


# Set App for Child


class SetAppForChild(generics.GenericAPIView):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    queryset = []

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

        parentIdRequest = request.query_params.get("parentId", None)

        if parentIdRequest == None:
            raise serializers.ValidationError({"error": "Parent Id is required"})

        jsonData = request.data
        if "parentId" not in jsonData:
            raise serializers.ValidationError({"error": "Parent Id is required"})

        parentIdData = jsonData["parentId"]
        if int(parentIdRequest) != parentIdData:
            raise serializers.ValidationError({"error": "Parent Id is invalid"})

        isExists = Parent.objects.filter(id=parentIdData).exists()

        if isExists == False:
            raise serializers.ValidationError({"error": "Parent Id is invalid"})

        if "childId" not in jsonData:
            raise serializers.ValidationError({"error": "Child Id is required"})

        childId = jsonData["childId"]
        isExists = Child.objects.filter(id=childId).exists()

        if isExists == False:
            raise serializers.ValidationError({"error": "Child Id is invalid"})

        errorMessage = ""
        recordCount = 0
        isSuccess = False
        childCount = Child.objects.filter(parentId=parentIdData).count()
        if childCount > 1:
            selected = Child.objects.get(id=childId)
            if selected.isSelected == False:
                selected.isSelected = True
                selected.save()
                recordCount = Child.objects.exclude(id=childId).update(isSelected=False)
                if recordCount > 0:
                    isSuccess = True
                else:
                    errorMessage = "Nothing Updated"
            else:
                errorMessage = "Already Selected"
        elif childCount <= 1:
            selected = Child.objects.get(id=childId)
            if selected.isSelected == False:
                if selected.isSelected == False:
                    selected.isSelected = True
                    selected.save()
                    isSuccess = True
            else:
                errorMessage = "Already Selected"

        if isSuccess == False:
            raise serializers.ValidationError({"error": [errorMessage]})

        return JsonResponse({"isSuccess": isSuccess}, safe=False)