from appservices.common.util import *

transaction_routings = Blueprint("transaction_routings",__name__)


@transaction_routings.route("/add_auto_switch",methods=["POST","GET"])
@adminid_access_token_required
def add_auto_switch():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")

		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,"transactionRouterPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				numberOfFails = request.form.get("numberOfFails",0)
				maxAmount = request.form.get("maxAmount",0)
				userId = request.form.get("userId","")
				apiId = request.form.get("apiId","")
				apiId1 = request.form.get("apiId1","")
				apiId2 = request.form.get("apiId2","")
				apiId3 = request.form.get("apiId3","")
				apiId4 = request.form.get("apiId4","")
				apiId5 = request.form.get("apiId5","")
				walletType = request.form.get("walletType","")
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]

				if numberOfFails and maxAmount and apiId and apiId1 and userId and walletType:
					try:
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						user_queryset = Users.objects(id=userId,status=1).first()
						if admin_queryset:
							message=admin_queryset.userName+" "+user_queryset.fullName+" Auto switch are created successfully!"
							save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_auto_switch","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
						switch_table = ApiSwitches(
							adminId=adminId,
							userId=userId,
							numberOfFails = numberOfFails,
							maxAmount = maxAmount,
							apiId = apiId,
							apiId1 = apiId1,
							walletType = walletType,
							createdOn = datetime.datetime.now(),
							status = 1,
							)
						save_table = switch_table.save()
						if apiId2:
							save_table.update(apiId2=ObjectId(apiId2))
						else:
							save_table.update(apiId2=None)

						if apiId3:
							save_table.update(apiId3=ObjectId(apiId3))
						else:
							save_table.update(apiId3=None)

						if apiId4:
							save_table.update(apiId4=ObjectId(apiId4))
						else:
							save_table.update(apiId4=None)

						if apiId5:
							save_table.update(apiId5=ObjectId(apiId5))
						else:
							save_table.update(apiId5=None)

						flash("Auto switch created successfully!")
						return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
					except Exception as e:
						flash("Unable to create auto switch details!!")
						app.logger.error(traceback.format_exc())
						return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
				else:
					flash("Required fields are missing!!")
					return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
		else:
			flash("Staff member does not have given create auto switch permissions!!")
			return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to create auto switch details!!"
		return render_template("super_admin_templates/transaction_routingss_list.html",error=error,redirectTo="autoSwitch")


@transaction_routings.route("/update_auto_switch",methods=["POST","GET"])
@adminid_access_token_required
def update_auto_switch():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")    
	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"),"transactionRouterPermissions")
	if "edit" in permissionsList:
		try:
			autoSwitchId = request.args.get("autoSwitchId","")
			if request.method == "POST":
				numberOfFails = request.form.get("numberOfFails",0)
				maxAmount = request.form.get("maxAmount",0)
				userId = request.form.get("userId","")
				apiId = request.form.get("apiId","")
				apiId1 = request.form.get("apiId1","")
				apiId2 = request.form.get("apiId2","")
				apiId3 = request.form.get("apiId3","")
				apiId4 = request.form.get("apiId4","")
				apiId5 = request.form.get("apiId5","")
				walletType = request.form.get("walletType","")
				jsonData = request.form.to_dict(flat=True)

				if autoSwitchId and numberOfFails and maxAmount and apiId and apiId1 and userId and walletType:
					api_switch_queryset = ApiSwitches.objects(id=autoSwitchId,status__in=[0,1]).first()
					existing_record = api_switch_queryset.to_json()
					message=api_switch_queryset.adminId.userName+" "+user_queryset.fullName+" Auto switch updated successfully!"
					requestData=[existing_record]
					updatedrequestData=[jsonData]
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_auto_switch","update",actionDate,client_ip,browser,message,requestData,updatedrequestData) 

					if api_switch_queryset:
						api_switch_queryset.update(
							numberOfFails = numberOfFails,
							maxAmount = maxAmount,
							walletType = walletType,
							apiId = ObjectId(apiId),
							apiId1 = ObjectId(apiId1),
							userId = ObjectId(userId),
							)
						if apiId2:
							api_switch_queryset.update(apiId2=ObjectId(apiId2))

						if apiId3:
							api_switch_queryset.update(apiId3=ObjectId(apiId3))

						if apiId4:
							api_switch_queryset.update(apiId4=ObjectId(apiId4))

						if apiId5:
							api_switch_queryset.update(apiId5=ObjectId(apiId5))
						flash("Auto switch updated successfully!")
						return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
					else:
						flash("Invaild id!!")
						return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
				else:
					flash("Required fields are missing!!")
					return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to update auto switch details!!"
			return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
	else:
		flash("Staff member does not have given update auto switch permissions!!")
		return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))


