from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from auth_apis.models import *
import random
from datetime import datetime
from admin_panel.models import *
from django.conf import settings
from .serializer import *
from store_apis.models import *
from panel_apis.functions import *
import ast
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.db.models import Q
import stripe
from datetime import date
import json
from django.utils.timesince import timesince
from django.core import mail
from django.template.loader import render_to_string
from io import BytesIO
from xhtml2pdf import pisa
import pdfkit
# import weasyprint
from django.http import HttpResponse
from django.template.loader import get_template
from django.template import Context
from django.utils import timezone



def couponapply(coupon_id,customer_id):
	allData=[]
	response={}
	discountedAmount = 0
	tempAmount = 0
	total_ammount = 0
	couponObject=StoreCoupons.objects.filter(id=coupon_id).first()
	if not couponObject:
		response['status_code']=400
		response['status_message']='Invalid coupon code'
		return Response(response)
	cartObj = Cart.objects.filter(customer=customer_id,isPaid=False)
	for cart in cartObj:
		if couponObject.product:
			if cart.product.id == couponObject.product.id:
				print('second')
				if couponObject.coupon_type=='Percentage':
					percent=float(couponObject.coupon_discount)/100
					discountedAmount=float(cart.totalAmount)*float(percent)
					tempAmount=float(cart.totalAmount)-float(discountedAmount)
					allData.append({'amountBeforeCoupon':str(cart.totalAmount),
									'amountAfterCoupon':str(tempAmount),
									'discountType':couponObject.coupon_type,
									'discount':str(discountedAmount),
									'coupon_id':couponObject.id})
				else:
					tempAmount=float(cart.totalAmount)-float(couponObject.coupon_discount)
					discountedAmount=couponObject.coupon_discount
					allData.append({'amountBeforeCoupon':str(cart.totalAmount),
									'amountAfterCoupon':str(tempAmount),
									'discountType':couponObject.coupon_type,
									'discount':str(discountedAmount),
									'coupon_id':couponObject.id,})
		if couponObject.coupon_on:
			if cart.product.store.id == couponObject.store_id.id:
				if couponObject.coupon_type=='Percentage':

					percent=float(couponObject.coupon_discount)/100
					total_ammount += float(cart.totalAmount)
					discountedAmount = total_ammount*float(percent)
					tempAmount = total_ammount-float(discountedAmount)
					allData = [({'amountBeforeCoupon':str(total_ammount),
									'amountAfterCoupon':str(tempAmount),
									'discountType':couponObject.coupon_type,
									'discount':str(discountedAmount),
									'coupon_id':couponObject.id,})]
				else:
					total_ammount +=  float(cart.totalAmount)
					tempAmount = total_ammount-float(couponObject.coupon_discount)
					discountedAmount=couponObject.coupon_discount
					allData = [({'amountBeforeCoupon':str(total_ammount),
									'amountAfterCoupon':str(tempAmount),
									'discountType':couponObject.coupon_type,
									'discount':str(discountedAmount),
									'coupon_id':couponObject.id,})]
	response['data']=allData
	response['status_code']=200
	response['status_message']='Coupon data'
	return response




def servicecouponapply(coupon_id,invoice_id):
	allData=[]
	response={}
	couponObject=StoreCoupons.objects.filter(id=coupon_id).first()
	if not couponObject:
		return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid coupon id'},status=status.HTTP_400_BAD_REQUEST)
	invoiceObj = ServiceInvoice.objects.filter(service_request_id=invoice_id).first()
	if couponObject.product:
		if invoiceObj.service_request_id.serviceId.id == couponObject.service.id:
			if couponObject.coupon_type=='Percentage':
				percent=float(couponObject.coupon_discount)/100
				discountedAmount=float(invoiceObj.total_amount)*float(percent)
				tempAmount=float(invoiceObj.total_amount)-float(discountedAmount)
				allData.append({'amountBeforeCoupon':str(invoiceObj.total_amount),
								'amountAfterCoupon':str(tempAmount),
								'discountType':couponObject.coupon_type,
								'discount':str(discountedAmount),
								'coupon_id':couponObject.id,})
			else:
				tempAmount=float(invoiceObj.total_amount)-float(couponObject.coupon_discount)
				discountedAmount=couponObject.coupon_discount
				allData.append({'amountBeforeCoupon':str(invoiceObj.total_amount),
								'amountAfterCoupon':str(tempAmount),
								'discountType':couponObject.coupon_type,
								'discount':str(discountedAmount),
								'coupon_id':couponObject.id,})
	if couponObject.coupon_on == 'Service':
		if invoiceObj.store.id == couponObject.store_id.id:
			if couponObject.coupon_type=='Percentage':
				percent=float(couponObject.coupon_discount)/100
				discountedAmount=float(invoiceObj.total_amount)*float(percent)
				tempAmount=float(invoiceObj.total_amount)-float(discountedAmount)
				allData.append({'amountBeforeCoupon':str(invoiceObj.total_amount),
								'amountAfterCoupon':str(tempAmount),
								'discountType':couponObject.coupon_type,
								'discount':str(discountedAmount),
								'coupon_id':couponObject.id,})
			else:
				tempAmount=float(invoiceObj.total_amount)-float(couponObject.coupon_discount)
				discountedAmount=couponObject.coupon_discount
				allData.append({'amountBeforeCoupon':str(invoiceObj.total_amount),
								'amountAfterCoupon':str(tempAmount),
								'discountType':couponObject.coupon_type,
								'discount':str(discountedAmount),
								'coupon_id':couponObject.id,})
	response['data']=allData
	response['status_code']=200
	response['status_message']='Coupon data'
	return response

class getContentPages(APIView):
	def get(self,request):
		language = request.headers['language']
		type = request.query_params['type']
		if not type:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Please pass the type'},status=status.HTTP_400_BAD_REQUEST)
		data_obj =  ContentPages.objects.filter(page_type=type,status = True).first()
		if data_obj:
			if language == 'ar':
				data_obj =  ContentPages.objects.filter(page_type=type,status = True).first()
				if data_obj:
					allData = {
						'page_title':data_obj.arabic_page_title,
						'content':data_obj.arabic_content,
						'page_type':data_obj.page_type,
						'status':data_obj.status,
					}
			else:
				data_obj =  ContentPages.objects.filter(page_type=type,status = True).first()
				if data_obj:
					allData = {
						'page_title':data_obj.english_page_title,
						'content':data_obj.english_content,
						'page_type':data_obj.page_type,
						'status':data_obj.status,
					}
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		else:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No data found'},status=status.HTTP_400_BAD_REQUEST)

class HelpSupportUser(APIView):
	def post(self,request):
		session_token=request.META.get('HTTP_AUTHORIZATION')
		if not session_token:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session_token is required'},status=status.HTTP_400_BAD_REQUEST)
		try:
			user_obj=User.objects.get(token=session_token)
		except Exception as e:
			return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
		serializer = HelpAndSupportSerializer(data=request.data)
		if serializer.is_valid():
			title = request.data.get('title')
			description = request.data.get('description')
			HelpSupport.objects.create(title=title,description=description,user_id=user_obj.id)
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Help & Support Send Successfully','data':''})
		else:
			return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class getFaq(APIView):
	def get(self,request):
		language = request.headers['language']
		if language == 'ar':
			data_obj = Faq.objects.filter(status=1).order_by('-id')
			if data_obj:
				allData = []
				for data_faq in data_obj:
					all = {
						'title':data_faq.arabic_title,
						'content':data_faq.arabic_content,
					}
					allData.append(all)	
		else:
			data_obj = Faq.objects.filter(status=1).order_by('-id')
			if data_obj:
				allData = []
				for data_faq in data_obj:
					all = {
						'title':data_faq.english_title,
						'content':data_faq.english_content,
				
					}
					allData.append(all)	
	   
		return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched FAQ Successfully','data':allData})


class getContactDetails(APIView):
	def get(self,request):
		language = request.headers['language']
		data_obj =  Contactmanage.objects.all().first()
		if data_obj:
			if language == 'ar':
				allData = {
					'whatsapp_number':data_obj.whatsapp_number,
					'phone_number':data_obj.phone_number,
					'description': data_obj.contact_description_ar,
					'email':data_obj.email,
					'instagram_url':data_obj.instagram_url,
					'facebook_url':data_obj.facebook_url,
					'twitter_url':data_obj.twitter_url,
					'youtube_url':data_obj.youtube_url,
					'address':data_obj.address,
				}
			else:
				allData = {
					'whatsapp_number':data_obj.whatsapp_number,
					'phone_number':data_obj.phone_number,
					'description': data_obj.contact_description,
					'email':data_obj.email,
					'instagram_url':data_obj.instagram_url,
					'facebook_url':data_obj.facebook_url,
					'twitter_url':data_obj.twitter_url,
					'youtube_url':data_obj.youtube_url,
					'address':data_obj.address,
				}

			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		else:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No data found'},status=status.HTTP_400_BAD_REQUEST)

class getCategories(APIView):
	def get(self,request):
		language = request.headers['language']
		if language == 'ar':
			main_obj =  MainCategories.objects.filter(end_date__isnull=True,status=1).order_by('id')
			get_cat = GetCategoriesDataArabic(main_obj,many=True).data
		else:
			main_obj =  MainCategories.objects.filter(end_date__isnull=True,status=1).order_by('id')
			get_cat = GetCategoriesDataEnglish(main_obj,many=True).data
		return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':get_cat})


class getStones(APIView):
	def get(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if session_token:
			user_obj = User.objects.get(token=session_token)
		else:
			user_obj = 0
		language = request.headers['language']
		stones_obj = Stones.objects.filter(end_date__isnull=True,status=1)
		if language == 'ar':
			all_data= []
			for i in stones_obj:
				data = {
				'id':i.id,
				'stone_name':i.stone_name_arabic,
				'stone_icon':i.stone_icon,
				'stone_description':i.stone_content_arabic,
				'status':i.status}
				all_data.append(data)
		else:
			all_data= []
			for i in stones_obj:
				data = {
				'id':i.id,
				'stone_name':i.stone_name_english,
				'stone_icon':i.stone_icon,
				'stone_description':i.stone_content_english,
				'status':i.status}
				all_data.append(data)
		product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True,today_deal_start_date = date.today())
		todayData = [] 
		if language == 'ar':
			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				alldata = {
					'is_favourite':favourite,
					'product_id':product.id,
					'product_name' : product.product_name_arabic,
					'maincategory':product.maincategory.category_name_arabic,
					'subcategory':product.subcategory.category_name_arabic,
					'description':product.description_arabic,
					'brand':product.brand.brand_name_arabic,
					'price':product.price,
					'ratings':product.rating,
					'price_discount':product.price_discount,
					'images':ast.literal_eval(product.images),
					'store_id':product.store_id,
					'store_name':product.store.store_name_arabic,
					'offer_discount': product.offer_discount,
				}
				todayData.append(alldata)
		else:
			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				alldata = {
					'is_favourite':favourite,
					'product_id':product.id,
					'product_name' : product.product_name_english,
					'maincategory':product.maincategory.category_name_english,
					'subcategory':product.subcategory.category_name_english,
					'description':product.description_english,
					'brand':product.brand.brand_name_english,
					'price':product.price,
					'ratings':product.rating,
					'price_discount':product.price_discount,
					'images':ast.literal_eval(product.images),
					'store_id':product.store_id,
					'is_vip':product.store.is_vip,
					'store_name':product.store.store_name_english,
					'offer_discount': product.offer_discount,
				}
				todayData.append(alldata)

		store_obj = Stores.objects.filter(end_date__isnull=True,is_profile_completed=True,status=True,is_vip="false").order_by('-ratings')[:5]
		if language == 'ar':
			best_seller = []
			for i in store_obj:
				data = {
					'store_id':i.id,
					'store_name':i.store_name_arabic,
					'store_icon':i.store_logo,
					'store_description':i.store_description_arabic,
					'store_ratings': i.ratings,
					'is_vip':i.is_vip,
				}
				best_seller.append(data)
		else:
			best_seller = []
			for i in store_obj:
				data = {
					'store_id':i.id,
					'store_name':i.store_name_english,
					'store_icon':i.store_logo,
					'store_description':i.store_description_english,
					'store_ratings': i.ratings,
					'is_vip':i.is_vip,
				}
				best_seller.append(data)
		
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data,'todayData':todayData,'best_seller':best_seller})

class getBrands(APIView):
	def get(self,request):
		language = request.headers['language']
		brands_obj = Brands.objects.filter(end_date__isnull=True,status=1)
		if language == 'ar':
			all_data =[]
			for i in brands_obj:
				data = {
					'brand_name' : i.brand_name_arabic,
					'brand_icon' : i.brand_icon,
					'brand_description' : i.brand_content_arabic,
					'status': i.status,
				}
				all_data.append(data)
		else:
			all_data =[]
			for i in brands_obj:
				data = {
					'brand_name' : i.brand_name_english,
					'brand_icon' : i.brand_icon,
					'brand_description' : i.brand_content_english,
					'status': i.status,
				}
				all_data.append(data)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})

class getServices(APIView):
	def get(self,request):
		language = request.headers['language']
		if language == 'ar':
			service_obj = Services.objects.filter(end_date__isnull=True,status=1)
			all_data = []
			for i in service_obj:
				data = {
					'service_id':i.id,
					'service_name':i.arabic_service_name,
					'service_icon':i.service_icon,
					'service_content':i.arabic_service_content,
					'status':i.status,
				}
				all_data.append(data)
		else:
			service_obj = Services.objects.filter(end_date__isnull=True,status=1)
			all_data = []
			for i in service_obj:
				data = {
					'service_id':i.id,
					'service_name':i.english_service_name,
					'service_icon':i.service_icon,
					'service_content':i.english_service_content,
					'status':i.status,
				}
				all_data.append(data)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})



