from appservices.common.util import *
from appservices.common.form_schemas import *




products = Blueprint("products",__name__)


def fetching_product_details(products_queryset):
	product_dict = {}
	try:
		product_dict={
		"id":str(products_queryset.id),
		"productName":products_queryset.productName,
		"sku":products_queryset.sku,
		"price":products_queryset.price,
		"startingPrice":products_queryset.startingPrice,
		"endingPrice":products_queryset.endingPrice,
		"description":products_queryset.description,
		# "payinPaymentGatewayId":str(products_queryset.payinPaymentGatewayId),
		# "payinapiName":products_queryset.payinPaymentGatewayId.apiName
		}
		try:
			if products_queryset.payinPaymentGatewayId:
				product_dict["payinPaymentGatewayId"]=str(products_queryset.payinPaymentGatewayId.id)
				product_dict["apiName"]=products_queryset.payinPaymentGatewayId.apiName
			else:
				product_dict["payinPaymentGatewayId"]=""
				product_dict["apiName"]=""
		except Exception as e:
			product_dict["payinPaymentGatewayId"]=""
			product_dict["apiName"]=""
		
		try:
			if products_queryset.payinPaymentGatewayId:
				product_dict["priceType"]=products_queryset.payinPaymentGatewayId.priceType
			else:
				product_dict["priceType"]=""
		except Exception as e:
			product_dict["priceType"]=""
		

		if products_queryset.status==1:
			product_dict["actionText"] = "Active"
		else:
			product_dict["actionText"] = "Deactive"

		if products_queryset.createdOn:
			product_dict["createdOn"] = products_queryset.createdOn.strftime("%m-%d-%Y")
		else:
			product_dict["createdOn"] = ""

	except Exception as e:
		app.logger.error(traceback.format_exc())
	return product_dict


# @products.route("/get_products_list",methods=["POST","GET"])
# @adminid_access_token_required
# def get_products_list():
#     if not session.get("adminId"):
#         return redirect("admin_login")
#     productsList = []
#     payinList = []
#     pagination =  ""
#     search_element=""
#     snoCount=0
#     productPage=None
#     adminId = session.get("adminId")
#     permissionsList = check_permissions(session.get("adminId"),"productsPermissions")
#     if "view" in permissionsList:
#         try:
#             redirectTo = request.args.get("redirectTo","product")
#             if redirectTo:
#                 redirectval = redirectTo
#             else:
#                 redirectval = "product"
#             search_element = request.args.get("search_element","")

#             products_queryset = Products.objects(status__in=[0,1]).order_by("-id")
#             if search_element:
#                 products_queryset = products_queryset.filter(Q(productName__icontains=search_element))
#             page = request.args.get(get_page_parameter(), type=int, default=1)
#             per_page = 20  
#             total_count = products_queryset.count()
#             start = (page - 1) * per_page
#             end = min(start + per_page, total_count)
#             total_products = products_queryset[start:end]
			
#             snoCount = start
#             for each_product in total_products:
#                 snoCount +=1
#                 product_dict = fetching_product_details(each_product)
#                 product_dict["snoCount"]=snoCount
#                 productsList.append(product_dict)

#             pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="product")

#             payin_queryset = TransactionAPI.objects(transactionType="PaymentGateway", status=1).order_by('-id')
#             for each_payin in payin_queryset:
#                 payinDict = fetching_transaction_api_details(each_payin)
#                 payinList.append(payinDict)

#             return render_template("super_admin_templates/products_list.html",
#                 pagination=pagination,
#                 productsList=productsList,
#                 payinList=payinList,
#                 redirectval=redirectval,
#                 search_element=search_element
#                 )
#         except Exception as e:
#             app.logger.error(traceback.format_exc())
#             error = "Unable to fetch products details!!"
#             return render_template("super_admin_templates/products_list.html", 
#                 error=error,
#                 pagination=pagination,
#                 productsList=productsList,
#                 payinList=payinList,
#                 search_element=search_element
#                 )
#     else:
#         flash("Staff member does not have given view products permissions!!")
#         return redirect(url_for("admin.dashboard"))