def fetching_api_switch_details(api_switch_queryset):
	apiSwitchDict = {}
	try:
		apiSwitchDict = {
		"id":str(api_switch_queryset.id),
		"numberOfFails":api_switch_queryset.numberOfFails,
		"walletType":api_switch_queryset.walletType,
		"maxAmount":"{:.2f}".format(float(api_switch_queryset.maxAmount)),
		"userId":str(api_switch_queryset.userId.id),
		"userName":api_switch_queryset.userId.fullName,
		"apiId":str(api_switch_queryset.apiId.id),
		"apiName":api_switch_queryset.apiId.apiName,
		"apiId1":str(api_switch_queryset.apiId1.id),
		"apiId1Name":api_switch_queryset.apiId1.apiName,
		"createdOn":api_switch_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
		}
		if api_switch_queryset.apiId2:
			apiSwitchDict["apiId2"]=str(api_switch_queryset.apiId2.id)
			apiSwitchDict["apiId2Name"]=api_switch_queryset.apiId2.apiName
		else:
			apiSwitchDict["apiId2"]=""
			apiSwitchDict["apiId2Name"]="-"

		if api_switch_queryset.apiId3:
			apiSwitchDict["apiId3"]=str(api_switch_queryset.apiId3.id)
			apiSwitchDict["apiId3Name"]=api_switch_queryset.apiId3.apiName
		else:
			apiSwitchDict["apiId3"]=""
			apiSwitchDict["apiId3Name"]="-"

		if api_switch_queryset.apiId4:
			apiSwitchDict["apiId4"]=str(api_switch_queryset.apiId4.id)
			apiSwitchDict["apiId4Name"]=api_switch_queryset.apiId4.apiName
		else:
			apiSwitchDict["apiId4"]=""
			apiSwitchDict["apiId4Name"]="-"

		if api_switch_queryset.apiId5:
			apiSwitchDict["apiId5"]=str(api_switch_queryset.apiId5.id)
			apiSwitchDict["apiId5Name"]=api_switch_queryset.apiId5.apiName
		else:
			apiSwitchDict["apiId5"]=""
			apiSwitchDict["apiId5Name"]="-"

		if api_switch_queryset.status == 1:
			apiSwitchDict["actionText"]="Active"
		else:
			apiSwitchDict["actionText"]="Deactive"
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return apiSwitchDict