class storeRequests(APIView):
	def post(self,request):
		try:
			serializer = StoreRequestSerializer(data=request.data)
			if serializer.is_valid():
				check_email = User.objects.filter(email=request.data.get('email'),is_superuser=0).first()
				if check_email:
					return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'This email already exist in our database.'},status=status.HTTP_400_BAD_REQUEST)
				check_reserve = StoreRequests.objects.filter(email=request.data.get('email'),status = 0).first()
				if check_reserve:
					return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Your request from this email has been already send.'},status=status.HTTP_400_BAD_REQUEST)

				req_obj = StoreRequests.objects.create(
					first_name = request.data.get('first_name'),
					last_name  = request.data.get('last_name'),
					address  = request.data.get('address'),
					email = request.data.get('email'),
					isd_code = request.data.get('isd_code'),
					mobile_number = request.data.get('mobile_number'),
					id_number = request.data.get('id_number'),
					bank_name = request.data.get('bank_name'),
					bank_account_number = request.data.get('bank_account_number'),
				)

				
				id_picture = request.data.get('id_picture')
				if not id_picture:
					return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Id picture is required'},status=status.HTTP_400_BAD_REQUEST)
				if request.data.get('id_picture'):
						fileUrl=uploadTheIdpicture(request.data.get('id_picture'))
						fileUrl=str(settings.BASE_URL)+'/'+fileUrl
						req_obj.id_picture=str(fileUrl)
						req_obj.save()
				
				html_message = render_to_string('store_request_email.html', {'first_name': request.data.get('first_name'),'last_name':request.data.get('last_name'),'address':request.data.get('address'),'email':request.data.get('email'),'isd_code':request.data.get('isd_code'),'mobile_number':request.data.get('mobile_number'),'id_number':request.data.get('id_number'),'bank_name':request.data.get('id_number'),'bank_account_number':request.data.get('bank_account_number')})
				subject = 'Store Request'
				plain_message = html_message
				from_email = settings.EMAIL_HOST_USER
				to = 'admin123@yopmail.com'
				mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
				AdminNotifications.objects.create(message='A new store salon request has been received')

				
				return Response ({'status_code':status.HTTP_200_OK,'status_message':'Store request send successfully'})
			
			else:
				default_errors = serializer.errors
				new_error = {}
				for field_name, field_errors in default_errors.items():
					new_error = field_errors
					break
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})
		except Exception as e:
			print(e)
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class getAllStores(APIView):
	def get(self,request):
		language = request.headers['language']
		store_obj = Stores.objects.filter(end_date__isnull=True,is_profile_completed=True,status=True,is_vip="false")
		if language == 'ar':
			all_data = []
			for i in store_obj:
				data = {
					'store_id':i.id,
					'store_name':i.store_name_arabic,
					'store_icon':i.store_logo,
					'store_description':i.store_description_arabic,
					'store_ratings': i.ratings,
					'is_vip':i.is_vip,
				}
				all_data.append(data)
		else:
			all_data = []
			for i in store_obj:
				data = {
					'store_id':i.id,
					'store_name':i.store_name_english,
					'store_icon':i.store_logo,
					'store_description':i.store_description_english,
					'store_ratings': i.ratings,
					'is_vip':i.is_vip,
				}
				all_data.append(data)
		
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})



class searchGetCategories(APIView):
	def get(self,request):
		language = request.headers['language']
		if language == 'ar':
			store_obj = Stores.objects.filter(end_date__isnull=True,is_profile_completed=True)
			all_data = []
			for i in store_obj:
				data = {
					'store_id':i.id,
					'store_name':i.store_name_arabic,
					'store_icon':i.store_logo,
					'store_description':i.store_description_arabic,
					'store_ratings': i.ratings,
					'is_vip':i.is_vip
				}
				all_data.append(data)
			brands_obj = Brands.objects.filter(end_date__isnull=True)
			all_data_brands =[]
			for i in brands_obj:
				data = {
					'brand_id':i.id,
					'brand_name' : i.brand_name_arabic,
					'brand_icon' : i.brand_icon,
				}
				all_data_brands.append(data)
			main_obj =  MainCategories.objects.filter(end_date__isnull=True).order_by('id')
			all_data_main =[]
			for i in main_obj:
				data = {
					'category_id':i.id,
					'category_name' : i.category_name_arabic,
					'category_icon' : i.category_icon,
				}
				all_data_main.append(data)
		else:
			store_obj = Stores.objects.filter(end_date__isnull=True,is_profile_completed=True)
			all_data = []
			for i in store_obj:
				data = {
					'store_id':i.id,
					'store_name':i.store_name_english,
					'store_icon':i.store_logo,
					'store_description':i.store_description_english,
					'store_ratings': i.ratings,
					'is_vip':i.is_vip
				}
				all_data.append(data)
			brands_obj = Brands.objects.filter(end_date__isnull=True)
			all_data_brands =[]
			for i in brands_obj:
				data = {
					'brand_id':i.id,
					'brand_name' : i.brand_name_english,
					'brand_icon' : i.brand_icon,
				}
				all_data_brands.append(data)
			main_obj =  MainCategories.objects.filter(end_date__isnull=True).order_by('id')
			all_data_main =[]
			for i in main_obj:
				data = {
					'category_id':i.id,
					'category_name' : i.category_name_english,
					'category_icon' : i.category_icon,
				}
				all_data_main.append(data)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','stores':all_data,'brands':all_data_brands,'main_categories':all_data_main})

class getStoreDetails(APIView):
	def post(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if session_token:
			user_obj = User.objects.get(token=session_token)
		else:
			user_obj = 0
		language = request.headers['language']
		store_id = request.data.get('store_id')
		page = request.data.get('page')
		if not page:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
		page_per_data = request.data.get('page_per_data')
		if not page_per_data:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
		if not store_id:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store id is required'},status=status.HTTP_400_BAD_REQUEST)
		store_obj =  Stores.objects.filter(id=store_id).first()
		if not store_obj:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No store found'},status=status.HTTP_400_BAD_REQUEST)
		service_obj = storeServices.objects.filter(store = store_id,status=True)
		product_obj = Products.objects.filter(store_id=store_id,status=True)
		total_count = Products.objects.filter(store_id=store_id,status=True).count()
		paginator = Paginator(product_obj, page_per_data)
		try:
			product_obj = paginator.page(page)
		except PageNotAnInteger:
			product_obj = paginator.page(1)
		except EmptyPage:
			product_obj = paginator.page(paginator.num_pages)

		allData = []
		serviceData = []
		if language == 'ar':
			store_data = {
				'store_id':store_obj.id,
				'store_name':store_obj.store_name_arabic,
				'store_description':store_obj.store_description_arabic,
				'store_icon':store_obj.store_logo,
				'store_banner':store_obj.store_banner,
				'store_ratings': store_obj.ratings,
				'is_vip':store_obj.is_vip,
				'store_number':store_obj.store_number
			}
			for service in service_obj:
				servicedata = {
					'service_id' :service.serviceId.id,
					'service_name' : service.serviceId.arabic_service_name,
					'service_icon' : service.serviceId.service_icon,
					'service_content': service.serviceId.arabic_service_content
				}

				serviceData.append(servicedata)

			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				productdata = {
				'is_favourite':favourite,
				'product_id':product.id,
				'product_name' : product.product_name_arabic,
				'maincategory':product.maincategory.category_name_arabic,
				'subcategory':product.subcategory.category_name_arabic,
				'description':product.description_arabic,
				'brand':product.brand.brand_name_arabic,
				'ratings': product.rating,
				# 'model_name':product.model_name,
				# 'size':product.size,
				# 'weight':product.weight,
				# 'color':product.color,
				'price':product.price,
				'price_discount':product.price_discount,
				'images':ast.literal_eval(product.images),
				'store_id':product.store_id,
				'offer_discount': product.offer_discount,
				'is_vip':product.store.is_vip,
				}
				allData.append(productdata)

		else:
			store_data = {
				'store_id':store_obj.id,
				'store_name':store_obj.store_name_english,
				'store_description':store_obj.store_description_english,
				'store_icon':store_obj.store_logo,
				'store_banner':store_obj.store_banner,
				'store_ratings': store_obj.ratings,
				'is_vip':store_obj.is_vip,
				'store_number':store_obj.store_number

			}

			for service in service_obj:
				servicedata = {
					'service_id' :service.serviceId.id,
					'service_name' : service.serviceId.english_service_name,
					'service_icon' : service.serviceId.service_icon,
					'service_content': service.serviceId.english_service_content
				}
				serviceData.append(servicedata)

			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				productdata = {
						'is_favourite':favourite,
						'product_id':product.id,
						'product_name' : product.product_name_english,
						'maincategory':product.maincategory.category_name_english,
						'subcategory':product.subcategory.category_name_english,
						'description':product.description_english,
						'brand':product.brand.brand_name_english,
						'ratings': product.rating,
						'price':product.price,
						'price_discount':product.price_discount,
						'images':ast.literal_eval(product.images),
						'store_id':product.store_id,
						'offer_discount': product.offer_discount,
						'is_vip':product.store.is_vip,
					}
				allData.append(productdata)


		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','product_data':allData,'store_data':store_data,'serviceData':serviceData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(product_obj),'total':total_count})

class getCategoryProducts(APIView):
	def post(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if session_token:
			user_obj = User.objects.get(token=session_token)
		else:
			user_obj = 0
		language = request.headers['language']
		maincategory_id = request.data.get('maincategory_id')
		if not maincategory_id:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Maincategory id is required'},status=status.HTTP_400_BAD_REQUEST)
		subcategory_id = request.data.get('subcategory_id')
		page = request.data.get('page')
		if not page:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
		page_per_data = request.data.get('page_per_data')
		if not page_per_data:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
		if maincategory_id and subcategory_id:
			product_obj = Products.objects.filter(maincategory_id=maincategory_id,subcategory_id=subcategory_id,end_date__isnull = True,status=True)
		else:
			product_obj = Products.objects.filter(maincategory_id=maincategory_id,end_date__isnull = True,status=True)
		paginator = Paginator(product_obj, page_per_data)
		try:
			product_obj = paginator.page(page)
		except PageNotAnInteger:
			product_obj = paginator.page(1)
		except EmptyPage:
			product_obj = paginator.page(paginator.num_pages)
		allData = []
		if language == 'ar':
			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				alldata = {
					'is_favourite':favourite,
					'product_id':product.id,
					'product_name' : product.product_name_arabic,
					'maincategory':product.maincategory.category_name_arabic,
					'subcategory':product.subcategory.category_name_arabic,
					'description':product.description_arabic,
					'brand':product.brand.brand_name_arabic,
					'ratings': product.rating,
					# 'model_name':product.model_name,
					# 'size':product.size,
					# 'weight':product.weight,
					# 'color':product.color,
					'price':product.price,
					'price_discount':product.price_discount,
					'images':ast.literal_eval(product.images),
					'store_id':product.store_id,
					'is_vip':product.store.is_vip,
					'store_name':product.store.store_name_arabic,
					'offer_discount': product.offer_discount,

				}
				allData.append(alldata)
		else:
			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				alldata = {
					'is_favourite':favourite,
					'product_id':product.id,
					'product_name' : product.product_name_english,
					'maincategory':product.maincategory.category_name_english,
					'subcategory':product.subcategory.category_name_english,
					'description':product.description_english,
					'brand':product.brand.brand_name_english,
					'ratings': product.rating,
					# 'model_name':product.model_name,
					# 'size':product.size,
					# 'weight':product.weight,
					# 'color':product.color,
					'price':product.price,
					'price_discount':product.price_discount,
					'images':ast.literal_eval(product.images),
					'store_id':product.store_id,
					'is_vip':product.store.is_vip,
					'store_name':product.store.store_name_english,
					'offer_discount': product.offer_discount,

				}
				allData.append(alldata)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(product_obj)})

class getStoneProducts(APIView):
	def post(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if session_token:
			user_obj = User.objects.get(token=session_token)
		else:
			user_obj = 0
		language = request.headers['language']
		stone_id = request.data.get('stone_id')
		if not stone_id:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Stone id is required'},status=status.HTTP_400_BAD_REQUEST)
		subcategory_id = request.data.get('subcategory_id')
		page = request.data.get('page')
		if not page:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
		page_per_data = request.data.get('page_per_data')
		if not page_per_data:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
		product_obj = Products.objects.filter(stone_id=stone_id,end_date__isnull = True,status=True)
		paginator = Paginator(product_obj, page_per_data)
		try:
			product_obj = paginator.page(page)
		except PageNotAnInteger:
			product_obj = paginator.page(1)
		except EmptyPage:
			product_obj = paginator.page(paginator.num_pages)
		allData = []
		if language == 'ar':
			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				alldata = {
					'is_favourite':favourite,
					'product_id':product.id,
					'product_name' : product.product_name_arabic,
					'maincategory':product.maincategory.category_name_arabic,
					'subcategory':product.subcategory.category_name_arabic,
					'description':product.description_arabic,
					'brand':product.brand.brand_name_arabic,
					'ratings': product.rating,
					# 'model_name':product.model_name,
					# 'size':product.size,
					# 'weight':product.weight,
					# 'color':product.color,
					'price':product.price,
					'price_discount':product.price_discount,
					'images':ast.literal_eval(product.images),
					'store_id':product.store_id,
					'is_vip':product.store.is_vip,
					'store_name':product.store.store_name_arabic,
					'offer_discount': product.offer_discount,

				}
				allData.append(alldata)
		else:
			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				alldata = {
					'is_favourite':favourite,
					'product_id':product.id,
					'product_name' : product.product_name_english,
					'maincategory':product.maincategory.category_name_english,
					'subcategory':product.subcategory.category_name_english,
					'description':product.description_english,
					'brand':product.brand.brand_name_english,
					'ratings': product.rating,
					# 'model_name':product.model_name,
					# 'size':product.size,
					# 'weight':product.weight,
					# 'color':product.color,
					'price':product.price,
					'price_discount':product.price_discount,
					'images':ast.literal_eval(product.images),
					'store_id':product.store_id,
					'is_vip':product.store.is_vip,
					'store_name':product.store.store_name_english,
					'offer_discount': product.offer_discount,

				}
				allData.append(alldata)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(product_obj)})