@products.route("/get_products_list",methods=["POST","GET"])
@adminid_access_token_required
def get_products_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	productsList = []
	payinList = []
	pagination =  ""
	search_element=""
	redirectval=""
	snoCount=0
	productPage=1
	adminId = session.get("adminId")
	form = SearchProduct(request.args)
	permissionsList = check_permissions(session.get("adminId"),"productsPermissions")
	if "view" in permissionsList:
		try:
			redirectTo = request.args.get("redirectTo","product")
			if redirectTo:
				redirectval = redirectTo
			else:
				redirectval = "product"
			search_element = request.args.get("search_element","")

			if form.validate():  
				
				productPage = request.args.get(get_page_parameter("productPage"), type=int, default=1)

				per_page = 20
				start = (productPage - 1) * per_page

				total_count=0
				filters = Q(status__in=[0, 1])
				if search_element and search_element.strip():
					filters &= Q(productName__icontains=search_element.strip())

				total_count = Products.objects(filters).count()

				products_queryset = ( 
					Products.objects(filters)
					.only("id","productName","payinPaymentGatewayId","sku","price","startingPrice","endingPrice","description","status")
					.order_by("-id")
					.skip(start)
					.limit(per_page)
				)

				snoCount = start

				productsList = list(products_queryset)

				payin_queryset = TransactionAPI.objects(transactionType="PaymentGateway", status=1).only("id","apiName","priceType").order_by('-id')

				payinList= list(payin_queryset)

				pagination = Pagination(productPage=productPage, total=total_count, per_page=per_page, page_parameter ="productPage", alignment="right", record_name="product")

			return render_template("super_admin_templates/products_list.html",
				pagination=pagination,
				productsList=productsList,
				payinList=payinList,
				redirectval=redirectval,
				search_element=search_element,
				snoCount = snoCount,
				form = form,
				productPage = productPage
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch products details!!"
			return render_template("super_admin_templates/products_list.html", 
				error=error,
				pagination=pagination,
				productsList=productsList,
				payinList=payinList,
				redirectval=redirectval,
				search_element=search_element,
				snoCount = snoCount,
				form = form,
				productPage=productPage
				)
	else:
		flash("The staff member does not have permission to view products.", "danger")
		return redirect(url_for("admin.dashboard"))



@products.route("/create_product",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def create_product():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")
		
		csrf_token = request.form.get("csrf_token")
		print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
		latitude = request.form.get("latitude", "")
		longitude = request.form.get("longitude", "")
		loginBrowser = request.headers.get("Sec-Ch-Ua")
		if loginBrowser:
			loginBrowseData = loginBrowser.split(";")
			browser = loginBrowseData[0]
		else:
			loginBrowseData = request.headers.get('User-Agent').split(";")
			browser = loginBrowseData[0]
		client_ip=0
		
		# Extracting client IP address
		if request.headers.getlist("X-Forwarded-For"): 
			client_ip = request.headers.getlist("X-Forwarded-For")[0]
		else:
			client_ip = request.remote_addr

		actionDate=datetime.datetime.now()
		
		permissionsList = check_permissions(adminId,"productsPermissions")
		if "add" in permissionsList:
			if request.method == "GET":
				return render_template("super_admin_templates/products_list.html")

			if request.method == "POST":
				productName = request.form.get("productName","")
				sku = request.form.get("sku","")
				price = request.form.get("price")
				startingPrice = request.form.get("startingPrice",0)
				endingPrice = request.form.get("endingPrice",0)
				description = request.form.get("description","")
				payinPaymentGatewayId = request.form.get("payinPaymentGatewayId", "")

				# if productName and not is_valid_alphanumeric(productName):
				#     flash("Product Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/")
				#     return redirect(url_for("products.get_products_list"))

				# if sku and not is_valid_alphanumeric(sku):
				#     flash("sku must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/")
				#     return redirect(url_for("products.get_products_list"))

				# if startingPrice and not is_valid_numeric(startingPrice):
				#     flash("Starting Price must contain only numeric characters!")
				#     return redirect(url_for("products.get_products_list"))

				# if endingPrice and  not is_valid_numeric(endingPrice):
				#     flash("Ending Price must contain only numeric characters!")
				#     return redirect(url_for("products.get_products_list"))

				# if description and not is_valid_description(description):
				#     flash("Description can contain all characters.")
				#     return redirect(url_for("products.get_products_list"))
				
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				
				print("(price)",price)

				form = CreateProductForm()

				if form.validate_on_submit():
					if productName and sku and startingPrice and endingPrice and payinPaymentGatewayId:
						try:
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName+" "+productName+" Products created successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"create_product","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
							if price:
								price = price
							else:
								price = float(0.0)
							product_table = Products(
								productName = productName,
								sku = sku,
								price = price,
								startingPrice = startingPrice,
								endingPrice = endingPrice,
								description = description,
								payinPaymentGatewayId = payinPaymentGatewayId,
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = product_table.save()
							productId = str(save_table.id)

							flash("Products created successfully!")
							data_status['responseStatus']=1
							return data_status
						except Exception as e:
							flash("Unable to create product details!!")
							app.logger.error(traceback.format_exc())
							return redirect(url_for("products.get_products_list",redirectTo="product"))
					else:
						data_status['responseStatus']=2
						data_status['result']="Required fields are missing!!"
						return data_status
				else:
					data_status['result']=form.errors
					return data_status

				# if productName and sku and startingPrice and endingPrice and payinPaymentGatewayId:
				#     try:
				#         admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
				#         if admin_queryset:
				#             message=admin_queryset.userName+" "+productName+" Products created successfully!"
				#             save_admin_log_table = save_admin_logs_data(adminId,None,None,"create_product","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
				#         if price:
				#             price = price
				#         else:
				#             price = float(0.0)
				#         product_table = Products(
				#             productName = productName,
				#             sku = sku,
				#             price = price,
				#             startingPrice = startingPrice,
				#             endingPrice = endingPrice,
				#             description = description,
				#             payinPaymentGatewayId = payinPaymentGatewayId,
				#             createdOn = datetime.datetime.now(),
				#             status = 1,
				#             )
				#         save_table = product_table.save()
				#         productId = str(save_table.id)

				#         flash("Products created successfully!")
				#         return redirect(url_for("products.get_products_list",redirectTo="product"))
				#     except Exception as e:
				#         flash("Unable to create product details!!")
				#         app.logger.error(traceback.format_exc())
				#         return redirect(url_for("products.get_products_list",redirectTo="product"))
			else:
				return redirect(url_for("products.get_products_list",redirectTo="product"))
		else:
			flash("The staff member does not have permission to create a product.", "danger")
			data_status['responseStatus']=4
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to create product details!!"
		flash(error)
		data_status['responseStatus']=4
		return data_status


# Update product
@products.route("/update_products",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_products():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId=session.get("adminId")
		
		csrf_token = request.form.get("csrf_token")
		print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
		latitude = request.form.get("latitude", "")
		longitude = request.form.get("longitude", "")
		loginBrowser = request.headers.get("Sec-Ch-Ua")
		if loginBrowser:
			loginBrowseData = loginBrowser.split(";")
			browser = loginBrowseData[0]
		else:
			loginBrowseData = request.headers.get('User-Agent').split(";")
			browser = loginBrowseData[0]

		existing_record = ""
		client_ip=0
		# Extracting client IP address
		if request.headers.getlist("X-Forwarded-For"): 
			client_ip = request.headers.getlist("X-Forwarded-For")[0]
		else:
			client_ip = request.remote_addr

		actionDate=datetime.datetime.now()
		
		permissionsList = check_permissions(session.get("adminId"),"productsPermissions")
		if "edit" in permissionsList:
			productId = request.args.get("productId","")
			if request.method == "POST":
				productName = request.form.get("productName","")
				sku = request.form.get("sku","")
				price = request.form.get("price",0)
				startingPrice = request.form.get("startingPrice",0)
				endingPrice = request.form.get("endingPrice",0)
				description = request.form.get("description","")
				
				jsonData = request.form.to_dict(flat=True)

				form = CreateProductForm(request.form,current_id=productId)
				
				# if productName and  not is_valid_alphanumeric(productName):
				#     flash("Product Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/")
				#     return redirect(url_for("products.get_products_list"))

				# if sku and not is_valid_alphanumeric(sku):
				#     flash("sku must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/")
				#     return redirect(url_for("products.get_products_list"))

				# if startingPrice and not is_valid_numeric(startingPrice):
				#     flash("Starting Price must contain only numeric characters!")
				#     return redirect(url_for("products.get_products_list"))

				# if endingPrice and not is_valid_numeric(endingPrice):
				#     flash("Ending Price must contain only numeric characters!")
				#     return redirect(url_for("products.get_products_list"))

				# if description and not is_valid_description(description):
				#     flash("Description can contain all characters.")
				#     return redirect(url_for("products.get_products_list"))
				if form.validate_on_submit():
					if productName:
						try:
							payinPaymentGatewayId = request.form.get("payinPaymentGatewayId","")
							print(price,"(((((((((((price)))))))))))")
							# if priceType != "common":
							#     price = 0
							product_queryset = Products.objects(id=productId,status__nin=[2]).first()
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							existing_record = product_queryset.to_json()
							message=admin_queryset.userName+" "+productName+" Products updated successfully!"
							requestData=[product_queryset]
							updatedrequestData=[jsonData]
							save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_products","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
							if product_queryset:
								product_queryset.update(
									productName = productName,
									sku = sku,
									price = float(price) if price else 0.0,
									startingPrice = float(startingPrice) if startingPrice else 0.0,
									endingPrice = float(endingPrice) if endingPrice else 0.0,
									description = description,
									)
								if payinPaymentGatewayId:
									product_queryset.update(payinPaymentGatewayId = ObjectId(payinPaymentGatewayId))
									flash(" Products updated successfully!")
									data_status["responseStatus"]=1
									return data_status
							else:
								flash("Invaild id!!")
								data_status["responseStatus"]=4
								return data_status
						except Exception as e:
							flash("Unable to update Products!!")
							app.logger.error(traceback.format_exc())
							data_status['responseStatus']=4
							return data_status
					else:
						data_status["responseStatus"]=2
						data_status["result"]="Required fields are missing."
						return data_status
				else:
					data_status['result']=form.errors
					return data_status

				# if productName:
				#     try:
				#         payinPaymentGatewayId = request.form.get("payinPaymentGatewayId","")
				#         print(price,"(((((((((((price)))))))))))")
				#         # if priceType != "common":
				#         #     price = 0
				#         product_queryset = Products.objects(id=productId,status__nin=[2]).first()
				#         admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
				#         existing_record = product_queryset.to_json()
				#         message=admin_queryset.userName+" "+productName+" Products updated successfully!"
				#         requestData=[product_queryset]
				#         updatedrequestData=[jsonData]
				#         save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_products","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
				#         if product_queryset:
				#             product_queryset.update(
				#                 productName = productName,
				#                 sku = sku,
				#                 price = float(price),
				#                 startingPrice = float(startingPrice),
				#                 endingPrice = float(endingPrice),
				#                 description = description,
				#                 )
				#             if payinPaymentGatewayId:
				#                 product_queryset.update(payinPaymentGatewayId = ObjectId(payinPaymentGatewayId))
				#             flash(" Products updated successfully!")
				#             return redirect(url_for("products.get_products_list",redirectTo="product"))
				#         else:
				#             flash("Invaild id!!")
				#             return redirect(url_for("products.get_products_list",redirectTo="product"))
				#     except Exception as e:
				#         app.logger.error(traceback.format_exc())
				#         error = "Unable to update Products!!"
				#         return redirect(url_for("products.get_products_list",redirectTo="product"))
			else:
				return redirect(url_for("products.get_products_list",redirectTo="product"))
		else:
			flash("The staff member does not have permission to update product.", "danger")
			data_status['responseStatus']=4
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to update Products!!")
		data_status['responseStatus']=4
		return data_status


# Update Products status
@products.route("/update_product_status",methods=["POST","GET"])
@adminid_access_token_required
def update_product_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	latitude = request.args.get("latitude", "")
	longitude = request.args.get("longitude", "")
	loginBrowser = request.headers.get("Sec-Ch-Ua")
	if loginBrowser:
		loginBrowseData = loginBrowser.split(";")
		browser = loginBrowseData[0]
	else:
		loginBrowseData = request.headers.get("User-Agent").split(";")
		browser = loginBrowseData[0]

	client_ip=0
	# Extracting client IP address
	if request.headers.getlist("X-Forwarded-For"): 
		client_ip = request.headers.getlist("X-Forwarded-For")[0]
	else:
		client_ip = request.remote_addr

	actionDate=datetime.datetime.now()

	jsonData = request.form.to_dict(flat=True)

	existing_record = ""
	updatedrequestData = [jsonData]

	productPage = request.args.get("productPage")
	search_element = request.args.get("search_element", "").strip()
	
	permissionsList = check_permissions(session.get("adminId"),"productsPermissions")
	if "edit" in permissionsList:
		productId = request.args.get("productId","")
		if productId:
			try:
				message=""
				product_queryset = Products.objects(id=productId,status__nin=[2]).first()
				existing_record = product_queryset.to_json()
				requestData = [existing_record]
				if product_queryset:
					admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
					if product_queryset.status == 0:
						product_queryset.update(status=1)
						flash("Product activated successfully!")
						message=admin_queryset.userName+" "+product_queryset.productName+" Product activated successfully!"
					elif product_queryset.status == 1:
						product_queryset.update(status=0)
						flash("Product deactivated successfully!")
						message=admin_queryset.userName+" "+product_queryset.productName+" Product deactivated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_product_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(url_for("products.get_products_list",search_element=search_element,productPage=productPage))
				else:
					flash("Invaild Product id!!")
					return redirect(url_for("products.get_products_list",redirectTo="product",search_element=search_element,productPage=productPage))
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(url_for("products.get_products_list",redirectTo="product",search_element=search_element,productPage=productPage))
		else:
			flash("Required fields are missing!!")
			return redirect(url_for("products.get_products_list",redirectTo="product",search_element=search_element,productPage=productPage))
	else:
		flash("The staff member does not have permission to update product status.", "danger")
		return redirect(url_for("products.get_products_list",redirectTo="product",search_element=search_element,productPage=productPage))

# Delete Products
@products.route("/delete_product",methods=["GET"])
@adminid_access_token_required
def delete_product():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")
		
		latitude = request.args.get("latitude", "")
		longitude = request.args.get("longitude", "")
		loginBrowser = request.headers.get("Sec-Ch-Ua")
		if loginBrowser:
			loginBrowseData = loginBrowser.split(";")
			browser = loginBrowseData[0]
		else:
			loginBrowseData = request.headers.get("User-Agent").split(";")
			browser = loginBrowseData[0]

		client_ip=0
		# Extracting client IP address
		if request.headers.getlist("X-Forwarded-For"): 
			client_ip = request.headers.getlist("X-Forwarded-For")[0]
		else:
			client_ip = request.remote_addr

		actionDate=datetime.datetime.now()

		jsonData = request.form.to_dict(flat=True)

		existing_record = ""
		updatedrequestData = [jsonData]

		productPage = 1
		search_element = ""
		
		permissionsList = check_permissions(session.get("adminId"),"productsPermissions")
		if "delete" in permissionsList:
			if request.method == "GET":
				productId = request.args.get("productId","")
				productPage = request.args.get(get_page_parameter("productPage"), type=int, default=1)
				search_element = request.args.get("search_element","")
				if not productId:
					flash("Required fields are missing!!")
					return redirect(url_for("products.get_products_list",redirectTo="product",productPage=productPage, search_element = search_element))

				product_queryset = Products.objects(id=productId,status__in=[0,1]).first()
				if not product_queryset:
					flash("Invalid Product Id!!")
					return redirect(url_for("products.get_products_list",redirectTo="product",productPage=productPage, search_element = search_element))
				admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
				existing_record = product_queryset.to_json()
				requestData = [existing_record]
				product_queryset.update(status=2)
				flash("Product deleted successfully!")
				message=admin_queryset.userName+" "+product_queryset.productName+" Product deleted successfully!"
				save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_product","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
				return redirect(url_for("products.get_products_list",redirectTo="product",productPage=productPage, search_element = search_element))
		else:
			flash("The staff member does not have permission to delete product.", "danger")
			return redirect(url_for("products.get_products_list",redirectTo="product",productPage=productPage, search_element = search_element))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete product!!")
		return redirect(url_for("products.get_products_list",redirectTo="product",productPage=productPage, search_element = search_element))

	   