@transaction_routings.route("/get_transaction_routings_list",methods=["POST","GET"])
@adminid_access_token_required
def get_transaction_routings_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	apiSwitchesList = []
	transactionAPIsList = []
	merchantsList = []
	
	adminId = session.get("adminId")

	permissionsList = check_permissions(adminId,"transactionRouterPermissions")
	if "view" in permissionsList:
		try:
			redirectTo = request.args.get("redirectTo","autoSwitch")
			if redirectTo:
				redirectval = redirectTo
			else:
				redirectval = "autoSwitch"

			merchantName = request.form.get("merchantName","")
			searchApiName = request.form.get("searchApiName","")

			merchants_queryset = Users.objects(status__in=[0,1]).order_by('-id').all()
			for each_merchant in merchants_queryset:
				merchant_dict = {
				"id":str(each_merchant.id),
				"userName":each_merchant.fullName
				}
				merchantsList.append(merchant_dict)


			transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id').all()
			for each_transaction_api in transaction_API_queryset:
				transaction_dict = {
				"id":str(each_transaction_api.id),
				"apiName":each_transaction_api.apiName
				}
				transactionAPIsList.append(transaction_dict)

			api_switch_queryset = ApiSwitches.objects(status__in=[0,1]).order_by('-id').all()
			if searchApiName:
				apis_queryset = TransactionAPI.objects(apiName__icontains=searchApiName)
				apiIdsList = [str(each_api.id) for each_api in apis_queryset]
				api_switch_queryset = api_switch_queryset.filter(apiId__in=apiIdsList)

			if merchantName:
				merchants_list_queryset = Users.objects(status__in=[0,1]).order_by('-id').all()
				merchants_list_queryset = merchants_list_queryset.filter(fullName__icontains=merchantName)
				userIdsList = [str(each_user.id) for each_user in merchants_list_queryset]
				api_switch_queryset = api_switch_queryset.filter(userId__in=userIdsList)

			for each_api_switch in api_switch_queryset:
				apiSwitchDict = fetching_api_switch_details(each_api_switch)
				apiSwitchesList.append(apiSwitchDict)

			return render_template("super_admin_templates/transaction_routingss_list.html",
				apiSwitchesList=apiSwitchesList,
				transactionAPIsList=transactionAPIsList,
				redirectval=redirectval,
				merchantsList=merchantsList,
				merchantName=merchantName,
				searchApiName=searchApiName
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch auto switches details!!"
			return render_template("super_admin_templates/transaction_routingss_list.html", 
				error=error,
				redirectval=redirectval,
				transactionAPIsList=transactionAPIsList,
				apiSwitchesList=apiSwitchesList,
				merchantsList=merchantsList,
				merchantName=merchantName,
				searchApiName=searchApiName
				)
	else:
		flash("Staff member does not have given view auto switch permissions!!")
		return render_template("super_admin_templates/transaction_routingss_list.html")


@transaction_routings.route("/update_auto_switch_status",methods=["POST","GET"])
@adminid_access_token_required
def update_auto_switch_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	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]

	permissionsList = check_permissions(session.get("adminId"),"transactionRouterPermissions")
	if "edit" in permissionsList:
		autoSwitchId = request.args.get("autoSwitchId","")

		if autoSwitchId:
			try:
				api_switch_queryset = ApiSwitches.objects(id=autoSwitchId).first()
				existing_record = api_switch_queryset.to_json()
				requestData = [existing_record]
				if api_switch_queryset:
					if api_switch_queryset.status == 0:
						api_switch_queryset.update(status=1)
						flash("Auto switch activated successfully!")
						message=api_switch_queryset.adminId.userName+" "+userId.fullName+" Auto switch activated successfully!"
					elif api_switch_queryset.status == 1:
						api_switch_queryset.update(status=0)
						flash("Auto switch deactivated successfully!")
						message=api_switch_queryset.adminId.userName+" "+userId.fullName+" Auto switch deactivated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_auto_switch_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
					return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
				else:
					flash("Invaild id!!")
					return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
		else:
			flash("Required field is missing!!")
			return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))
	else:
		flash("Staff member does not have given update auto switch permissions!!")
		return redirect(url_for("transaction_routings.get_transaction_routings_list",redirectTo="autoSwitch"))



# ################################## Old Transaction Routers API's ######################################
# @transaction_routings.route("/transaction_routingss_list",methods=["POST","GET"])
# def transaction_routingss_list():
#     if not session.get("adminId"):
#         return redirect("admin_login")
#     adminId = session.get("adminId")
#     categoriesList = []
#     operatorsList = []
#     transactionAPIsList = []
#     servicesList = []
#     operator_wise_routings_list = []
#     usersList = []
#     profileWiseRoutingList = []
#     try:
#         redirectto = request.args.get('redirectto','Operatorwiserouting')
#         if redirectto:
#             redirectval=redirectto
#         else:
#             redirectval="Operatorwiserouting"

#         operator_wise_search_element = request.args.get('operator_wise_search_element','')
#         profile_wise_search_element = request.args.get('profile_wise_search_element','')

#         ###################################### Common Lists ########################################
#         users_queryset = Users.objects(status__in=[0,1]).order_by('-id').all()
#         for each_user in users_queryset:
#             userDict = fetching_user_details(each_user)
#             usersList.append(userDict)
			