class getProductDetails(APIView):
	def post(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if session_token:
			user_obj = User.objects.get(token=session_token)
		else:
			user_obj = 0
		language = request.headers['language']
		product_id = request.data.get('product_id')
		if not product_id:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product id is required'},status=status.HTTP_400_BAD_REQUEST)
		
		product_obj = Products.objects.filter(id=product_id,status=True).first()
		if not product_obj:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product not found'},status=status.HTTP_400_BAD_REQUEST)
		favourite_obj = Favourites.objects.filter(product_id=product_obj.id,user=user_obj).first()
		if favourite_obj:
			favourite = True
		else:
			favourite = False
		if language == 'ar':
				alldata = {
					'is_favourite':favourite,
					'product_id':product_obj.id,
					'product_name' : product_obj.product_name_arabic,
					'maincategory':product_obj.maincategory.category_name_arabic,
					'subcategory':product_obj.subcategory.category_name_arabic,
					'description':product_obj.description_arabic,
					'brand':product_obj.brand.brand_name_arabic,
					'model_name':product_obj.model_name,
					'ratings': product_obj.rating,
					'size':product_obj.size,
					'weight':product_obj.weight,
					'color':product_obj.color,
					'price':product_obj.price,
					'price_discount':product_obj.price_discount,
					'images':ast.literal_eval(product_obj.images),
					'store_id':product_obj.store_id,
					'is_vip':product_obj.store.is_vip,
					'store_name':product_obj.store.store_name_arabic,
					'offer_discount': product_obj.offer_discount,
					'quantity':product_obj.quantity,

				}
		else:
				alldata = {
					'is_favourite':favourite,
					'product_id':product_obj.id,
					'product_name' : product_obj.product_name_english,
					'maincategory':product_obj.maincategory.category_name_english,
					'subcategory':product_obj.subcategory.category_name_english,
					'description':product_obj.description_english,
					'brand':product_obj.brand.brand_name_english,
					'model_name':product_obj.model_name,
					'size':product_obj.size,
					'ratings': product_obj.rating,
					'weight':product_obj.weight,
					'color':product_obj.color,
					'price':product_obj.price,
					'price_discount':product_obj.price_discount,
					'images':ast.literal_eval(product_obj.images),
					'store_id':product_obj.store_id,
					'is_vip':product_obj.store.is_vip,
					'store_name':product_obj.store.store_name_english,
					'offer_discount': product_obj.offer_discount,
					'quantity':product_obj.quantity,

				}
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata})

class searchProduct(APIView):
	def post(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if session_token:
			user_obj = User.objects.get(token=session_token)
		else:
			user_obj = 0
		language = request.headers['language']
		search = request.data.get('search')
		if not search:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Search field is required'},status=status.HTTP_400_BAD_REQUEST)
		
		page = request.data.get('page')
		if not page:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
		page_per_data = request.data.get('page_per_data')
		if not page_per_data:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
		sort_data =  request.data.get('sort_data')
		if search:
			allData = []
			if language == 'ar':
					for s in search.split():
						if sort_data == 'highest_price' and search :
							product_obj = Products.objects.filter(Q(product_name_arabic__icontains=s)|Q(maincategory__category_name_arabic__icontains=s)|Q(brand__brand_name_arabic__icontains=s)|Q(store__store_name_arabic__icontains=s),status=True).order_by('-price')    
						elif sort_data == 'lowest_price' and search :
							product_obj = Products.objects.filter(Q(product_name_arabic__icontains=s)|Q(maincategory__category_name_arabic__icontains=s)|Q(brand__brand_name_arabic__icontains=s)|Q(store__store_name_arabic__icontains=s),status=True).order_by('price')    
						else:
							product_obj = Products.objects.filter(Q(product_name_arabic__icontains=s)|Q(maincategory__category_name_arabic__icontains=s)|Q(brand__brand_name_arabic__icontains=s)|Q(store__store_name_arabic__icontains=s),status=True)    
						paginator = Paginator(product_obj, page_per_data)
						try:
							product_obj = paginator.page(page)
						except PageNotAnInteger:
							product_obj = paginator.page(1)
						except EmptyPage:
							product_obj = paginator.page(paginator.num_pages)
					for product in product_obj:
						favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
						if favourite_obj:
							favourite = True
						else:
							favourite = False
						alldata = {
							'is_favourite':favourite,
							'product_id':product.id,
							'product_name' : product.product_name_arabic,
							'maincategory':product.maincategory.category_name_arabic,
							'subcategory':product.subcategory.category_name_arabic,
							'description':product.description_arabic,
							'brand':product.brand.brand_name_arabic,
							'ratings': product.rating,
							# 'model_name':product.model_name,
							# 'size':product.size,
							# 'weight':product.weight,
							# 'color':product.color,
							'price':product.price,
							'price_discount':product.price_discount,
							'images':ast.literal_eval(product.images),
							'store_id':product.store_id,
							'is_vip':product.store.is_vip,
							'store_name':product.store.store_name_arabic,
							'offer_discount': product.offer_discount,

						}
						allData.append(alldata)
			else:
					for s in search.split():
						if sort_data == 'highest_price' and search :
							product_obj = Products.objects.filter(Q(product_name_english__icontains=s)|Q(maincategory__category_name_english__icontains=s)|Q(brand__brand_name_english__icontains=s)|Q(store__store_name_english__icontains=s),status=True).order_by('-price')
						elif sort_data == 'lowest_price' and search :
							product_obj = Products.objects.filter(Q(product_name_english__icontains=s)|Q(maincategory__category_name_english__icontains=s)|Q(brand__brand_name_english__icontains=s)|Q(store__store_name_english__icontains=s),status=True).order_by('price')
						else:
							product_obj = Products.objects.filter(Q(product_name_english__icontains=s)|Q(maincategory__category_name_english__icontains=s)|Q(brand__brand_name_english__icontains=s)|Q(store__store_name_english__icontains=s),status=True)						
						paginator = Paginator(product_obj, page_per_data)
						try:
							product_obj = paginator.page(page)
						except PageNotAnInteger:
							product_obj = paginator.page(1)
						except EmptyPage:
							product_obj = paginator.page(paginator.num_pages)
					for product in product_obj:
						favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
						if favourite_obj:
							favourite = True
						else:
							favourite = False
						alldata = {
							'is_favourite':favourite,
							'product_id':product.id,
							'product_name' : product.product_name_english,
							'maincategory':product.maincategory.category_name_english,
							'subcategory':product.subcategory.category_name_english,
							'description':product.description_english,
							'brand':product.brand.brand_name_english,
							'ratings': product.rating,
							# 'model_name':product.model_name,
							# 'size':product.size,
							# 'weight':product.weight,
							# 'color':product.color,
							'price':product.price,
							'price_discount':product.price_discount,
							'images':ast.literal_eval(product.images),
							'store_id':product.store_id,
							'is_vip':product.store.is_vip,
							'store_name':product.store.store_name_english,
							'offer_discount': product.offer_discount,
						}
						allData.append(alldata)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(product_obj)})

class addRemoveFavourite(APIView):
	def post(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if not session_token:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
		try:
			user_obj =  User.objects.get(token=session_token)
		except Exception as e:
			return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
		product_id = request.data.get('product_id')
		if not product_id:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product Id is required'},status=status.HTTP_400_BAD_REQUEST)
		product_obj = Products.objects.filter(id=product_id,status=True).first()
		if not product_obj:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No product found'},status=status.HTTP_400_BAD_REQUEST)
		favourite_post, created = Favourites.objects.get_or_create(product=product_obj,user=user_obj,is_favourite=1)
		if not created:
			favourite_post.delete()
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Removed from favourite list'})
		else: 
			favourite_post.save()
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Added to favourite list.'})

class storeFavouriteListing(APIView):
	def get(self,request):
		language = request.headers['language']
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if not session_token:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
		try:
			user_obj =  User.objects.get(token=session_token)
		except Exception as e:
			return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
		product_obj = Favourites.objects.filter(user_id=user_obj.id)
		allData = []
		if language == 'ar':
			for product_data in product_obj:
				alldata = {
					'is_favourite':True,
					'product_id':product_data.product.id,
					'product_name' : product_data.product.product_name_arabic,
					'description':product_data.product.description_arabic,
					'price':product_data.product.price,
					'ratings': product_data.product.rating,
					'price_discount':product_data.product.price_discount,
					'images':ast.literal_eval(product_data.product.images),
					'store_id':product_data.product.store_id,
					'is_vip':product_data.product.store.is_vip,
					'store_name':product_data.product.store.store_name_arabic,
					'offer_discount': product_data.product.offer_discount,
				}
				allData.append(alldata)
		else:
			for product_data in product_obj:
				alldata = {
					'product_id':product_data.product.id,
					'product_name' : product_data.product.product_name_english,
					'description':product_data.product.description_english,
					'price':product_data.product.price,
					'ratings': product_data.product.rating,
					'price_discount':product_data.product.price_discount,
					'images':ast.literal_eval(product_data.product.images),
					'store_id':product_data.product.store_id,
					'is_vip':product_data.product.store.is_vip,
					'store_name':product_data.product.store.store_name_english,
					'offer_discount': product_data.product.offer_discount,
				}
				allData.append(alldata)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData})

