from rest_framework import generics
from .models import *
from .serializers import *
from common.views import APIKeyAuthentication,MobileTokenAuthentication,StandardSetPagination,DashboardTokenAuthentication
from django_filters.rest_framework import DjangoFilterBackend
from django.http import JsonResponse
from rest_framework import filters as searchfilter
from rest_framework import status
from django_filters import rest_framework as filters
from django.db.models import Sum
from django.db.models.functions import Coalesce
from django.utils import timezone

from rest_framework.views import APIView

from rest_framework.response import Response

class GetCallBackInfo(generics.GenericAPIView):
    queryset = []
    
    def get(self, request, *args, **kwargs):
        print("URL:", request.build_absolute_uri())
        print(request.body)
        return JsonResponse({})
    
    def post(self, request, *args, **kwargs):
        print("URL:", request.build_absolute_uri())
        print(request.body)
        return JsonResponse({})

#Currency
class CurrencyDetailMobileView(
   generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    lookup_field = "id"
    queryset = Currency.objects.all()
    serializer_class = CurrencySerializer

class CurrencyListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = Currency.objects.all().order_by("createdDate")
    serializer_class = CurrencySerializer

class CurrencyDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    lookup_field = "id"
    queryset = Currency.objects.all()
    serializer_class = CurrencySerializer

#Currency Language
class CurrencyLanguageListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "currencyId"]
    pagination_class = StandardSetPagination
    queryset = CurrencyLanguage.objects.all().order_by("createdDate")
    serializer_class = CurrencyLanguageSerializer

class CurrencyLanguageDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "currencyId"]
    lookup_field = "id"
    queryset = CurrencyLanguage.objects.all()
    serializer_class = CurrencyLanguageSerializer

#Payment Method
class PaymentMethodListMobileView(generics.ListAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = PaymentMethod.objects.filter(isEnabled = True)
    serializer_class = PaymentMethodSerializer

class PaymentMethodListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = PaymentMethod.objects.all()
    serializer_class = PaymentMethodSerializer

class PaymentMethodDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    lookup_field = "id"
    queryset = PaymentMethod.objects.all()
    serializer_class = PaymentMethodSerializer

#Payment Method Language
class PaymentMethodLanguageListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "paymentMethodId"]
    pagination_class = StandardSetPagination
    queryset = PaymentMethodLanguage.objects.all().order_by("createdDate")
    serializer_class = PaymentMethodLanguageSerializer

class PaymentMethodLanguageDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "paymentMethodId"]
    lookup_field = "id"
    queryset = PaymentMethodLanguage.objects.all()
    serializer_class = PaymentMethodLanguageSerializer

#Store
class StoreListMobileView(generics.ListAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = Store.objects.all().order_by("createdDate")
    serializer_class = StoreSerializer

class StoreListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = Store.objects.all().order_by("createdDate")
    serializer_class = StoreSerializer

class StoreDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    lookup_field = "id"
    queryset = Store.objects.all()
    serializer_class = StoreSerializer

#Store Language
class StoreLanguageListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "storeId"]
    pagination_class = StandardSetPagination
    queryset = StoreLanguage.objects.all().order_by("createdDate")
    serializer_class = StoreLanguageSerializer

class StoreLanguageDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "storeId"]
    lookup_field = "id"
    queryset = StoreLanguage.objects.all()
    serializer_class = StoreLanguageSerializer