#         categories_queryset = Categories.objects(status__in=[0,1]).order_by('-id').all()
#         for each_category in categories_queryset:
#             category_dict = fetching_category_details(each_category)
#             categoriesList.append(category_dict)

#         operators_queryset = Operators.objects(status__in=[0,1]).order_by('-id').all()
#         for each_operator in operators_queryset:
#             operator_dict = fetching_operator_details(each_operator)
#             operatorsList.append(operator_dict)

#         services_queryset = Service.objects(status__in=[0,1]).order_by("-id").all()
#         for each_service in services_queryset:
#             service_dict = fetching_service_details(each_service)
#             servicesList.append(service_dict)

#         transaction_API_queryset = TransactionAPI.objects(status__in=[0,1]).order_by('-id').all()
#         for each_transaction_api in transaction_API_queryset:
#             service_grouping_dict = {
#             "id":str(each_transaction_api.id),
#             "apiName":each_transaction_api.apiName
#             }
#             transactionAPIsList.append(service_grouping_dict)

#         ###################################### Operator Wise Routings Data ########################################            
#         operator_wise_routing_queryset = OperatorWiseRoutings.objects(adminId=adminId,status__in=[0,1]).order_by("-id").all()

#         # Get the current page from the query parameters
#         page = request.args.get(get_page_parameter(), type=int, default=1)
#         per_page = 20  # Number of items per page

#         # Query the database for the current page's data
#         total_count = operator_wise_routing_queryset.count()

#         start = (page - 1) * per_page
#         end = min(start + per_page, total_count)

#         total_operator_wise_routings = operator_wise_routing_queryset[start:end]

#         for each_operator_wise_routing in total_operator_wise_routings:
#             operator_wise_routing_dict = fetching_operator_wise_routing_details(each_operator_wise_routing)
#             operator_wise_routings_list.append(operator_wise_routing_dict)

#         # Pagination object for rendering pagination controls in the template
#         pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right")
		
#         ############################### Profile Wise Routing Data #########################################
#         profile_wise_routing_queryset = ProfileWiseRoutings.objects(status__in=[0,1]).order_by('-id').all()

#         # Get the current page from the query parameters
#         pageProfile = request.args.get(get_page_parameter(), type=int, default=1)
#         perPageProfile = 20  # Number of items per page

#         # Query the database for the current page's data
#         total_profile_count = profile_wise_routing_queryset.count()

#         startProfile = (pageProfile - 1) * perPageProfile
#         endProfile = min(startProfile + perPageProfile, total_profile_count)

#         totalProfiles = profile_wise_routing_queryset[startProfile:endProfile]

#         for each_profile in totalProfiles:
#             profile_wise_routing_dict = fetching_profile_wise_routing_details(each_profile)
#             profileWiseRoutingList.append(profile_wise_routing_dict)

#         # Pagination object for rendering pagination controls in the template
#         profilePagination = Pagination(page=pageProfile, 
#             total=total_profile_count, per_page=perPageProfile, 
#             alignment="right",page_parameter="Profilewiserouting",href="transaction_routingss_list?redirectto=Profilewiserouting&pageProfile={0}")

#         return render_template("super_admin_templates/transaction_routingss_list.html",
#             categoriesList=categoriesList,
#             servicesList=servicesList,
#             transactionAPIsList=transactionAPIsList,
#             operatorsList=operatorsList,
#             profileWiseRoutingList=profileWiseRoutingList,
#             operator_wise_routings_list=operator_wise_routings_list,
#             usersList=usersList,
#             pagination=pagination,
#             profilePagination=profilePagination,
#             redirectval=redirectval
#             )
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         error = "Unable to fetch trasaction routings details!!"
#         return render_template("super_admin_templates/transaction_routingss_list.html",
#             categoriesList=categoriesList,
#             servicesList=servicesList,
#             transactionAPIsList=transactionAPIsList,
#             operatorsList=operatorsList,
#             profileWiseRoutingList=profileWiseRoutingList,
#             operator_wise_routings_list=operator_wise_routings_list,
#             usersList=usersList,
#             pagination=pagination,
#             profilePagination=profilePagination,
#             redirectval=redirectval
#             )