class addToCart(APIView):
	def post(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			serializer = AddToCartSerializer(data=request.data)
			if serializer.is_valid():
				productObj = Products.objects.filter(id=request.data.get('product_id'),status=True).first()
				if not productObj:
					return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':' Invalid product id'},status=status.HTTP_400_BAD_REQUEST)
				allData = {}
				totalcount = request.data.get('quantity')
				if productObj.price_discount:
					selling_price = productObj.price_discount
				else:
					selling_price = productObj.price
				totalamount = float(selling_price) * float(totalcount)
				cartItem = Cart.objects.filter(customer_id=user_obj.id,product=productObj,isPaid=False).first()
				print('cartItem',cartItem)
				if not cartItem :
					print('if cart')
					cartItem = Cart.objects.create(product=productObj,customer_id=user_obj.id)	
				cartItem.productCount = totalcount
				cartItem.totalAmount = totalamount
				cartItem.save()	
				totalItem = Cart.objects.filter(customer_id=user_obj.id).count()
				totalCartItem = totalItem
				# allData.update({'subtotalAmount':finalSubTotal})
				cart_obj = Cart.objects.filter(customer_id=user_obj.id,isPaid=False)
				print('cart_obj',cart_obj)
				allData = []
				if language == 'ar':
					for cart in cart_obj:
						if cart.product.price_discount:
							product_amount = cart.product.price_discount
						else:
							product_amount = cart.product.price
						alldata = {
							'product_id':cart.product.id,
							'product_description':cart.product.description_arabic,
							'product_name':cart.product.product_name_arabic,
							'product_image':ast.literal_eval(cart.product.images),
							'product_count':cart.productCount,
							'product_amount':product_amount
						}
						allData.append(alldata)
				else:
					for cart in cart_obj:
						if cart.product.price_discount:
							product_amount = cart.product.price_discount
							print('if product_amount',product_amount)
						else:
							product_amount = cart.product.price
							print('else product_amount',product_amount)

						alldata = {
							'product_id':cart.product.id,
							'product_name':cart.product.product_name_english,
							'product_description':cart.product.description_english,
							'product_image':ast.literal_eval(cart.product.images),
							'product_count':cart.productCount,
							'product_amount':product_amount,
						}
						allData.append(alldata)
				TotalAmount = [float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
				Subtotal = [float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
				finalSubtotal = sum(Subtotal)
				finalTotal = sum(TotalAmount)
				taxAmount = 0
				return Response ({'status_code':status.HTTP_200_OK,'status_message':'Cart Updated','data':allData,'the_subtotal':finalSubtotal,'total_amount':finalTotal,'tax_amount':taxAmount})
			else:
				default_errors = serializer.errors
				new_error = {}
				for field_name, field_errors in default_errors.items():
					new_error = field_errors
					break
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':new_error})

		except Exception as e:
			print(e)
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
		
class getCart(APIView):
	def get(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			cart_obj = Cart.objects.filter(customer_id=user_obj.id,isPaid=False)
			vat_value = CommissionSection.objects.all().first()
			allData = []
			if language == 'ar':
				for cart in cart_obj:
					if cart.product.price_discount:
						product_amount = cart.product.price_discount
					else:
						product_amount = cart.product.price
					alldata = {
						'product_id':cart.product.id,
						'product_description':cart.product.description_arabic,
						'product_name':cart.product.product_name_arabic,
						'product_image':ast.literal_eval(cart.product.images),
						'product_count':cart.productCount,
						'product_amount':product_amount,
					}
					allData.append(alldata)
			else:
				for cart in cart_obj:
					if cart.product.price_discount:
						product_amount = cart.product.price_discount
					else:
						product_amount = cart.product.price

					alldata = {
						'product_id':cart.product.id,
						'product_name':cart.product.product_name_english,
						'product_description':cart.product.description_english,
						'product_image':ast.literal_eval(cart.product.images),
						'product_count':cart.productCount,
						'product_amount':product_amount,
						
					}
					allData.append(alldata)
			vat_value = vat_value.vat_percentage
			TotalAmount = [float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
			Subtotal = [float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
			finalSubtotal = sum(Subtotal)
			finalTotal = sum(TotalAmount)
			last_total = finalTotal
			taxAmount = 0
				
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData,'the_subtotal':finalSubtotal,'total_amount':last_total,'tax_amount':taxAmount,'vat_value':vat_value})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class removeCart(APIView):
	def post(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			product_id = request.data.get('product_id')
			if not product_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product Id is required'},status=status.HTTP_400_BAD_REQUEST)
			cart_obj = Cart.objects.filter(customer_id=user_obj.id,isPaid=False,product_id=product_id)
			print('cart_obj',cart_obj)
			if not cart_obj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product not found in your cart'},status=status.HTTP_400_BAD_REQUEST)
			cart_obj.delete()
			cart_obj = Cart.objects.filter(customer_id=user_obj.id,isPaid=False)
			allData = []
			if language == 'ar':
				for cart in cart_obj:
					if cart.product.price_discount:
						product_amount = cart.product.price_discount
					else:
						product_amount = cart.product.price
					alldata = {
						'product_id':cart.product.id,
						'product_description':cart.product.description_arabic,
						'product_name':cart.product.product_name_arabic,
						'product_image':ast.literal_eval(cart.product.images),
						'product_count':cart.productCount,
						'product_amount':product_amount
					}
					allData.append(alldata)
			else:
				for cart in cart_obj:
					if cart.product.price_discount:
						product_amount = cart.product.price_discount
					else:
						product_amount = cart.product.price

					alldata = {
						'product_id':cart.product.id,
						'product_name':cart.product.product_name_english,
						'product_description':cart.product.description_english,
						'product_image':ast.literal_eval(cart.product.images),
						'product_count':cart.productCount,
						'product_amount':product_amount,
					}
					allData.append(alldata)
			TotalAmount = [float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
			Subtotal = [float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
			finalSubtotal = sum(Subtotal)
			finalTotal = sum(TotalAmount)
			taxAmount = 0
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Removed successfully from the cart','data':allData,'the_subtotal':finalSubtotal,'total_amount':finalTotal,'tax_amount':taxAmount})
		except Exception as e:
			print(str(e))
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class checkoutInfo(APIView):
	def post(self,request):
		try:
			language  = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)

			vat_obj = CommissionSection.objects.all().first()
			if vat_obj.vat_percentage:
				vat_value = vat_obj.vat_percentage
			else:
				vat_value = 0.00
			cart_obj = Cart.objects.filter(customer_id=user_obj.id,isPaid=False)
			total_amount = [float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
			Subtotal = [float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
			data = request.data
			discountedAmount = 0.00
			coupon = ''
			coupon_id = data.get('coupon_id')
			if coupon_id:
				functionResponse=couponapply(coupon_id,user_obj.id)
				if functionResponse['status_code']==200:
					discountOnItem=functionResponse['data'][0]['discount']
					coupon_id=functionResponse['data'][0]['coupon_id']
					
					discountedAmount=float(discountOnItem)
				else:
					return Response(functionResponse)

				subtotal_amount = sum(total_amount) - discountedAmount
				isCouponSelected = True
				coupon = coupon_id
			else:
				subtotal_amount  = sum(Subtotal)
				isCouponSelected = False
			
			last_total = subtotal_amount

			allData = {
				'taxAmount' : vat_value,
				'isCouponSelected' : isCouponSelected,
				'coupounDiscount' : discountedAmount,
				'couponId':coupon,
				'shipping_charges' : 0.00,
				'finalSubtotal' : sum(total_amount),
				'finalTotal' : last_total,
			}
					
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class addCustomerCard(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			card_id = request.data.get('card_id')
			if not card_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Card Id is required'},status=status.HTTP_400_BAD_REQUEST)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj.stripe_customer_id:
				customerObj.stripe_customer_id = createCustomerOnStripe()
				customerObj.save()
			if customerObj.stripe_customer_id:
				customerId = customerObj.stripe_customer_id
				stripe.api_key = settings.STRIPE_SECRET_KEY
				#stripe.api_key = getStripeKey()
				createCard = stripe.Customer.create_source(customerId,source=card_id)
				# create_card = json.loads(create_card)
				if createCard:
					alreadyAdefaultCardPresent=CustomerCard.objects.filter(customer_id=customerObj,isdefault=True).first()
					if alreadyAdefaultCardPresent:
						theDefault=False
						
					else:
						theDefault=True
					cardObj = CustomerCard.objects.create(customer_id=customerObj.id,card_id=createCard['id'],exp_month=createCard['exp_month'],exp_year=createCard['exp_year'],theCustomerStripe=createCard['customer'],last_digit=createCard['last4'],isdefault=theDefault)
	 
					alldata = {
						'cardCustomerID' : cardObj.theCustomerStripe,
						'lastDigit' : cardObj.last_digit,
						'expMonth' : cardObj.exp_month,
						'expYear' : cardObj.exp_year,
						'cardID' : cardObj.card_id,
						'cardObjectID' : cardObj.id,
						'isdefault' : cardObj.isdefault,
					}

					return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata})
				else:
					return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Oops! Something went wrong'},status=status.HTTP_400_BAD_REQUEST)
			else:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Oops! Something went wrong'},status=status.HTTP_400_BAD_REQUEST)
		except Exception as e:
			print(e)
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class getCardList(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			theCards=CustomerCard.objects.filter(customer=customerObj.id)
			allData = []
			for card in theCards:
				context = {}
				context['cardCustomerID'] = card.theCustomerStripe
				context['lastDigit'] =card.last_digit
				context['expMonth'] = card.exp_month
				context['expYear'] = card.exp_year
				context['cardID'] = card.card_id
				context['cardObjectID'] = card.id
				context['isdefault'] = card.isdefault
				allData.append(context)
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class removeCard(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			card_id = request.data.get('card_id')
			if not card_id:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			cardObj = CustomerCard.objects.filter(customer=customerObj.id,card_id=card_id).first()
			print('cardObj',cardObj)
			if not cardObj:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid card Id'},status=status.HTTP_401_UNAUTHORIZED)
			if cardObj.isdefault == True:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'You can not delete a default card.'},status=status.HTTP_400_BAD_REQUEST)
			stripe.api_key=settings.STRIPE_SECRET_KEY
			#stripe.api_key = getStripeKey()
			cardInfo = stripe.Customer.delete_source(
				str(cardObj.theCustomerStripe),
				str(card_id),
			)
			print('Card_Info',cardInfo)
			if cardInfo['deleted'] == True:
				cardObj.delete()
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Card deleted successfully'})

		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class setDefaultCard(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			card_id = request.data.get('card_id')
			if not card_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'card Id is required'},status=status.HTTP_400_BAD_REQUEST)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			cardObj = CustomerCard.objects.filter(customer=customerObj,card_id=card_id).first()
			if not cardObj:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid card Id'},status=status.HTTP_401_UNAUTHORIZED)	
			oldDefaultCard = CustomerCard.objects.filter(customer=customerObj,isdefault=True).first()
			if oldDefaultCard:
				oldDefaultCard.isdefault = False
				oldDefaultCard.save()
			cardObj.isdefault = True
			cardObj.save()
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class placeOrder(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			address_id = request.data.get('address_id')
			if not address_id:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Address Id is required'},status=status.HTTP_401_UNAUTHORIZED)
			addressObj = Addresses.objects.filter(id=address_id).first()
			vat_obj = CommissionSection.objects.all().first()
			if vat_obj.vat_percentage:
				vat_value = vat_obj.vat_percentage
			else:
				vat_value = 0.00
			cartPackObj = Cart.objects.filter(customer_id=user_obj.id,isPaid=False).first()
			print(cartPackObj)
			totalDiscount=0
			finalTotal=0
			finalSubtotal=0
			orderPackObjects = orderPack.objects.filter(customer=user_obj,isPaid=False).first()
			print('orderPackObjects',orderPackObjects)
			if not orderPackObjects:
				orderPackObjects=orderPack.objects.create(customer=user_obj,orderId=gernateOrderId())
			print("sucesss")
			orderPackObjects.deliveryAddress = addressObj
			orderPackObjects.productDetail = cartPackObj
			# if data.get('couponCode'):orderPackObjects.couponCode=couponObj
			orderPackObjects.save()
			print("sucesss1")

			# subtotal = cartPackage.objects.filter(customer=customerObj,isPaid=False).first()
			Total =[float(usercart.totalAmount) for usercart in Cart.objects.filter(customer_id=user_obj.id,isPaid=False)]
			print('subTotalAmount',Total)
			subTotal = sum(Total)
			# subTotal = int(float(subTotalAmount))
			# print('subTotal',subTotal)
			print("sucesss2")

			coupounDiscount=0

			if request.data.get('coupon_id'):
				functionResponse=couponapply(request.data.get('coupon_id'),user_obj.id)
				if functionResponse['status_code']==200:
					discountOnItem=functionResponse['data'][0]['discount']
					coupounDiscount=float(discountOnItem)
					couponObj = StoreCoupons.objects.filter(id=request.data.get('coupon_id')).first()
					if not couponObj:
						return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid Coupon Code'},status=status.HTTP_400_BAD_REQUEST)
					orderPackObjects.couponId=couponObj
					orderPackObjects.isCouponSelected=True
					finalGrandTotal = subTotal - coupounDiscount

				else:
					return Response(functionResponse)
			else:
				finalGrandTotal = subTotal
				orderPackObjects.isCouponSelected=False

			finalGrandTotal = finalGrandTotal
			last_total = finalGrandTotal
			orderPackObjects.couponDiscount = "{:.2f}".format(coupounDiscount)
			orderPackObjects.subTotalAmount= subTotal
			orderPackObjects.vatPercentage= vat_value
			orderPackObjects.totalAmount= last_total
			orderPackObjects.save()
			cartPackObj2 = Cart.objects.filter(customer_id=user_obj.id,isPaid=False)
			for cartPackObj2 in cartPackObj2:
				cartPackObj2.orderId=orderPackObjects.orderId
				cartPackObj2.save()
			allData ={}
			allData.update({
							'orderId':orderPackObjects.orderId,
							'subTotal':str(subTotal),
							'coupounDiscount':str(format(float(coupounDiscount),".2f")),
							'Total':str(format(float(finalGrandTotal),".2f")),
							'isCouponSelected':str(orderPackObjects.isCouponSelected),})
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})

		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class orderPay(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			card_id =  request.data.get('card_id')
			print('card_id',card_id)
			if not card_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Card ID is required'},status=status.HTTP_400_BAD_REQUEST)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			print("----------",customerObj)
			cardObj = CustomerCard.objects.filter(customer=customerObj,card_id=card_id).first()
			print('card-obj',cardObj)
			orderPackObj = orderPack.objects.filter(customer=user_obj,isPaid=False).first()
			if not orderPackObj:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid order'},status=status.HTTP_401_UNAUTHORIZED)
			thePaymentObj = paymentWithExistingCard(cardObj.theCustomerStripe,cardObj.card_id,orderPackObj.totalAmount)
			print('thePaymentObj',thePaymentObj)
			if thePaymentObj['status'] == True:
				print('==2==')
				CustTransaction = CustomerTransaction.objects.create(customer=user_obj,orderPack=orderPackObj,amount=str(orderPackObj.totalAmount),txnID=thePaymentObj['data']['balance_transaction'],recieptUrl=thePaymentObj['data']['receipt_url'])
				cartPack = Cart.objects.filter(customer=user_obj,isPaid=False)
				print('cartPack',cartPack)
				for cartPack in cartPack:
					if cartPack:
						cartPack.isPaid = True
						cartPack.save()
				orderPackObj.isPaid = True
				today = date.today()
				orderPackObj.orderDate = today 
				orderPackObj.save()
				StoreNotifications.objects.create(message= 'You got a new order request.',store_id=orderPackObj.productDetail.product.store.id,is_read=True)
				CustomerNotifications.objects.create(message = 'Your order is placed successfully', message_arabic="تم وضع طلبك بنجاح", notification_type='order',customer=customerObj)
				
				return Response({'status_code':status.HTTP_200_OK,'status_message':'Payment has been done successfully','data':thePaymentObj['data']})		
			else:
				print("==3==")
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':thePaymentObj['message']})		
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class orderPayMoysaar(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			orderPackObj = orderPack.objects.filter(customer=user_obj,isPaid=False).first()
			if not orderPackObj:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid order'},status=status.HTTP_401_UNAUTHORIZED)
			CustTransaction = CustomerTransaction.objects.create(customer=user_obj,orderPack=orderPackObj,amount=str(orderPackObj.totalAmount),recieptUrl=request.data.get('reciept_url'),mayosarID=request.data.get('mayosar_id'))
			cartPack = Cart.objects.filter(customer=user_obj,isPaid=False)
			print('cartPack',cartPack)
			for cartPack in cartPack:
				if cartPack:
					cartPack.isPaid = True
					cartPack.save()
			orderPackObj.isPaid = True
			today = date.today()
			orderPackObj.orderDate = today 
			orderPackObj.save()
			StoreNotifications.objects.create(message= 'You got a new order request.',store_id=orderPackObj.productDetail.product.store.id,is_read=True)
			CustomerNotifications.objects.create(message = 'Your order is placed successfully', notification_type='order',customer=customerObj)
			
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Payment has been done successfully'})		
	
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class orderPayWallet(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			orderPackObj = orderPack.objects.filter(customer=user_obj,isPaid=False).first()
			if not orderPackObj:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid order'},status=status.HTTP_401_UNAUTHORIZED)
			CustomerTransaction.objects.create(customer=user_obj,orderPack=orderPackObj,amount=str(orderPackObj.totalAmount),recieptUrl='wallet',mayosarID='wallet')
			amount = float(customerObj.wallet_amount) - float(orderPackObj.totalAmount) 
			Buyer.objects.filter(id=customerObj.id).update(wallet_amount=amount)
			Wallet.objects.create(type='Subtraction',buyer=customerObj,amount=float(orderPackObj.totalAmount),reason='Order Placed',transcation_type='Purchase',balance=amount,order_id = orderPackObj.orderId)

			
			cartPack = Cart.objects.filter(customer=user_obj,isPaid=False)
			print('cartPack',cartPack)
			for cartPack in cartPack:
				if cartPack:
					cartPack.isPaid = True
					cartPack.save()
			orderPackObj.isPaid = True
			today = date.today()
			orderPackObj.orderDate = today 
			orderPackObj.save()
			StoreNotifications.objects.create(message= 'You got a new order request.',store_id=orderPackObj.productDetail.product.store.id,is_read=True)
			CustomerNotifications.objects.create(message = 'Your order is placed successfully', notification_type='order',customer=customerObj)
			
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Payment has been done successfully'})		
	
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class orderPayService(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			service_invoice_id = request.data.get('service_invoice_id')
			if not service_invoice_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service invoice Id is required'},status=status.HTTP_400_BAD_REQUEST)
			orderPackObj = ServiceInvoice.objects.filter(service_request_id_id=service_invoice_id,is_paid=False).first()
			print('orderPackObj',orderPackObj)
			if not orderPackObj:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid Service order'},status=status.HTTP_401_UNAUTHORIZED)
			CustTransaction = CustomerTransactionService.objects.create(customer=user_obj,servicePack=orderPackObj,amount=str(orderPackObj.total_amount),recieptUrl=request.data.get('reciept_url'),mayosarID=request.data.get('mayosar_id'))
			cartPack = ServiceInvoice.objects.filter(is_paid=False,service_request_id=service_invoice_id).update(is_paid=True)
			ServiceRequests.objects.filter(id=service_invoice_id).update(payment_status=True)
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Payment has been done successfully'})		
	
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class orderPayServiceWallet(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			service_invoice_id = request.data.get('service_invoice_id')
			if not service_invoice_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service invoice Id is required'},status=status.HTTP_400_BAD_REQUEST)
			orderPackObj = ServiceInvoice.objects.filter(service_request_id_id=service_invoice_id,is_paid=False).first()
			print('orderPackObj',orderPackObj)
			if not orderPackObj:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid order'},status=status.HTTP_401_UNAUTHORIZED)
			CustTransaction = CustomerTransactionService.objects.create(customer=user_obj,servicePack=orderPackObj,amount=str(orderPackObj.total_amount),recieptUrl="wallet",mayosarID="wallet")
			amount = float(customerObj.wallet_amount) - float(orderPackObj.total_amount) 
			Buyer.objects.filter(id=customerObj.id).update(wallet_amount=amount)
			Wallet.objects.create(type='Subtraction',buyer=customerObj,amount=float(orderPackObj.total_amount),reason='Order Placed',transcation_type='Purchase',balance=amount,service_id = service_invoice_id)

			
			cartPack = ServiceInvoice.objects.filter(is_paid=False,service_request_id=service_invoice_id).update(is_paid=True)
			ServiceRequests.objects.filter(id=service_invoice_id).update(payment_status=True)
			
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Payment has been done successfully'})		
	
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class cutomerOrderListing(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			orderListPack = orderPack.objects.filter(customer=user_obj,isPaid=True).order_by('-id')
			allData = []
			for theOrder in orderListPack:
				totalCount = Cart.objects.filter(customer=user_obj,orderId=theOrder.orderId,isPaid=True).count()
				context = {}
				context['Id'] = theOrder.id
				context['orderId'] = theOrder.orderId
				context['totalAmount'] = theOrder.totalAmount
				context['orderItem'] = totalCount
				context['orderDate'] = theOrder.orderDate
				context['delivery_status'] = theOrder.delivery_status
				print(theOrder.delivery_status)
				context['orderStatus'] = 'Pending'
				context['orderImage'] = ast.literal_eval(theOrder.productDetail.product.images)
				context['isRated'] = theOrder.is_rated

				allData.append(context)
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class customerOrderDetail(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			order_id = request.data.get('order_id')
			print('order_id',order_id)
			if not order_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Order Id is required'},status=status.HTTP_400_BAD_REQUEST)
			
			theOrders = orderPack.objects.filter(customer=user_obj,orderId=order_id,isPaid=True).first()
			print('theorders',theOrders)
			totalCount = Cart.objects.filter(customer=user_obj,orderId=order_id,isPaid=True).count()
			print('totalCount',totalCount)
			if not theOrders:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Order list empty'},status=status.HTTP_400_BAD_REQUEST)
			# summaryinfo = []
			summaryDetail = {}
			summaryDetail['deliver_to'] = GetAddressData(theOrders.deliveryAddress).data
			summaryDetail['order_id'] = theOrders.orderId
			summaryDetail['order_date'] = theOrders.orderDate
			summaryDetail['order_items'] = totalCount
			summaryDetail['delivery_charges'] = theOrders.shippingCharge
			summaryDetail['sub_total'] = theOrders.subTotalAmount
			summaryDetail['total'] = theOrders.totalAmount
			summaryDetail['delivery_status'] = theOrders.delivery_status
			summaryDetail['discount'] = theOrders.couponDiscount
			summaryDetail['order_status'] = 'Pending'
			summaryDetail['rating']  = theOrders.is_rated
			summaryDetail['tax'] = theOrders.vatPercentage
			summaryDetail['cart']= theOrders.productDetail.product.images
			
			# summaryinfo.append(summaryDetail)


			cartData = Cart.objects.filter(customer=user_obj,orderId=order_id,isPaid=True)
			print('cartData',cartData)
			# cartData = Cart.objects.filter(package=cartPack)
			allData = []
			theSerialObject = {}
			for cart in cartData:
				print('cart',cart)
				productData = {
				'product_id': cart.product.id,
				'product_name':cart.product.product_name_english,
				'product_image':ast.literal_eval(cart.product.images),
				'store_id': cart.product.store.id,
				'store_name':cart.product.store.store_name_english,	
				}
				total = float(cart.totalAmount)
				theSerialObject=productData
				theSerialObject['product_count'] = cart.productCount
				theSerialObject['total_amount'] = format(total,'.1f')
				
				allData.append(theSerialObject)
			data = {
				"summary":summaryDetail,
				"productDetail":allData
			}
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':data})		
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class getOffers(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if session_token:
				user_obj = User.objects.get(token=session_token)
			else:
				user_obj = 0
			language = request.headers['language']
			
			product_obj_cat = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True).values('maincategory__id','maincategory__category_name_english','maincategory__category_name_arabic').distinct()

			main_category = []
			if language == 'ar':
				for product in product_obj_cat:
					print("---------------------------")
					alldata = {
						'category_id': product['maincategory__id'],
						'category_name' : product['maincategory__category_name_arabic'] 
					}
					main_category.append(alldata)
			else:
				for product in product_obj_cat:
					alldata = {
						'category_id': product['maincategory__id'],
						'category_name' : product['maincategory__category_name_english']
					}
					main_category.append(alldata)


			highest_price =  Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True).order_by('-price_discount')[0].price_discount
			sort_data = self.request.query_params.get('sort_data')
			
			category_id = self.request.query_params.get('category_id')
			price_start = self.request.query_params.get('price_start')
			price_end = self.request.query_params.get('price_end')
			filter_data = self.request.query_params.get('filter_data')

			print('category_id',category_id)
			print('price_start',price_start)
			print('price_start',price_end)
			print('filter_data',filter_data)


			if filter_data == 'yes':
				lookups = Q()
				if category_id:
					lookups.add(Q(maincategory_id=category_id), Q.AND)
				if price_end:
					lookups.add(Q(price_discount__range=(price_start,price_end)), Q.AND)

				if sort_data == 'discount_percentage':
					print('dissssssssssss')
					product_obj = Products.objects.filter(lookups,is_offer_applied=1,end_date__isnull = True, status=True).order_by('-offer_discount')
				elif sort_data == 'highest_price':
					print('higssssssssssss')

					product_obj = Products.objects.filter(lookups,is_offer_applied=1,end_date__isnull = True, status=True).order_by('-price_discount')
				elif sort_data == 'lowest_price':
					print('lowsssssssssssssss')

					product_obj = Products.objects.filter(lookups,is_offer_applied=1,end_date__isnull = True, status=True).order_by('price_discount')
				else:

					print('norrrrrrrrrrr')
					product_obj = Products.objects.filter(lookups,is_offer_applied=1,end_date__isnull = True, status=True).order_by('-id')
			else:
				if sort_data == 'discount_percentage':
					print('dissssssssssss 2')

					product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True).order_by('-offer_discount')
				elif sort_data == 'highest_price':
					print('higssssssssssss 3')
					product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True).order_by('-price_discount')
				elif sort_data == 'lowest_price':
					print('lowsssssssssssssss 4')

					product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True).order_by('price_discount')
				else:
					print('norrrrrrrrrrr 5')

					product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True).order_by('-id')


			page = self.request.query_params.get('page')
			if not page:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
			page_per_data = self.request.query_params.get('page_per_data')
			if not page_per_data:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
			paginator = Paginator(product_obj, page_per_data)
			try:
				product_obj = paginator.page(page)
			except PageNotAnInteger:
				product_obj = paginator.page(1)
			except EmptyPage:
				product_obj = paginator.page(paginator.num_pages)
			allData = [] 
			if language == 'ar':
				for product in product_obj:
					favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
					if favourite_obj:
						favourite = True
					else:
						favourite = False
					alldata = {
						'is_favourite':favourite,
						'product_id':product.id,
						'product_name' : product.product_name_arabic,
						'maincategory':product.maincategory.category_name_arabic,
						'subcategory':product.subcategory.category_name_arabic,
						'description':product.description_arabic,
						'brand':product.brand.brand_name_arabic,
						'price':product.price,
						'price_discount':product.price_discount,
						'ratings':product.rating,
						'images':ast.literal_eval(product.images),
						'store_id':product.store_id,
						'store_name':product.store.store_name_arabic,
						'offer_discount': product.offer_discount,
					}
					allData.append(alldata)
			else:
				for product in product_obj:
					favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
					if favourite_obj:
						favourite = True
					else:
						favourite = False
					alldata = {
						'is_favourite':favourite,
						'product_id':product.id,
						'product_name' : product.product_name_english,
						'maincategory':product.maincategory.category_name_english,
						'subcategory':product.subcategory.category_name_english,
						'description':product.description_english,
						'brand':product.brand.brand_name_english,
						'price':product.price,
						'ratings':product.rating,
						'price_discount':product.price_discount,
						'images':ast.literal_eval(product.images),
						'store_id':product.store_id,
						'is_vip':product.store.is_vip,
						'store_name':product.store.store_name_english,
						'offer_discount': product.offer_discount,
					}
					allData.append(alldata)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(product_obj),'main_category':main_category,'highest_price':highest_price})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class filterOfferSection(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if session_token:
				user_obj = User.objects.get(token=session_token)
			else:
				user_obj = 0
			language = request.headers['language']
			product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True).values('maincategory__id','maincategory__category_name_english').distinct()
			print('product_obj',product_obj)
			main_category = []
			if language == 'ar':
				for product in product_obj:
					alldata = {
						'category_id': product['maincategory__id'],
						'category_name' : product['maincategory__category_name_english'] 
					}
					main_category.append(alldata)
			else:
				for product in product_obj:
					alldata = {
						'category_id': product['maincategory__id'],
						'category_name' : product['maincategory__category_name_english']
					}
					main_category.append(alldata)
			highest_price =  Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True).order_by('-price_discount')[0].price_discount
			print(highest_price)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':main_category,'highest_price':highest_price})
		
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if session_token:
				user_obj = User.objects.get(token=session_token)
			else:
				user_obj = 0
			language = request.headers['language']
			product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True)
			category_id = request.data.get('category_id')
			if category_id:
				product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True,maincategory_id = category_id)
			price_start = request.data.get('price_start')
			price_end = request.data.get('price_end')
			if price_end :
				product_obj = Products.objects.filter(price_discount__range=(price_start,price_end),is_offer_applied=1,end_date__isnull = True, status=True)
			if category_id and price_end:
				product_obj = Products.objects.filter(price_discount__range=(price_start,price_end),maincategory_id = category_id,is_offer_applied=1,end_date__isnull = True, status=True)
			page = request.data.get('page')
			if not page:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
			page_per_data = request.data.get('page_per_data')
			if not page_per_data:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
			paginator = Paginator(product_obj, page_per_data)
			try:
				product_obj = paginator.page(page)
			except PageNotAnInteger:
				product_obj = paginator.page(1)
			except EmptyPage:
				product_obj = paginator.page(paginator.num_pages)
			allData = [] 
			if language == 'ar':
				for product in product_obj:
					favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
					if favourite_obj:
						favourite = True
					else:
						favourite = False
					alldata = {
						'is_favourite':favourite,
						'product_id':product.id,
						'product_name' : product.product_name_arabic,
						'maincategory':product.maincategory.category_name_arabic,
						'subcategory':product.subcategory.category_name_arabic,
						'description':product.description_arabic,
						'brand':product.brand.brand_name_arabic,
						'price':product.price,
						'ratings':product.rating,
						'price_discount':product.price_discount,
						'images':ast.literal_eval(product.images),
						'store_id':product.store_id,
						'is_vip':product.store.is_vip,
						'store_name':product.store.store_name_arabic,
						'offer_discount': product.offer_discount,
					}
					allData.append(alldata)
			else:
				for product in product_obj:
					favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
					if favourite_obj:
						favourite = True
					else:
						favourite = False
					alldata = {
						'is_favourite':favourite,
						'product_id':product.id,
						'product_name' : product.product_name_english,
						'maincategory':product.maincategory.category_name_english,
						'subcategory':product.subcategory.category_name_english,
						'description':product.description_english,
						'brand':product.brand.brand_name_english,
						'price':product.price,
						'ratings':product.rating,
						'price_discount':product.price_discount,
						'images':ast.literal_eval(product.images),
						'store_id':product.store_id,
						'is_vip':product.store.is_vip,
						'store_name':product.store.store_name_english,
						'offer_discount': product.offer_discount,
					}
					allData.append(alldata)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(product_obj)})

		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class getServiceProviders(APIView):
	def get(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if session_token:
			user_obj = User.objects.get(token=session_token)
		else:
			user_obj = 0
		language = request.headers['language']
		service_id = self.request.query_params.get('service_id') 
		if not service_id:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service Id is required'},status=status.HTTP_400_BAD_REQUEST)
		stores_obj = storeServices.objects.filter(serviceId=service_id,status=True)
		if not stores_obj:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No store found'},status=status.HTTP_400_BAD_REQUEST)

		allData = []
		if language == 'ar':
			for store in stores_obj:
				alldata = {
					'store_id':store.store.id,
					'store_name': store.store.store_name_arabic,
					'store_description':store.store.store_description_arabic,
					'ratings':store.store.ratings,

					'store_icon':store.store.store_logo,
				}
				allData.append(alldata)
		else:
			for store in stores_obj:
				alldata = {
					'store_id':store.store.id,
					'store_name': store.store.store_name_english,
					'store_description':store.store.store_description_english,
					'store_icon':store.store.store_logo,
					'ratings':store.store.ratings,
				}
				allData.append(alldata)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})