#Shopping Account
class ShoppingAccountListMobileView(generics.ListCreateAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["parentId", "storeId","isSelected"]
    pagination_class = StandardSetPagination
    queryset = ShoppingAccount.objects.all().order_by('parentId')
    serializer_class = ShoppingAccountSerializer

class ShoppingAccountDetailMobileView(
   generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["parentId", "storeId"]
    lookup_field = "id"
    queryset = ShoppingAccount.objects.all()
    serializer_class = ShoppingAccountSerializer

class ShoppingAccountListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["parentId", "storeId"]
    pagination_class = StandardSetPagination
    queryset = ShoppingAccount.objects.all().order_by("createdDate")
    serializer_class = ShoppingAccountSerializer

class ShoppingAccountDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["parentId", "storeId"]
    lookup_field = "id"
    queryset = ShoppingAccount.objects.all()
    serializer_class = ShoppingAccountSerializer

#Address Book

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

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

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

        if parentIdRequest == None:
            raise serializers.ValidationError({"error": "Parent Id is required"})
        
        if addressBookId == None:
            raise serializers.ValidationError({"error": "Address Book Id is required"})
        
        dataList = AddressBook.objects.filter(id = addressBookId)
        
        if dataList.__len__() == 0:
            raise serializers.ValidationError({"error": "No Records Found"})
        
        AddressBook.objects.exclude(id = addressBookId).update(isSelected=False)
        
        AddressBook.objects.filter(id = addressBookId).update(isSelected=True)
        
        return JsonResponse({"isSuccess": True}, safe=False)

class AddressBookListMobileView(
    generics.ListCreateAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["shoppingAccountId"]
    lookup_field = "id"
    pagination_class = StandardSetPagination
    queryset = AddressBook.objects.all()
    serializer_class = AddressBookSerializer

class AddressBookDetailMobileView(
    generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["shoppingAccountId"]
    lookup_field = "id"
    queryset = AddressBook.objects.all()
    serializer_class = AddressBookSerializer

class AddressBookListDashboardView(
    generics.ListCreateAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        DashboardTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["shoppingAccountId"]
    lookup_field = "id"
    pagination_class = StandardSetPagination
    queryset = AddressBook.objects.all()
    serializer_class = AddressBookSerializer

class AddressBookDetailDashboardView(
    generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        DashboardTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["shoppingAccountId"]
    lookup_field = "id"
    queryset = AddressBook.objects.all()
    serializer_class = AddressBookSerializer

#Collection
class CollectionListMobileView(generics.ListAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["collectionId"]
    pagination_class = StandardSetPagination
    queryset = Collection.objects.all().order_by("createdDate")
    serializer_class = CollectionSerializer

class CollectionListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = Collection.objects.all().order_by("createdDate")
    serializer_class = CollectionSerializer

class CollectionDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    lookup_field = "id"
    queryset = Collection.objects.all()
    serializer_class = CollectionSerializer

#Collection Language
class CollectionLanguageListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "collectionId"]
    pagination_class = StandardSetPagination
    queryset = CollectionLanguage.objects.all().order_by("createdDate")
    serializer_class = CollectionLanguageSerializer

class CollectionLanguageDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "collectionId"]
    lookup_field = "id"
    queryset = CollectionLanguage.objects.all()
    serializer_class = CollectionLanguageSerializer

#Store Collection
class StoreCollectionListMobileView(generics.ListAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["collectionId", "storeId"]
    pagination_class = StandardSetPagination
    queryset = StoreCollection.objects.all().order_by("collectionId")
    serializer_class = StoreCollectionSerializer

class StoreCollectionListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["collectionId", "storeId"]
    pagination_class = StandardSetPagination
    queryset = StoreCollection.objects.all().order_by()
    serializer_class = StoreCollectionSerializer

class StoreCollectionDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["collectionId", "storeId"]
    lookup_field = "id"
    queryset = StoreCollection.objects.all()
    serializer_class = StoreCollectionSerializer

#Seller Shipping Cost
class SellerShippingCostListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = SellerShippingCost.objects.all().order_by("createdDate")
    serializer_class = SellerShippingCostSerializer

class SellerShippingCostDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    lookup_field = "id"
    queryset = SellerShippingCost.objects.all()
    serializer_class = SellerShippingCostSerializer

#Shipping Cost
class ShippingCostListDashboardView(
    generics.ListCreateAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        DashboardTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["skuPriceId","sellerShippingCostId"]
    lookup_field = "id"
    pagination_class = StandardSetPagination
    queryset = ShippingCost.objects.all().order_by("createdDate")
    serializer_class = ShippingCostSerializer


class ShippingCostDetailDashboardView(
    generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        DashboardTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["skuPriceId","sellerShippingCostId"]
    lookup_field = "id"
    queryset = ShippingCost.objects.all()
    serializer_class = ShippingCostSerializer


#Product
class ProductDetailMobileView(generics.RetrieveAPIView):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    lookup_field = "id"
    queryset = Product.objects.all().order_by("createdDate")
    serializer_class = ProductSerializer

class ProductListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = Product.objects.all().order_by("createdDate")
    serializer_class = ProductSerializer

class ProductDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    lookup_field = "id"
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

#Product Language
class ProductLanguageListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "productId"]
    pagination_class = StandardSetPagination
    queryset = ProductLanguage.objects.all().order_by("createdDate")
    serializer_class = ProductLanguageSerializer

class ProductLanguageDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "productId"]
    lookup_field = "id"
    queryset = ProductLanguage.objects.all()
    serializer_class = ProductLanguageSerializer

class ProductFilterView(APIView):
    authentication_classes = [APIKeyAuthentication, MobileTokenAuthentication]
    def get(self, request):
        currencyId = request.headers.get(currencyKey)
        languageId = request.headers.get(languageKey)
        if not currencyId:
            return Response(
                {"message": "Currency header is required"},
                status=status.HTTP_400_BAD_REQUEST,
            )
        currency = Currency.objects.filter(
            id=currencyId
        ).first()
        if not currency:
            return Response(
                {"message": "Invalid currency"},
                status=status.HTTP_400_BAD_REQUEST,
            )
        collections = Collection.objects.filter(collectionId__isnull = True)
        
        subCollections = Collection.objects.filter(collectionId__isnull= False)

        # price_range = SKUPrice.objects.filter(
        #     currencyId=currency
        # ).aggregate(
        #     min_price=Min("salePrice"),
        #     max_price=Max("salePrice"),
        # )
        return Response(
            [
                {
                    "collections": CollectionSerializer(
                        collections,
                        context = {
                            languageKey:languageId
                        },
                        many=True,
                    ).data,
                    "subCollections": CollectionSerializer(
                        subCollections,
                        context = {
                            languageKey:languageId
                        },
                        many=True,
                    ).data,
                    # "priceRange": {
                    #     "min": price_range["min_price"] or 0,
                    #     "max": price_range["max_price"] or 0,
                    # },
                }
            ]
        )

class ProductCollectionFilter(filters.FilterSet):
    productId = filters.NumberFilter(field_name="productId")
    collectionId = filters.NumberFilter(field_name="collectionId")
    mainCollectionId = filters.NumberFilter(field_name="collectionId__collectionId")
    storeId = filters.NumberFilter(field_name="collectionId__collectionId__collection_storecollection__storeId_id")

    class Meta:
        model = ProductCollection
        fields = [
            "productId",
            "collectionId",
            "mainCollectionId",
            "storeId",
        ]
#Product Collection
class ProductCollectionListMobileView(generics.ListAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend,searchfilter.SearchFilter]
    #filterset_fields = ["productId", "collectionId","collectionId__collectionId","collectionId__collectionId__collection_storecollection__storeId_id"]
    filterset_class = ProductCollectionFilter
    search_fields = ["productId__product_productlanguage__name"]
    pagination_class = StandardSetPagination
    queryset = ProductCollection.objects.filter(productId__isVisible=True).order_by(
        '-createdDate'
    )
    serializer_class = ProductCollectionSerializer

class ProductCollectionListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["productId", "collectionId"]
    pagination_class = StandardSetPagination
    queryset = ProductCollection.objects.all()
    serializer_class = ProductCollectionSerializer

class ProductCollectionDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["productId", "collectionId"]
    lookup_field = "id"
    queryset = ProductCollection.objects.all()
    serializer_class = ProductCollectionSerializer

#Product Option
class ProductOptionListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["productId"]
    pagination_class = StandardSetPagination
    queryset = ProductOption.objects.all().order_by("createdDate")
    serializer_class = ProductOptionSerializer

class ProductOptionDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["productId"]
    lookup_field = "id"
    queryset = ProductOption.objects.all()
    serializer_class = ProductOptionSerializer

#Product Option Language
class ProductOptionLanguageListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "productOptionId"]
    pagination_class = StandardSetPagination
    queryset = ProductOptionLanguage.objects.all().order_by("createdDate")
    serializer_class = ProductOptionLanguageSerializer

class ProductOptionLanguageDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "productOptionId"]
    lookup_field = "id"
    queryset = ProductOptionLanguage.objects.all()
    serializer_class = ProductOptionLanguageSerializer

#Product Option Value
class ProductOptionValueListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["productOptionId"]
    pagination_class = StandardSetPagination
    queryset = ProductOptionValue.objects.all().order_by("createdDate")
    serializer_class = ProductOptionValueSerializer

class ProductOptionValueDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["productOptionId"]
    lookup_field = "id"
    queryset = ProductOptionValue.objects.all()
    serializer_class = ProductOptionValueSerializer

#Product Option Value Language
class ProductOptionValueLanguageListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "productOptionValueId"]
    pagination_class = StandardSetPagination
    queryset = ProductOptionValueLanguage.objects.all().order_by("createdDate")
    serializer_class = ProductOptionValueLanguageSerializer

class ProductOptionValueLanguageDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "productOptionValueId"]
    lookup_field = "id"
    queryset = ProductOptionValueLanguage.objects.all()
    serializer_class = ProductOptionValueLanguageSerializer

#SKU 
class SKUListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["productId"]
    pagination_class = StandardSetPagination
    queryset = SKU.objects.all().order_by("createdDate")
    serializer_class = SKUSerializer

class SKUDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["productId"]
    lookup_field = "id"
    queryset = SKU.objects.all()
    serializer_class = SKUSerializer

#SKU Option 
class SKUOptionValueListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["optionId", "skuId"]
    pagination_class = StandardSetPagination
    queryset = SKUOptionValue.objects.all().order_by("createdDate")
    serializer_class = SKUOptionValueSerializer

class SKUOptionValueDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["optionId", "skuId"]
    lookup_field = "id"
    queryset = SKUOptionValue.objects.all()
    serializer_class = SKUOptionValueSerializer

#SKU Image
class SKUImageListDashboardView(
    generics.ListCreateAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        DashboardTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["skuId"]
    lookup_field = "id"
    pagination_class = StandardSetPagination
    queryset = SKUImage.objects.all().order_by("createdDate")
    serializer_class = SKUImageSerializer


class SKUImageDetailDashboardView(
    generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        DashboardTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["skuId"]
    lookup_field = "id"
    queryset = SKUImage.objects.all()
    serializer_class = SKUImageSerializer



#SKU Price 
class SKUPriceListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["currencyId", "skuId", "shippingCostId"]
    pagination_class = StandardSetPagination
    queryset = SKUPrice.objects.all().order_by("createdDate")
    serializer_class = SKUPriceSerializer

class SKUPriceDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["currencyId", "skuId", "shippingCostId"]
    lookup_field = "id"
    queryset = SKUPrice.objects.all()
    serializer_class = SKUPriceSerializer

#Summary 
class GetSummaryMobileView(APIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    def get(self, request):
        isCheckout = request.query_params.get("isCheckout",None)
        shoppingAccountId = request.query_params.get("shoppingAccountId",None)
        parentId = request.query_params.get("parentId",None)

        if isCheckout is not None:
            isCheckout = bool(isCheckout)

        if shoppingAccountId is not None:
            shoppingAccountId = int(shoppingAccountId)
        else:
            raise serializers.ValidationError({"error": "Shopping Account Id is required"})

        selectShoppingAccountList = ShoppingAccount.objects.filter(id = shoppingAccountId,)
        selected = None
        if selectShoppingAccountList.__len__() > 0:
            selected = selectShoppingAccountList[0]
        else:
            raise serializers.ValidationError({"error": "Shopping Account not found"})
        
        currency = None
        if selected is not None:
            currency = selected.storeId.currencyId
        else:
            raise serializers.ValidationError({"error": "Currency not found"})
        
        cartList = Cart.objects.filter(shoppingAccountId=selected.id)
        subTotal = 0.0
        count = 0
        salePriceTotal = 0.0
        originalPriceTotal = 0.0
        for cart in cartList:
            ser = CartSerializer(cart,context={"parentId": parentId, "shoppingAccountId": shoppingAccountId,"currencyId": currency.id,"isDetail": "1"}).data
            subTotal += (ser["sku"]["priceList"][0]["salePrice"] + ser["sku"]["priceList"][0]["shippingCost"]) * cart.quantity
            salePriceTotal += (ser["sku"]["priceList"][0]["salePrice"] + ser["sku"]["priceList"][0]["shippingCost"])  * cart.quantity
            originalPriceTotal += (ser["sku"]["priceList"][0]["originalPrice"] + ser["sku"]["priceList"][0]["shippingCost"]) * cart.quantity

            count += cart.quantity
        
        if isCheckout:
            delivery = 0.0
            discount = salePriceTotal - originalPriceTotal
            dataMap = [
                    {
                        "shoppingAccountId":shoppingAccountId,
                        "cartCount":count,
                        "subTotal":originalPriceTotal,
                        "delivery":delivery,
                        "discount":discount,
                        "grandTotal":subTotal + delivery,
                    }
                ]
        else:
            dataMap = [
                    {
                        "shoppingAccountId":shoppingAccountId,
                        "cartCount":count,
                        "subTotal":subTotal
                    }
                ]
        return Response(
                dataMap
            )
    
class CartValidation:
    def getError(self,errorMessage):
        return {
            "cartError": {
                "error": [errorMessage],
            }
        }
    
    def validateShoppingAccountId(self):
        shoppingAccountId = self.request.query_params.get("shoppingAccountId", None)
        if shoppingAccountId is None:
            raise serializers.ValidationError(self.getError("Shopping Account Id is required"))
        shoppingAccountId = int(shoppingAccountId)
        return shoppingAccountId
    
    def getCartCount(self,shoppingAccountId):
        count = Cart.objects.filter(shoppingAccountId = shoppingAccountId).aggregate(cart_count = Coalesce(Sum("quantity"), 0))
        return count["cart_count"]
    
    def validateCart(self,cartCount):
        if cartCount < 20:
            return True
        raise serializers.ValidationError(self.getError("Maximum amount in cart is 20"))

    def perform_create(self, serializer):
        shoppingAccountId = self.validateShoppingAccountId()
        cartCount = self.getCartCount(shoppingAccountId)
        self.validateCart(cartCount)
        
        return super().perform_create(serializer)
    
    def perform_update(self, serializer):
        isRemove = self.request.query_params.get("isRemove", None)
        if isRemove is not None:
            isRemove = bool(isRemove)
        shoppingAccountId = self.validateShoppingAccountId()
        cartCount = self.getCartCount(shoppingAccountId)
        if isRemove:
            skuId = serializer.validated_data['skuId']
            currentList = Cart.objects.filter(skuId = skuId.id,shoppingAccountId=shoppingAccountId)
            if currentList.__len__() > 0:
                if serializer.validated_data['quantity'] < currentList[0].quantity:
                    pass
                else:
                    raise serializers.ValidationError(self.getError("The new quantity must be less than the current quantity"))
            else:
                raise serializers.ValidationError(self.getError("No Records Found"))
        else:
            self.validateCart(cartCount)

        return super().perform_update(serializer)
        

class CartListMobileView(CartValidation,generics.ListCreateAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["skuId", "shoppingAccountId"]
    pagination_class = StandardSetPagination
    queryset = Cart.objects.all().order_by('-id')
    serializer_class = CartSerializer

class CartDetailMobileView(CartValidation,
   generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["skuId", "shoppingAccountId"]
    lookup_field = "id"
    queryset = Cart.objects.all()
    serializer_class = CartSerializer

class CartListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["skuId", "shoppingAccountId"]
    pagination_class = StandardSetPagination
    queryset = Cart.objects.all().order_by("createdDate")
    serializer_class = CartSerializer

class CartDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["skuId", "shoppingAccountId"]
    lookup_field = "id"
    queryset = Cart.objects.all()
    serializer_class = CartSerializer

#Order Status
class OrderStatusListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    pagination_class = StandardSetPagination
    queryset = OrderStatus.objects.all().order_by("createdDate")
    serializer_class = OrderStatusSerializer

class OrderStatusDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = []
    lookup_field = "id"
    queryset = OrderStatus.objects.all()
    serializer_class = OrderStatusSerializer

#Order Status Language
class OrderStatusLanguageListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "orderStatusId"]
    pagination_class = StandardSetPagination
    queryset = OrderStatusLanguage.objects.all().order_by("createdDate")
    serializer_class = OrderStatusLanguageSerializer

class OrderStatusLanguageDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["languageId", "orderStatusId"]
    lookup_field = "id"
    queryset = OrderStatusLanguage.objects.all()
    serializer_class = OrderStatusLanguageSerializer

class PlaceOrderMobileView(generics.GenericAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    serializer_class = PlaceOrderSerializer
    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

#Order 
class OrderListMobileView(generics.ListCreateAPIView):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["orderStatusId","paymentMethodId", "storeId", "shoppingAccountId"]
    pagination_class = StandardSetPagination
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

class OrderDetailMobileView(
   generics.RetrieveUpdateDestroyAPIView
):
    authentication_classes = [
        APIKeyAuthentication,
        MobileTokenAuthentication,
    ]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["paymentMethodId", "storeId", "shoppingAccountId"]
    lookup_field = "id"
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

class OrderListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["paymentMethodId", "storeId", "shoppingAccountId"]
    pagination_class = StandardSetPagination
    queryset = Order.objects.all().order_by("createdDate")
    serializer_class = OrderSerializer

class OrderDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["paymentMethodId", "storeId", "shoppingAccountId"]
    lookup_field = "id"
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

#Order Item 
class OrderItemListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["orderId", "skuId", "currencyId", "shippingCostId"]
    pagination_class = StandardSetPagination
    queryset = OrderItem.objects.all().order_by("createdDate")
    serializer_class = OrderItemSerializer

class OrderItemDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["orderId", "skuId", "currencyId", "shippingCostId"]
    lookup_field = "id"
    queryset = OrderItem.objects.all()
    serializer_class = OrderItemSerializer

#Shipping Address
class ShippingAddressListDashboardView(generics.ListCreateAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["orderId"]
    pagination_class = StandardSetPagination
    queryset = ShippingAddress.objects.all().order_by("createdDate")
    serializer_class = ShippingAddressSerializer

class ShippingAddressDetailDashboardView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [APIKeyAuthentication, DashboardTokenAuthentication]
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ["orderId"]
    lookup_field = "id"
    queryset = ShippingAddress.objects.all()
    serializer_class = ShippingAddressSerializer