############################## Operator Wise Routing ##########################################
@transaction_routings.route("/add_operator_wise_routing",methods=["POST","GET"])
@adminid_access_token_required
def add_operator_wise_routing():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")
		
		if request.method == "POST":
			serviceId = request.form.get("serviceId","")
			operatorId = request.form.get("operatorId","")
			transactionAPIId = request.form.get("transactionAPIId","")
			categoryId = request.form.get("categoryId","")

			if serviceId and operatorId and categoryId and transactionAPIId:
				try:
					operator_wise_routing_table = OperatorWiseRoutings(
						adminId = adminId,
						serviceId = serviceId,
						operatorId = operatorId,
						categoryId = categoryId,
						transactionAPIId = transactionAPIId,
						createdOn = datetime.datetime.now(),
						status = 1,
						)
					save_table = operator_wise_routing_table.save()

					flash("Operator wise routing saved successfully!")
					return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
				except Exception as e:
					flash("Unable to save operator wise routing!!")
					app.logger.error(traceback.format_exc())
					return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
			else:
				flash("Required fields are missing!!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to save operator wise routing!!"
		return render_template("super_admin_templates/transaction_routingss_list.html",error=error)

def fetching_operator_wise_routing_details(operator_wise_routing_queryset):
	operator_wise_routing_dict = {}
	try:
		operator_wise_routing_dict={
		"id":str(operator_wise_routing_queryset.id),
		"serviceId":str(operator_wise_routing_queryset.serviceId.id),
		"operatorId":str(operator_wise_routing_queryset.operatorId.id),
		"transactionAPIId":str(operator_wise_routing_queryset.transactionAPIId.id),
		"transactionAPIIdName":operator_wise_routing_queryset.transactionAPIId.apiName,
		"operatorName":operator_wise_routing_queryset.operatorId.operatorName,
		"serviceName":operator_wise_routing_queryset.serviceId.serviceName
		}
		if operator_wise_routing_queryset.categoryId:
			operator_wise_routing_dict["categoryId"] = str(operator_wise_routing_queryset.categoryId.id)
			operator_wise_routing_dict["categoryName"] = operator_wise_routing_queryset.categoryId.categoryName
		else:
			operator_wise_routing_dict["categoryId"] = ""
			operator_wise_routing_dict["categoryName"] = ""

		if operator_wise_routing_queryset.status==1:
			operator_wise_routing_dict["actionText"] = "Active"
		else:
			operator_wise_routing_dict["actionText"] = "Deactive"
		if operator_wise_routing_queryset.createdOn:
			operator_wise_routing_dict["createdOn"] = operator_wise_routing_queryset.createdOn.strftime("%m-%d-%Y")
		else:
			operator_wise_routing_dict["createdOn"] = ""
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return operator_wise_routing_dict


@transaction_routings.route("/update_operator_wise_routing_status",methods=["POST","GET"])
@adminid_access_token_required
def update_operator_wise_routing_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	operatorWiseRoutingId = request.args.get("operatorWiseRoutingId","")
	if operatorWiseRoutingId:
		try:
			operator_wise_routing_queryset = OperatorWiseRoutings.objects(id=operatorWiseRoutingId, status__nin=[2]).first()
			if operator_wise_routing_queryset:
				if operator_wise_routing_queryset.status == 0:
					operator_wise_routing_queryset.update(status=1)
					flash("Operator wise routing activated successfully!")
				elif operator_wise_routing_queryset.status == 1:
					operator_wise_routing_queryset.update(status=0)
					flash("Operator wise routing deactivated successfully!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
			else:
				flash("Invaild id!!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
		except Exception as e:
			app.logger.error(traceback.format_exc())
			return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
	else:
		return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))


@transaction_routings.route("/delete_operator_wise_routing",methods=["GET"])
@adminid_access_token_required
def delete_operator_wise_routing():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		if request.method == "GET":
			operatorWiseRoutingId = request.args.get("operatorWiseRoutingId","")
			operator_wise_routing_queryset = OperatorWiseRoutings.objects(id=operatorWiseRoutingId,status__in=[0,1]).first()
			if operator_wise_routing_queryset:
				operator_wise_routing_queryset.update(status=2)
				flash("Operator wise routing deleted successfully!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
			else:
				flash("Invaild id!!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete operator wise routing!!")
		return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))