class stonePolishingRequest(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			language = request.headers['language']
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			store_id = self.request.query_params.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store Id is required'},status=status.HTTP_400_BAD_REQUEST)
			stones_obj =  StoneType.objects.filter(store_id = store_id,end_date__isnull =True,status =1)
			allData =[]
			if language == 'ar':
				for stones in stones_obj:
					alldata={
						'stone_id':stones.id,
						'stone_type': stones.stone_type_arabic
					}
					allData.append(alldata)
			else:
				for stones in stones_obj:
					alldata={
						'stone_id':stones.id,
						'stone_type': stones.stone_type_english
					}
					allData.append(alldata)


			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

	
	
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			service_id = request.data.get('service_id')

			if not service_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service Id is required'},status=status.HTTP_400_BAD_REQUEST)
			store_id = request.data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store Id is required'},status=status.HTTP_400_BAD_REQUEST)
			stone_id = request.data.get('stone_type')
			print("Sttttttttttttttttttttttttttttt",stone_id)
			if not stone_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Stone type is required'},status=status.HTTP_400_BAD_REQUEST)
			stone_type =  StoneType.objects.filter(id=stone_id,store_id = store_id,end_date__isnull =True,status =1).first()
			size = request.data.get('size')
			if not size:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Size is required'},status=status.HTTP_400_BAD_REQUEST)
			amount = request.data.get('amount')
			if not amount:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Amount is required'},status=status.HTTP_400_BAD_REQUEST)
			notes = request.data.get('notes')
			if not notes:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Notes is required'},status=status.HTTP_400_BAD_REQUEST)
			shape = request.data.get('shape')
			if not shape:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Shape is required'},status=status.HTTP_400_BAD_REQUEST)
			service_obj_id = Services.objects.filter(id=service_id).first()
			print()
			service_obj = ServiceRequests.objects.create(store_id = store_id,serviceId = service_obj_id, customer=customerObj,shape=shape,stone_type=stone_type,size=size,amount=amount,notes=notes)
			if request.data.get('image'):
					fileUrl=uploadServiceRequest(request.data.get('image'))
					fileUrl=str(settings.BASE_URL)+'/'+fileUrl
					service_obj.image=str(fileUrl)
					service_obj.save()
			StoreNotifications.objects.create(message= 'You got a new order request for stone polishing.',store_id=store_id,is_read=True)

			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Service request send successfullly'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class extractionRequest(APIView):
	def get(self,request):
		pass

	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			service_id = request.data.get('service_id')
			if not service_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service Id is required'},status=status.HTTP_400_BAD_REQUEST)
			store_id = request.data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store Id is required'},status=status.HTTP_400_BAD_REQUEST)
			number_of_stone = request.data.get('number_of_stone')
			if not number_of_stone:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Number of stone is required'},status=status.HTTP_400_BAD_REQUEST)
			weight_of_each_stone = request.data.get('weight_of_each_stone')
			if not weight_of_each_stone:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Weight of stone is required'},status=status.HTTP_400_BAD_REQUEST)
			notes = request.data.get('notes')
			if not notes:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Weight of stone is required'},status=status.HTTP_400_BAD_REQUEST)
			service_obj_id = Services.objects.filter(id=service_id).first()
			service_obj = ServiceRequests.objects.create(store_id = store_id,serviceId = service_obj_id, customer=customerObj,number_of_stones=number_of_stone,weight_of_stone=weight_of_each_stone,notes=notes)
			if request.data.get('image'):
					fileUrl=uploadServiceRequest(request.data.get('image'))
					fileUrl=str(settings.BASE_URL)+'/'+fileUrl
					service_obj.image=str(fileUrl)
					service_obj.save()
			StoreNotifications.objects.create(message= 'You got a new order request for extraction request.',store_id=store_id,is_read=True)
			
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Service request send successfullly'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class accessoriesMaintenanceRequest(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			language = request.headers['language']
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			store_id = self.request.query_params.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store ID  is required'},status=status.HTTP_400_BAD_REQUEST)

			service_type_obj = ServiceType.objects.filter(store_id=store_id,status=True,end_date__isnull = True)
			allData = []
			if language == 'ar':
				for service in service_type_obj:
					alldata = {
						'service_id' : service.id,
						'service_type': service.service_type_arabic
					}
					allData.append(alldata)
			else:
				for service in service_type_obj:
					alldata = {
						'service_id' : service.id,
						'service_type': service.service_type_english,
					}
					allData.append(alldata)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
	
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			service_id = request.data.get('service_id')
			if not service_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service Id is required'},status=status.HTTP_400_BAD_REQUEST)
			store_id = request.data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store Id is required'},status=status.HTTP_400_BAD_REQUEST)
			service_type_id = request.data.get('service_type')
			if not service_type_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service type is required'},status=status.HTTP_400_BAD_REQUEST)
			service_type = ServiceType.objects.filter(id=service_type_id,store_id=store_id,status=True,end_date__isnull = True).first()
			notes = request.data.get('notes')
			if not notes:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Note is required'},status=status.HTTP_400_BAD_REQUEST)
			service_obj_id = Services.objects.filter(id=service_id).first()
			service_obj = ServiceRequests.objects.create(store_id = store_id,serviceId = service_obj_id, customer=customerObj,service_type=service_type,notes=notes)
			if request.data.get('image'):
				fileUrl=uploadServiceRequest(request.data.get('image'))
				fileUrl=str(settings.BASE_URL)+'/'+fileUrl
				service_obj.image=str(fileUrl)
				service_obj.save()
			StoreNotifications.objects.create(message= 'You got a new order request for accessories maintainance.',store_id=store_id,is_read=True)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Service request send successfullly'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class watchesMaintenanceRequest(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			language = request.headers['language']
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			store_id = self.request.query_params.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid session token'},status=status.HTTP_400_BAD_REQUEST)
			service_type_obj = ServiceType.objects.filter(store_id=store_id,status=True,end_date__isnull = True)
			allData = []
			if language == 'ar':
				for service in service_type_obj:
					alldata={
						'service_id': service.id,
						'service_type': service.service_type_arabic
					}
					allData.append(alldata)
			else:
				for service in service_type_obj:
					alldata={
						'service_id': service.id,
						'service_type': service.service_type_english
					}
					allData.append(alldata)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			service_id = request.data.get('service_id')
			if not service_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service Id is required'},status=status.HTTP_400_BAD_REQUEST)
			store_id = request.data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store Id is required'},status=status.HTTP_400_BAD_REQUEST)
			service_type = request.data.get('service_type')
			if not service_type:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service type is required'},status=status.HTTP_400_BAD_REQUEST)
			service_type_id = ServiceType.objects.filter(id=service_type,store_id=store_id,status=True,end_date__isnull = True).first()
			notes = request.data.get('notes')
			if not notes:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service type is required'},status=status.HTTP_400_BAD_REQUEST)
			service_obj_id = Services.objects.filter(id=service_id).first()
			service_obj = ServiceRequests.objects.create(store_id = store_id,serviceId = service_obj_id, customer=customerObj,service_type=service_type_id,notes=notes)
			if request.data.get('image'):
				fileUrl=uploadServiceRequest(request.data.get('image'))
				fileUrl=str(settings.BASE_URL)+'/'+fileUrl
				service_obj.image=str(fileUrl)
				service_obj.save()
			StoreNotifications.objects.create(message= 'You got a new order request for watch maintainance.',store_id=store_id,is_read=True)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Service request send successfullly'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class detailingAccessoriesRequest(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			language = request.headers['language']
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj = User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			store_id = self.request.query_params.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid session token'},status=status.HTTP_400_BAD_REQUEST)
			service_model = ServiceModel.objects.filter(
				store_id=store_id,status=True,end_date__isnull = True
			)
			if language == 'ar':
				service_data = []
				for service in service_model:
					alldata={
						'service_id':service.id,
						'service_model':service.service_model_arabic
					}
					service_data.append(alldata)
				stones_obj =  StoneType.objects.filter(store_id = store_id,end_date__isnull =True,status =1)
				stoneData =[]
				for stones in stones_obj:
					alldata={
						'stone_id':stones.id,
						'stone_type': stones.stone_type_arabic
					}
					stoneData.append(alldata)
			else:
				service_data = []
				for service in service_model:
					alldata={
						'service_id':service.id,
						'service_model':service.service_model_english
					}
					service_data.append(alldata)
				stones_obj =  StoneType.objects.filter(store_id = store_id,end_date__isnull =True,status =1)
				stoneData =[]
				for stones in stones_obj:
					alldata={
						'stone_id':stones.id,
						'stone_type': stones.stone_type_english
					}
					stoneData.append(alldata)

			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','service_data':service_data,'stone_data':stoneData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			service_id = request.data.get('service_id')
			if not service_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service Id is required'},status=status.HTTP_400_BAD_REQUEST)
			store_id = request.data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store Id is required'},status=status.HTTP_400_BAD_REQUEST)
			service_id = request.data.get('service_model')
			if not service_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service model is required'},status=status.HTTP_400_BAD_REQUEST)
			service_model = ServiceModel.objects.filter(id = service_id,end_date__isnull =True,status =1).first()
			stone_type_id = request.data.get('stone_type')
			if not stone_type_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Stone type is required'},status=status.HTTP_400_BAD_REQUEST)
			stone_type_obj = StoneType.objects.filter(id = stone_type_id,end_date__isnull =True,status =1).first()
			notes = request.data.get('notes')
			if not notes:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service type is required'},status=status.HTTP_400_BAD_REQUEST)
			size = request.data.get('size')
			if not size:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Size is required'},status=status.HTTP_400_BAD_REQUEST)

			service_obj_id = Services.objects.filter(id=service_id).first()

			service_obj = ServiceRequests.objects.create(store_id = store_id,serviceId = service_obj_id, customer=customerObj,service_model=service_model,notes=notes,stone_type=stone_type_obj,size=size)
			
			if request.data.get('image'):
				fileUrl=uploadServiceRequest(request.data.get('image'))
				fileUrl=str(settings.BASE_URL)+'/'+fileUrl
				service_obj.image=str(fileUrl)
				service_obj.save()
			StoreNotifications.objects.create(message= 'You got a new order request for detailing accessories.',store_id=store_id,is_read=True)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Service request send successfullly'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class giftArrangementRequest(APIView):
	def get(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			store_id = self.request.query_params.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store Id is required'},status=status.HTTP_400_BAD_REQUEST)
			giftobj = GiftBoxType.objects.filter(status=True,end_date__isnull = True)
			giftData= []
			if language == 'ar':
				for gift in giftobj:
					alldata = {
						'box_id':gift.id,
						'box_name':gift.box_name_arabic,
						'box_image':gift.box_image,
						'box_cost':gift.box_cost,
					}
					giftData.append(alldata)
			else:
				for gift in giftobj:
					alldata = {
						'box_id':gift.id,
						'box_name':gift.box_name_english,
						'box_image':gift.box_image,
						'box_cost':gift.box_cost,
					}
					giftData.append(alldata)

			packagingobj = GiftPackingType.objects.filter(status=True,end_date__isnull = True)
			packagingData = []
			if language == 'ar':
				for packing in packagingobj:
					alldata2 = {
						'packaging_id':packing.id,
						'packaging_name':packing.packaging_name_arabic,
						'packaging_image':packing.packaging_image,
						'packaging_cost':packing.packaging_cost,
					}
					packagingData.append(alldata2)
			else:
				for packing in packagingobj:
					alldata2 = {
						'packaging_id':packing.id,
						'packaging_name':packing.packaging_name_english,
						'packaging_image':packing.packaging_image,
						'packaging_cost':packing.packaging_cost,
					}
					packagingData.append(alldata2)

			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','giftdata':giftData,'packagingdata':packagingData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			service_id = request.data.get('service_id')
			if not service_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service Id is required'},status=status.HTTP_400_BAD_REQUEST)
			service_obj_id = Services.objects.filter(id=service_id).first()
			store_id = request.data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store Id is required'},status=status.HTTP_400_BAD_REQUEST)
			# story_id_new =  stores.objects.filter(id=store_id).first()
			box_id  = request.data.get('box_type')
			if not box_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Box type is required'},status=status.HTTP_400_BAD_REQUEST)
			box_type = GiftBoxType.objects.filter(id=box_id,status=True,end_date__isnull = True).first()
			packaging_id = request.data.get('packaging_id')
			if not packaging_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Packaging ID is required'},status=status.HTTP_400_BAD_REQUEST)
			packaging_type = GiftPackingType.objects.filter(id=packaging_id,status=True,end_date__isnull = True).first()
			gift_sentence = request.data.get('gift_sentence')
			if not gift_sentence:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Gift sentence is required'},status=status.HTTP_400_BAD_REQUEST)
			notes = request.data.get('notes')
			if not notes:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'notes is required'},status=status.HTTP_400_BAD_REQUEST)
			ServiceRequests.objects.create(serviceId=service_obj_id,store_id=store_id,customer=customerObj,gift_box=box_type,gift_packaging=packaging_type,gift_card_sentence=gift_sentence,notes=notes)
			StoreNotifications.objects.create(message= 'You got a new order request for gift arrangemnt',store_id=store_id,is_read=True)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Request send succesfully'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class serviceAppliedList(APIView):
	def get(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			service_obj = ServiceRequests.objects.filter(customer=customerObj).order_by('-id')
			print(service_obj)
			allData = []
			if language == 'ar':
				for service in service_obj:
					if service.image:
						image = service.image
					else:
						image =  None

					if service.service_status == 0:
						status_info = 'Pending'
					elif service.service_status == 1:
						status_info = 'Accepted'
					else:
						status_info = 'Declined'

					alldata={
						'request_id':service.id,
						'store_name':service.store.store_name_english,
						'service_name': service.serviceId.arabic_service_name,
						'request_date':service.start_date,
						'image':image,
						'invoice_generated':service.invoice_generated,
						'status':status_info,
						'is_paid':service.payment_status,
						'delivery_status':service.delivery_status,

					}
					allData.append(alldata)
			else:
				for service in service_obj:
					if service.image:
						image = service.image
					else:
						image =  None

					if service.service_status == 0:
						status_info = 'Pending'
					elif service.service_status == 1:
						status_info = 'Accepted'
					else:
						status_info = 'Declined'
						
					alldata={
						'request_id':service.id,
						'store_name':service.store.store_name_english,
						'service_name': service.serviceId.english_service_name,
						'request_date':service.start_date,
						'invoice_generated':service.invoice_generated,
						'image':image,
						'status': status_info,
						'is_paid':service.payment_status,
						'delivery_status':service.delivery_status,

					}
					allData.append(alldata)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
	
class servicesAppliedDetails(APIView):
	def get(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			service_request_id  =  self.request.query_params.get('service_request_id')
			if not service_request_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service request ID is required'},status=status.HTTP_400_BAD_REQUEST)
			service = ServiceRequests.objects.filter(customer=customerObj,id=service_request_id).first()

			if not service:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service not found'},status=status.HTTP_400_BAD_REQUEST)
				
			if service.stone_type:
				if language == 'ar':
					stone_type = service.stone_type.stone_type_arabic
				else:
					stone_type = service.stone_type.stone_type_english
			else:
				stone_type =  None

			if service.size:
				size = service.size
			else:
				size =  None
			
			if service.shape:
				shape = service.shape
			else:
				shape =  None

			if service.amount:
				amount = service.amount
			else:
				amount =  None

			if service.notes:
				notes = service.notes
			else:
				notes =  None
			
			if service.image:
				image = service.image
			else:
				image =  None

			if service.number_of_stones:
				number_of_stones = service.number_of_stones
			else:
				number_of_stones =  None


			if service.weight_of_stone:
				weight_of_stone = service.weight_of_stone
			else:
				weight_of_stone =  None

			if service.service_type:
				if language == 'ar':
					service_type = service.service_type.service_type_arabic
				else:
					service_type = service.service_type.service_type_english
			else:
				service_type =  None

			if service.service_model:
				service_model = service.service_model
			else:
				service_model =  None


			if service.gift_box:
				if language == 'ar':
					gift_box = service.gift_box.box_name_arabic
				else:
					gift_box = service.gift_box.box_name_english
			else:
				gift_box =  None
			

			if service.gift_packaging:
				if language == 'ar':
					gift_packaging = service.gift_packaging.packaging_name_arabic
				else:
					gift_packaging = service.gift_packaging.packaging_name_english

			else:
				gift_packaging =  None

			if service.gift_card_sentence:
				gift_card_sentence = service.gift_card_sentence
			else:
				gift_card_sentence =  None

			if language == 'ar':
				store_name = service.store.store_name_arabic
			else:
				store_name = service.store.store_name_english
			
			if language == 'ar':
				service_name_appo = service.serviceId.arabic_service_name
			else:
				service_name_appo = service.serviceId.english_service_name

			if service.service_status == 0:

				status_info = 'Pending'
			elif service.service_status == 1:
				status_info = 'Accepted'
			else:
				status_info = 'Declined'

				
			alldata={
				'request_id':service.id,
				'service_id':service.serviceId.id,
				'store_name':store_name,
				'store_address': service.store.address,
				'store_address': service.store.address,
				'store_country': service.store.country,
				'service_name': service_name_appo,
				'stone_type':stone_type,
				'size':size,
				'shape':shape,
				'amount':amount,
				'notes':notes,
				'image':image,
				'number_of_stones':number_of_stones,
				'weight_of_stone':weight_of_stone,
				'service_type':service_type,
				'service_model':service_model,
				'gift_box':gift_box,
				'gift_packaging':gift_packaging,
				'gift_card_sentence':gift_card_sentence,
				'service_status':status_info
			}
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class marketingRequest(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if session_token:
				user_obj = User.objects.get(token=session_token)
			else:
				user_obj = 0
			language = request.headers['language']

			product_name = request.data.get('product_name')
			if not product_name:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product name is required'},status=status.HTTP_400_BAD_REQUEST)

			prduct_description = request.data.get('prduct_description')
			if not prduct_description:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product description is required'},status=status.HTTP_400_BAD_REQUEST)

			product_amount = request.data.get('product_amount')
			if not product_amount:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product amount is required'},status=status.HTTP_400_BAD_REQUEST)

			product_price = request.data.get('product_price')
			if not product_price:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Product price is required'},status=status.HTTP_400_BAD_REQUEST)

			owner_name =  request.data.get('owner_name')
			if not owner_name:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Owner name is required'},status=status.HTTP_400_BAD_REQUEST)

			mobile_number = request.data.get('mobile_number')
			if not mobile_number:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Mobile number is required'},status=status.HTTP_400_BAD_REQUEST)

			address = request.data.get('address')
			if not address:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Address is required'},status=status.HTTP_400_BAD_REQUEST)
			email = request.data.get('email')
			if not email:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)

			mark_obj = MarketingRequest.objects.create(product_name=product_name,prduct_description=prduct_description,product_amount=product_amount,product_price=product_price,owner_name=owner_name,mobile_number=mobile_number,address=address,email=email)
			if request.data.get('image'):
					fileUrl=uploadServiceRequest(request.data.get('image'))
					fileUrl=str(settings.BASE_URL)+'/'+fileUrl
					mark_obj.image=str(fileUrl)
					mark_obj.save()
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class getCustomerNotifications(APIView):
	def get(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			notify_obj = CustomerNotifications.objects.filter(customer=customerObj.id).order_by('-id')
			allData=[]
			if language == 'ar':
				for notify in notify_obj:
					alldata = {
						'id':notify.id,
						'message': notify.message_arabic,
						'notification_type' : notify.notification_type,
						'start_date':timesince(notify.start_date)+' ago',
						'is_read':notify.is_read,
					}
					allData.append(alldata)
			else:
				for notify in notify_obj:
					alldata = {
						'id':notify.id,
						'message': notify.message,
						'notification_type' : notify.notification_type,
						'start_date':timesince(notify.start_date)+' ago',
						'is_read':notify.is_read,
					}
					allData.append(alldata)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class clearCustomerNotifications(APIView):
	def get(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			notification_id =self.request.query_params.get('notification_id')
			if notification_id:
				CustomerNotifications.objects.filter(customer=customerObj.id,id=notification_id).delete()
			else:
				notify_obj = CustomerNotifications.objects.filter(customer=customerObj.id)
				for notify in notify_obj:
					notify.delete()
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class readCustomerNotifications(APIView):
	def get(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			notification_id = self.request.query_params.get('notification_id')
			notify_obj = CustomerNotifications.objects.filter(customer=customerObj.id)
			if notification_id:
				CustomerNotifications.objects.filter(customer=customerObj.id,id=notification_id).update(is_read = True)
			else:
				for notify in notify_obj:
					print("----------------sssssss")
					notify.is_read = True
					notify.save()
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class getVipStores(APIView):
	def get(self,request):
		session_token = request.META.get('HTTP_AUTHORIZATION')
		if session_token:
			user_obj = User.objects.get(token=session_token)
		else:
			user_obj = 0
		language = request.headers['language']
		store_obj =  Stores.objects.filter(is_vip='true').first()

		if not store_obj:
			return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No store found'},status=status.HTTP_400_BAD_REQUEST)
		service_obj = storeServices.objects.filter(store = store_obj.id,status=True)
		product_obj = Products.objects.filter(store_id=store_obj.id,status=True)
		allData = []
		serviceData = []
		if language == 'ar':
			store_data = {
				'store_id':store_obj.id,
				'store_name':store_obj.store_name_arabic,
				'store_description':store_obj.store_description_arabic,
				'store_logo':store_obj.store_logo,
				'store_banner':store_obj.store_banner,
				'ratings':store_obj.ratings,
				'is_vip':store_obj.is_vip,
				'store_number':store_obj.store_number

			}
			for service in service_obj:
				servicedata = {
					'service_id' :service.serviceId.id,
					'service_name' : service.serviceId.arabic_service_name,
					'service_icon' : service.serviceId.service_icon,
					'service_content': service.serviceId.arabic_service_content
				}

				serviceData.append(servicedata)

			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				productdata = {
				'is_favourite':favourite,
				'product_id':product.id,
				'product_name' : product.product_name_arabic,
				'maincategory':product.maincategory.category_name_arabic,
				'subcategory':product.subcategory.category_name_arabic,
				'description':product.description_arabic,
				'brand':product.brand.brand_name_arabic,
				# 'model_name':product.model_name,
				# 'size':product.size,
				# 'weight':product.weight,
				# 'color':product.color,
				'ratings':product.rating,
				'price':product.price,
				'price_discount':product.price_discount,
				'images':ast.literal_eval(product.images),
				'store_id':product.store_id,
				'is_vip':product.store.is_vip,
				'offer_discount': product.offer_discount,

				}
				allData.append(productdata)

		else:
			store_data = {
				'store_id':store_obj.id,
				'ratings':store_obj.ratings,
				'store_name':store_obj.store_name_english,
				'store_description':store_obj.store_description_english,
				'store_icon':store_obj.store_logo,
				'store_banner':store_obj.store_banner,
				'is_vip':store_obj.is_vip,
				'store_number':store_obj.store_number

			}

			for service in service_obj:
				servicedata = {
					'service_id' :service.serviceId.id,
					'service_name' : service.serviceId.english_service_name,
					'service_icon' : service.serviceId.service_icon,
					'service_content': service.serviceId.english_service_content
				}
				serviceData.append(servicedata)

			for product in product_obj:
				favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
				if favourite_obj:
					favourite = True
				else:
					favourite = False
				productdata = {
						'is_favourite':favourite,
						'product_id':product.id,
						'product_name' : product.product_name_english,
						'maincategory':product.maincategory.category_name_english,
						'subcategory':product.subcategory.category_name_english,
						'description':product.description_english,
						'brand':product.brand.brand_name_english,
						'ratings':product.rating,
						'price':product.price,
						'price_discount':product.price_discount,
						'images':ast.literal_eval(product.images),
						'store_id':product.store_id,
						'is_vip':product.store.is_vip,
						'offer_discount': product.offer_discount,
					}
				allData.append(productdata)


		return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','product_data':allData,'store_data':store_data,'serviceData':serviceData})

class bestSellerStores(APIView):
	def get(self,request):
		pass

class getTodayDeals(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if session_token:
				user_obj = User.objects.get(token=session_token)
			else:
				user_obj = 0
			language = request.headers['language']
			product_obj = Products.objects.filter(is_offer_applied=1,end_date__isnull = True, status=True,today_deal_start_date = date.today())
			if not product_obj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No product found'},status=status.HTTP_400_BAD_REQUEST)
			allData = [] 
			if language == 'ar':
				for product in product_obj:
					favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
					if favourite_obj:
						favourite = True
					else:
						favourite = False
					alldata = {
						'is_favourite':favourite,
						'product_id':product.id,
						'product_name' : product.product_name_arabic,
						'maincategory':product.maincategory.category_name_arabic,
						'subcategory':product.subcategory.category_name_arabic,
						'description':product.description_arabic,
						'brand':product.brand.brand_name_arabic,
						'price':product.price,
						'ratings':product.rating,
						'price_discount':product.price_discount,
						'images':ast.literal_eval(product.images),
						'store_id':product.store_id,
						'store_name':product.store.store_name_arabic,
						'offer_discount': product.offer_discount,
					}
					allData.append(alldata)
			else:
				for product in product_obj:
					favourite_obj = Favourites.objects.filter(product_id=product.id,user=user_obj).first()
					if favourite_obj:
						favourite = True
					else:
						favourite = False
					alldata = {
						'is_favourite':favourite,
						'product_id':product.id,
						'product_name' : product.product_name_english,
						'maincategory':product.maincategory.category_name_english,
						'subcategory':product.subcategory.category_name_english,
						'description':product.description_english,
						'brand':product.brand.brand_name_english,
						'price':product.price,
						'ratings':product.rating,
						'price_discount':product.price_discount,
						'images':ast.literal_eval(product.images),
						'store_id':product.store_id,
						'is_vip':product.store.is_vip,
						'store_name':product.store.store_name_english,
						'offer_discount': product.offer_discount,
					}
					allData.append(alldata)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class sendRatingReview(APIView):
	def post(self,request):
		try:
			language = request.headers['language']
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.body
			print('data---',data)
			data_array = request.data['rating_review_data']	
			print('data_array',data_array)		
			for data in data_array:
				rating = data['rating']
				review = data['review']
				store_id = data['store_id']
				product_id = data['product_id']
				order_id = data['order_id']
				print('order_id',order_id)
				orderPack.objects.filter(orderId=order_id).update(is_rated=True)
				product_obj_id =  Products.objects.filter(id=product_id).first()
				store_obj_id = Stores.objects.filter(id=store_id).first()
				RatingReviews.objects.create(rating=int(rating),review=review,product=product_obj_id,buyer=customerObj,store=store_obj_id)
				total = 0
				sum_obj = RatingReviews.objects.filter(product=product_id)
				count = RatingReviews.objects.filter(product=product_id).count()
				for s in sum_obj:
					total += int(s.rating)
				final_rating = round(total/count)
				Products.objects.filter(id=product_id).update(rating=int(final_rating))
				Stores.objects.filter(id=store_id).update(ratings=int(final_rating))
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'Rating send successfully'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

# Chat functionality for User.


class getChatRoomList(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.data

			rooms = chat_room.objects.filter(user=user_obj).order_by("-last_message_time")
			allData = []
			for room in rooms:
				chatuser = room.store
				StoreObj = Stores.objects.filter(user_id=chatuser.id).first()
				allData.append({"id": chatuser.id,"store_id":StoreObj.id, "name": StoreObj.store_name_english, "picture": StoreObj.store_logo,"last_message_text":room.last_message_text,"last_message_time":room.last_message_time,'is_read':room.is_read})
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'success','data':allData})
			
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class readMessage(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			rooms = chat_room.objects.filter(user=user_obj).order_by("-last_message_time").first()
			rooms.is_read = 0
			rooms.save()
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'success'})

		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class getMessagesList(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.query_params
			store_id = data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store_id is required'},status=status.HTTP_400_BAD_REQUEST)
			storeObj = Stores.objects.get(id=store_id)
			chatuser = User.objects.get(id=storeObj.user_id)
			messages = Message.objects.filter(sender_user=user_obj, receiver_user=chatuser).order_by("-created_at") | Message.objects.filter(sender_user=chatuser, receiver_user=user_obj).order_by("-created_at")
			allData = []
			for message in messages:
				if message.sender_user == user_obj:
					sender = True
				else:
					sender = False
				if message.type == "text":
					allData.append({"message": message.message, "sender":sender,"date": message.created_at,"type": message.type,})
				else:
					allData.append({"message": message.image, "sender":sender,"date": message.created_at,"type": message.type})
				
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class addMessage(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.data
			store_id = data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store_id is required'},status=status.HTTP_400_BAD_REQUEST)
			message = data.get("message")
			if not message:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'message is required'},status=status.HTTP_400_BAD_REQUEST)
			storeObj = Stores.objects.get(id=store_id)
			chatuser = User.objects.get(id=storeObj.user_id)
			# message_type = data.get("message_type")
			image = data.get("image")
			# if not message_type:
			# 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'message_type is required'},status=status.HTTP_400_BAD_REQUEST)
			# if message_type == "text":
			chatRoom = chat_room.objects.filter(user=user_obj, store=chatuser)
			if not chatRoom:
				chat_room.objects.create(user=user_obj, store=chatuser)
			if not image:
				Message.objects.create(sender_user=user_obj, receiver_user=chatuser, message=message, type="text")
				cr = chat_room.objects.get(user=user_obj, store=chatuser)
				cr.last_message_text = message
				cr.last_message_time = datetime.now()
				cr.save()
			else:
				fileUrl=uploadThemessagepicture(image)
				fileUrl=str(settings.BASE_URL)+'/'+fileUrl
				image_url=str(fileUrl)
				Message.objects.create(sender_user=user_obj, receiver_user=chatuser, image=image_url, type="image")
				cr = chat_room.objects.get(user=user_obj, store=chatuser)
				cr.last_message_text = None
				cr.last_message_time = datetime.now()
				cr.save()
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'success'})
			
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
		

class startChatroom(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.data
			store_id = data.get('store_id')
			if not store_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Store_id is required'},status=status.HTTP_400_BAD_REQUEST)
			store_id = User.objects.get(id=store_id)
			chat_room.objects.get_or_create(user=user_obj, store=store_id)
			return Response ({'status_code':status.HTTP_200_OK,'status_message':'success'})

		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
		

class contactUsAdmin(APIView):
	def post(self,request):
		full_name = request.data.get('full_name')
		email = request.data.get('email')
		message = request.data.get('message')
		if not email: return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Full name is required'},status=status.HTTP_400_BAD_REQUEST)
		if not full_name: return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)
		if not message: return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Message is required'},status=status.HTTP_400_BAD_REQUEST)
		html_message = render_to_string('contact_us.html', {'full_name': full_name,'email':email,'message':message})
		subject = 'Contact Us'
		plain_message = html_message
		from_email = settings.EMAIL_HOST_USER
		to = 'admin123@yopmail.com'
		mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
		return Response ({'status_code':status.HTTP_200_OK,'status_message':'success'})


class getCouponList(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.query_params
			language = request.headers['language']
			current_date = timezone.now()
			couponList = StoreCoupons.objects.filter(coupon_end_date__gt=current_date)
			cartObj = Cart.objects.filter(customer=customerObj.user_id,isPaid=False)
			isApplicable = ''
			allData = []
			if language == 'ar':
				for allcoupon in couponList:
					if allcoupon.product:
						for carts in cartObj:
							if carts.product.id == allcoupon.product.id:
								isApplicable = True
								break
							else:
								isApplicable = False
					if allcoupon.coupon_on == 'Product':
						for carts in cartObj:
							if carts.product.store.id == allcoupon.store_id.id:
								isApplicable = True 
								break
							else:
								isApplicable = False
					if allcoupon.category_product:
						for carts in cartObj:
							if carts.product.maincategory.id == allcoupon.category_product.id:
								isApplicable = True
								break
							else:
								isApplicable = False

					allCoupon = {
						"coupon_id":allcoupon.id,
						"coupon_name":allcoupon.coupon_name_arabic,
						"coupon_type":allcoupon.coupon_type,
						"coupon_discount":allcoupon.coupon_discount,
						"coupon_on":allcoupon.coupon_on,
						# "service":allcoupon.service.id,
						# "category_product":allcoupon.category_product,
						"coupon_description":"this coupon is a demo for testing our coupon section please wait until we finish our work",
						"coupon_start_date":allcoupon.coupon_start_date,
						"coupon_end_date":allcoupon.coupon_end_date,
						"store_id":allcoupon.store_id.id,
						"is_applicable" :isApplicable,
					}
					allData.append(allCoupon)				
			else:
				for allcoupon in couponList:
					if allcoupon.product:
						for carts in cartObj:
							if carts.product.id == allcoupon.product.id:
								isApplicable = True
								break
							else:
								isApplicable = False
					if allcoupon.coupon_on == 'Product':
						for carts in cartObj:
							if carts.product.store.id == allcoupon.store_id.id:
								isApplicable = True 
								break
							else:
								isApplicable = False
					if allcoupon.category_product:
						for carts in cartObj:
							if carts.product.maincategory.id == allcoupon.category_product.id:
								isApplicable = True
								break
							else:
								isApplicable = False

					# allcoupon.save()
					allCoupon = {
						"coupon_id":allcoupon.id,
						"coupon_name":allcoupon.coupon_name_english,
						"coupon_type":allcoupon.coupon_type,
						"coupon_discount":allcoupon.coupon_discount,
						"coupon_on":allcoupon.coupon_on,
						# "service":allcoupon.service.id,
						# "category_product":allcoupon.category_product,
						"coupon_description":"this coupon is a demo for testing our coupon section please wait until we finish our work",
						"coupon_start_date":allcoupon.coupon_start_date,
						"coupon_end_date":allcoupon.coupon_end_date,
						"store_id":allcoupon.store_id.id,
						"is_applicable" :isApplicable,
					}
					allData.append(allCoupon)
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class applyCoupon(APIView):
	def post(self, request, *args, **kwargs):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.data
			coupon_id = data.get('id')
			if not coupon_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'coupon id is required'},status=status.HTTP_400_BAD_REQUEST)
			allData=[]
			couponObject=StoreCoupons.objects.filter(id=coupon_id).first()
			if not couponObject:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid coupon id'},status=status.HTTP_400_BAD_REQUEST)
			cartObj = Cart.objects.filter(customer=customerObj.user_id,isPaid=False)
			discountedAmount = 0
			tempAmount = 0
			total_ammount = 0
			for cart in cartObj:
				if couponObject.product:
					if cart.product.id == couponObject.product.id:
						print('second')
						if couponObject.coupon_type=='Percentage':
							percent=float(couponObject.coupon_discount)/100
							discountedAmount=float(cart.totalAmount)*float(percent)
							tempAmount=float(cart.totalAmount)-float(discountedAmount)
							allData.append({'amountBeforeCoupon':str(cart.totalAmount),
											'amountAfterCoupon':str(tempAmount),
											'discountType':couponObject.coupon_type,
											'discount':str(discountedAmount),})
						else:
							tempAmount=float(cart.totalAmount)-float(couponObject.coupon_discount)
							discountedAmount=couponObject.coupon_discount
							allData.append({'amountBeforeCoupon':str(cart.totalAmount),
											'amountAfterCoupon':str(tempAmount),
											'discountType':couponObject.coupon_type,
											'discount':str(discountedAmount),})
				if couponObject.coupon_on:
					if cart.product.store.id == couponObject.store_id.id:
						if couponObject.coupon_type=='Percentage':

							percent=float(couponObject.coupon_discount)/100
							total_ammount += float(cart.totalAmount)
							discountedAmount = total_ammount*float(percent)
							tempAmount = total_ammount-float(discountedAmount)
							allData = [({'amountBeforeCoupon':str(total_ammount),
											'amountAfterCoupon':str(tempAmount),
											'discountType':couponObject.coupon_type,
											'discount':str(discountedAmount),})]
						else:
							total_ammount +=  float(cart.totalAmount)
							tempAmount = total_ammount-float(couponObject.coupon_discount)
							discountedAmount=couponObject.coupon_discount
							allData = [({'amountBeforeCoupon':str(total_ammount),
											'amountAfterCoupon':str(tempAmount),
											'discountType':couponObject.coupon_type,
											'discount':str(discountedAmount),})]


			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class removeCoupon(APIView):
	def post(self, request, *args, **kwargs):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.data
			coupon_id = data.get('id')
			if not coupon_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'coupon id is required'},status=status.HTTP_400_BAD_REQUEST)
			cartPackObj = cartPackage.objects.filter(customer=customerObj).first()
			if cartPackObj:
				if cartPackObj.isCouponSelected:
					cartPackObj.isCouponSelected = False
			cartPackObj.save()
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class getInvoicePdf(APIView):
	def get(self,request):
		try:
			id = request.query_params['pack_id']
			if not id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Order Pack Id is required'},status=status.HTTP_400_BAD_REQUEST)
			invoice = orderPack.objects.filter(id=id).first()
			customer_obj = Buyer.objects.filter(id=invoice.customer_id).first()
			orders_obj = Cart.objects.filter(orderId = invoice.orderId,isPaid = True)
			trans_id = CustomerTransaction.objects.filter(orderPack_id = invoice.id ).first()
			data = {'invoice':invoice,'customer_obj':customer_obj,'orders_obj':orders_obj,'trans_id':trans_id}
			template = get_template('getinvoice.html')
			html = template.render({'invoice':invoice,'customer_obj':customer_obj,'orders_obj':orders_obj,'trans_id':trans_id})
			response = HttpResponse(content_type='application/pdf')
			response['Content-Disposition'] = 'attachment; filename="file.pdf"'
			weasyprint.HTML(string=html).write_pdf(response,stylesheets=[weasyprint.CSS('static/store/css/invoice.css')])
			return response
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class buyerWalletTranscation(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'})
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			wallet_obj = Wallet.objects.filter(buyer=customerObj.id)
			all_Data = []
			for wallet in wallet_obj:
				alldata = {
					'id': wallet.id,
					'amount': wallet.amount,
					'reason' : wallet.reason,
					'type': wallet.type,
					'transcation_type': wallet.transcation_type,
					'start_date': wallet.start_date,
				}	


				all_Data.append(alldata)
			wallet_amount = customerObj.wallet_amount
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_Data,'wallet_amount':wallet_amount})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class getInvoiceServicePdf(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'})
			
			service_id =  request.query_params['service_id']
			if not service_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Service Id is required'},status=status.HTTP_400_BAD_REQUEST)
			service_obj = ServiceInvoice.objects.filter(service_request_id=service_id).first()
			all_data = {
				'service_id':service_obj.service_request_id.id,
				'invoice_url':service_obj.invoice_pdf_url,
				'invoice_number':service_obj.invoice_number,
				'total_before_vat':service_obj.total_before_vat,
				'vat_amount':service_obj.vat_amount,
				'total_amount':service_obj.total_amount,
				'is_paid':service_obj.is_paid,
			}
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class invoiceServiceCheckout(APIView):
	def post(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'})
			
			invoice_id =  request.data.get('invoice_id')
			if not invoice_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'invoice_id is required'},status=status.HTTP_400_BAD_REQUEST)
			service_obj = ServiceInvoice.objects.filter(service_request_id=invoice_id).first()
			discountedAmount = 0.00
			coupon = ''
			coupon_id = request.data.get('coupon_id')
			if coupon_id:
				functionResponse=servicecouponapply(coupon_id,invoice_id)
				if functionResponse['status_code']==200:
					discountOnItem=functionResponse['data'][0]['discount']
					coupon_id=functionResponse['data'][0]['coupon_id']
					
					discountedAmount=float(discountOnItem)
				else:
					return Response(functionResponse)

				total_amount = float(service_obj.total_amount) - discountedAmount
				isCouponSelected = True
				coupon = coupon_id
			else:
				total_amount  = service_obj.total_amount
				isCouponSelected = False
			all_data = {
				'service_id':service_obj.service_request_id.id,
				'invoice_url':service_obj.invoice_pdf_url,
				'invoice_number':service_obj.invoice_number,
				'total_before_vat':service_obj.total_before_vat,
				'vat_amount':service_obj.vat_amount,
				'total_amount':total_amount,
				'isCouponSelected' : isCouponSelected,
				'coupounDiscount' : discountedAmount,
				'couponId':coupon,
				'is_paid':service_obj.is_paid,
			}
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class getCouponListForService(APIView):
	def get(self,request):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.query_params
			language = request.headers['language']
			couponList = StoreCoupons.objects.all()
			invoiceObj = ServiceInvoice.objects.filter(service_request_id__customer=customerObj,is_paid=False)
			print('invoiceObj',invoiceObj)
			isApplicable = False
			allData = []
			if language == 'ar':
				for allcoupon in couponList:
					if allcoupon.service:
						for invoice in invoiceObj:
							if invoice.service_request_id.serviceId.id == allcoupon.service.id:
								isApplicable = True
								break
							else:
								isApplicable = False
					if allcoupon.coupon_on == 'Service':
						for invoice in invoiceObj:
							if invoice.store.id == allcoupon.store_id.id:
								isApplicable = True 
								break
							else:
								isApplicable = False

					allCoupon = {
						"coupon_id":allcoupon.id,
						"coupon_name":allcoupon.coupon_name_arabic,
						"coupon_type":allcoupon.coupon_type,
						"coupon_discount":allcoupon.coupon_discount,
						"coupon_on":allcoupon.coupon_on,
						# "service":allcoupon.service.id,
						# "category_product":allcoupon.category_product,
						"coupon_description":"this coupon is a demo for testing our coupon section please wait until we finish our work",
						"coupon_start_date":allcoupon.coupon_start_date,
						"coupon_end_date":allcoupon.coupon_end_date,
						"store_id":allcoupon.store_id.id,
						"is_applicable" :isApplicable,
					}
					allData.append(allCoupon)				
			else:
				for allcoupon in couponList:
					if allcoupon.service:
						for invoice in invoiceObj:
							if invoice.service_request_id.serviceId.id == allcoupon.service.id:
								isApplicable = True
								break
							else:
								isApplicable = False
					if allcoupon.coupon_on == 'Service':
						for invoice in invoiceObj:
							if invoice.store.id == allcoupon.store_id.id:
								isApplicable = True 
								break
							else:
								isApplicable = False

					# allcoupon.save()
					allCoupon = {
						"coupon_id":allcoupon.id,
						"coupon_name":allcoupon.coupon_name_english,
						"coupon_type":allcoupon.coupon_type,
						"coupon_discount":allcoupon.coupon_discount,
						"coupon_on":allcoupon.coupon_on,
						# "service":allcoupon.service.id,
						# "category_product":allcoupon.category_product,
						"coupon_description":"this coupon is a demo for testing our coupon section please wait until we finish our work",
						"coupon_start_date":allcoupon.coupon_start_date,
						"coupon_end_date":allcoupon.coupon_end_date,
						"store_id":allcoupon.store_id.id,
						"is_applicable" :isApplicable,
					}
					allData.append(allCoupon)
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class applyServiceCoupon(APIView):
	def post(self, request, *args, **kwargs):
		try:
			session_token = request.META.get('HTTP_AUTHORIZATION')
			if not session_token:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'session token is required'},status=status.HTTP_400_BAD_REQUEST)
			try:
				user_obj =  User.objects.get(token=session_token)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message':'Invalid session token'},status=status.HTTP_401_UNAUTHORIZED)
			customerObj = Buyer.objects.filter(user_id=user_obj.id).first()
			if not customerObj:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
			data = request.data
			coupon_id = data.get('coupon_id')
			if not coupon_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'coupon id is required'},status=status.HTTP_400_BAD_REQUEST)
			invoice_id = data.get('invoice_id')
			if not invoice_id:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'invoice_id is required'},status=status.HTTP_400_BAD_REQUEST)
			allData=[]
			couponObject=StoreCoupons.objects.filter(id=coupon_id).first()
			if not couponObject:
				return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid coupon id'},status=status.HTTP_400_BAD_REQUEST)
			invoiceObj = ServiceInvoice.objects.filter(service_request_id=invoice_id).first()
			if couponObject.product:
				if invoiceObj.service_request_id.serviceId.id == couponObject.service.id:
					if couponObject.coupon_type=='Percentage':
						percent=float(couponObject.coupon_discount)/100
						discountedAmount=float(invoiceObj.total_amount)*float(percent)
						tempAmount=float(invoiceObj.total_amount)-float(discountedAmount)
						allData.append({'amountBeforeCoupon':str(invoiceObj.total_amount),
										'amountAfterCoupon':str(tempAmount),
										'discountType':couponObject.coupon_type,
										'discount':str(discountedAmount),})
					else:
						tempAmount=float(invoiceObj.total_amount)-float(couponObject.coupon_discount)
						discountedAmount=couponObject.coupon_discount
						allData.append({'amountBeforeCoupon':str(invoiceObj.total_amount),
										'amountAfterCoupon':str(tempAmount),
										'discountType':couponObject.coupon_type,
										'discount':str(discountedAmount),})
			if couponObject.coupon_on == 'Service':
				if invoiceObj.store.id == couponObject.store_id.id:
					if couponObject.coupon_type=='Percentage':
						percent=float(couponObject.coupon_discount)/100
						discountedAmount=float(invoiceObj.total_amount)*float(percent)
						tempAmount=float(invoiceObj.total_amount)-float(discountedAmount)
						allData.append({'amountBeforeCoupon':str(invoiceObj.total_amount),
										'amountAfterCoupon':str(tempAmount),
										'discountType':couponObject.coupon_type,
										'discount':str(discountedAmount),})
					else:
						tempAmount=float(invoiceObj.total_amount)-float(couponObject.coupon_discount)
						discountedAmount=couponObject.coupon_discount
						allData.append({'amountBeforeCoupon':str(invoiceObj.total_amount),
										'amountAfterCoupon':str(tempAmount),
										'discountType':couponObject.coupon_type,
										'discount':str(discountedAmount),})

			return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData})
		except Exception as e:
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