@transaction_routings.route("/update_operator_wise_routing",methods=["POST","GET"])
@adminid_access_token_required
def update_operator_wise_routing():
	if not session.get("adminId"):
		return redirect("admin_login")
	try:
		operatorWiseRoutingId = request.args.get("operatorWiseRoutingId","")
		if request.method == "POST":
			serviceId = request.form.get("serviceId","")
			operatorId = request.form.get("operatorId","")
			transactionAPIId = request.form.get("transactionAPIId","")
			categoryId = request.form.get("categoryId","")

		if serviceId and operatorId and categoryId and transactionAPIId:
			try:
				operator_wise_routing_queryset = OperatorWiseRoutings.objects(id=operatorWiseRoutingId).first()
				if operator_wise_routing_queryset:
					operator_wise_routing_queryset.update(
						categoryId = ObjectId(categoryId),
						serviceId = ObjectId(serviceId),
						operatorId = ObjectId(operatorId),
						transactionAPIId = ObjectId(transactionAPIId)
						)
					flash("Operator wise routing updated successfully!")
					return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
				else:
					flash("Invaild id!!")
					return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
			except Exception as e:
				app.logger.error(traceback.format_exc())
				flash("Unable to update operator wise routing!!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
		else:
			flash("Required fields are missing!!")
			return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to update operator wise routing!!")
		return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Operatorwiserouting"))


@transaction_routings.route("/category_based_services_list",methods=["POST"])
@adminid_access_token_required
def category_based_services_list():
	data_status = {"responseStatus": 0, "result": ""}
	categoryId = request.form.get("categoryId","")

	if not categoryId:
		data_status["result"] = "Required fields are missing!!"
		return data_status
	try:
		category_queryset = Categories.objects(id=categoryId,status__in=[0,1]).first()
		if not category_queryset:
			data_status["result"]="Invalid category id!!"
			return data_status

		servicesList = []
		services_queryset = Service.objects(
			categoryId=str(category_queryset.id),status__in=[0,1]).order_by("-id").all()
		for each_service in services_queryset:
			service_dict = fetching_service_details(each_service)
			servicesList.append(service_dict)

		data_status["responseStatus"] = 1
		data_status["result"] = "Category based services data fetched successfully!"
		data_status["servicesList"] = servicesList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"] = "Unable to fetch services data!!"
		return data_status

@transaction_routings.route("/service_based_operators_list",methods=["POST"])
@adminid_access_token_required
def service_based_operators_list():
	data_status = {"responseStatus": 0, "result": ""}
	serviceId = request.form.get("serviceId","")

	if not serviceId:
		data_status["result"] = "Required fields are missing!!"
		return data_status
	try:
		service_queryset = Service.objects(id=serviceId,status__in=[1]).first()
		if not service_queryset:
			data_status["result"]="Invalid service id!!"
			return data_status

		operatorsList = []
		operators_queryset = Operators.objects(
			serviceId=str(service_queryset.id),status__in=[1]).order_by("-id").all()
		for each_operator in operators_queryset:
			operator_dict = fetching_operator_details(each_operator)
			operatorsList.append(operator_dict)

		data_status["responseStatus"] = 1
		data_status["result"] = "Service based operators data fetched successfully!"
		data_status["operatorsList"] = operatorsList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"] = "Unable to fetch operators data!!"
		return data_status

############################## Profile Wise Routing ##########################################
@transaction_routings.route("/add_profile_wise_routing",methods=["POST","GET"])
@adminid_access_token_required
def add_profile_wise_routing():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")
		
		if request.method == "POST":
			userId = request.form.get("userId","")
			transactionAPIId = request.form.get("transactionAPIId","")

			if userId and transactionAPIId:
				try:
					profile_wise_routing_table = ProfileWiseRoutings(
						adminId = adminId,
						userId = userId,
						transactionAPIId = transactionAPIId,
						createdOn = datetime.datetime.now(),
						status = 1,
						)
					save_table = profile_wise_routing_table.save()

					flash("Profile wise routing saved successfully!")
					return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
				except Exception as e:
					flash("Unable to save profile wise routing!!")
					app.logger.error(traceback.format_exc())
					return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
			else:
				flash("Required fields are missing!!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to save profile wise routing!!"
		return render_template("super_admin_templates/transaction_routingss_list.html",error=error)

def fetching_profile_wise_routing_details(profile_wise_routing_queryset):
	profile_wise_routing_dict = {}
	try:
		profile_wise_routing_dict={
		"id":str(profile_wise_routing_queryset.id),
		"userId":str(profile_wise_routing_queryset.userId.id),
		"transactionAPIId":str(profile_wise_routing_queryset.transactionAPIId.id),
		"transactionAPIIdName":profile_wise_routing_queryset.transactionAPIId.apiName,
		"userName":profile_wise_routing_queryset.userId.fullName
		}
		if profile_wise_routing_queryset.status==1:
			profile_wise_routing_dict["actionText"] = "Active"
		else:
			profile_wise_routing_dict["actionText"] = "Deactive"
		if profile_wise_routing_queryset.createdOn:
			profile_wise_routing_dict["createdOn"] = profile_wise_routing_queryset.createdOn.strftime("%m-%d-%Y")
		else:
			profile_wise_routing_dict["createdOn"] = ""
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return profile_wise_routing_dict


@transaction_routings.route("/update_profile_wise_routing_status",methods=["POST","GET"])
@adminid_access_token_required
def update_profile_wise_routing_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	profileWiseRoutingId = request.args.get("profileWiseRoutingId","")
	if profileWiseRoutingId:
		try:
			profile_wise_routing_queryset = ProfileWiseRoutings.objects(id=profileWiseRoutingId, status__nin=[2]).first()
			if profile_wise_routing_queryset:
				if profile_wise_routing_queryset.status == 0:
					profile_wise_routing_queryset.update(status=1)
					flash("Profile wise routing activated successfully!")
				elif profile_wise_routing_queryset.status == 1:
					profile_wise_routing_queryset.update(status=0)
					flash("Profile wise routing deactivated successfully!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
			else:
				flash("Invaild id!!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
		except Exception as e:
			app.logger.error(traceback.format_exc())
			return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
	else:
		return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))


@transaction_routings.route("/delete_profile_wise_routing",methods=["GET"])
@adminid_access_token_required
def delete_profile_wise_routing():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		if request.method == "GET":
			profileWiseRoutingId = request.args.get("profileWiseRoutingId","")
			profile_wise_routing_queryset = ProfileWiseRoutings.objects(id=profileWiseRoutingId,status__in=[0,1]).first()
			if profile_wise_routing_queryset:
				profile_wise_routing_queryset.update(status=2)
				flash("Profile wise routing deleted successfully!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
			else:
				flash("Invaild id!!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete profile wise routing!!")
		return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))

@transaction_routings.route("/update_profile_wise_routing",methods=["POST","GET"])
@adminid_access_token_required
def update_profile_wise_routing():
	if not session.get("adminId"):
		return redirect("admin_login")
	try:
		profileWiseRoutingId = request.args.get("profileWiseRoutingId","")
		if request.method == "POST":
			userId = request.form.get("userId","")
			transactionAPIId = request.form.get("transactionAPIId","")

		if profileWiseRoutingId and userId and transactionAPIId:
			try:
				profile_wise_routing_queryset = ProfileWiseRoutings.objects(id=profileWiseRoutingId).first()
				if profile_wise_routing_queryset:
					profile_wise_routing_queryset.update(
						userId = ObjectId(userId),
						transactionAPIId = ObjectId(transactionAPIId)
						)
					flash("Profile wise routing updated successfully!")
					return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
				else:
					flash("Invaild id!!")
					return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
			except Exception as e:
				app.logger.error(traceback.format_exc())
				flash("Unable to update profile wise routing!!")
				return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
		else:
			flash("Required fields are missing!!")
			return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to update profile wise routing!!")
		return redirect(url_for("transaction_routings.transaction_routingss_list",redirectto="Profilewiserouting"))