from appservices.common.util import *
from appservices.common.form_schemas import *

gold_master = Blueprint("gold_master",__name__)

@gold_master.route("/add_assign_gold_api",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect

def add_assign_gold_api():
	try:
		data_status = {"responseStatus": 0, "result": ""}

		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,"goldApiManagementPermissions")
		form = GoldMasterForm(request.form)


		if "add" in permissionsList:
			if request.method == "POST":
				goldTransactionApiIdsList = request.form.getlist("goldTransactionApiIdsList")
				paymentGatewayApiId = request.form.get("paymentGatewayApiId")

				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]

				print("goldTransactionApiId(",goldTransactionApiIdsList)
				if form.validate_on_submit():

					try:
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						if admin_queryset:
							message=admin_queryset.userName+" Assign Kyc created successfully!"
							save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_assign_gold_api","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
						assign_gold_gateway_table = AssignGoldPaymentGateway(
							adminId = adminId,
							goldTransactionApiIdsList = goldTransactionApiIdsList,
							paymentGatewayApiId = paymentGatewayApiId,
							createdOn = datetime.datetime.now(),
							status = 1,
							)
						save_table = assign_gold_gateway_table.save()
						AssignKycId = str(save_table.id)
						# if isActive == None:
						#     save_table.update(isActive=False)
						# else:
						#     save_table.update(isActive=True)

						
						data_status["responseStatus"] = 1
						flash("Assign Gold Payment Gateway added successfully!", "success")
						return data_status

					except Exception as e:
						data_status["responseStatus"] = 4
						app.logger.error(traceback.format_exc())
						flash("Unable to save  Assign Gold Payment Gateway!!")
						
						return data_status

 
				else:
					data_status['result']=form.errors
					return data_status
			else:
				flash("Invalid request.","danger")
				data_status['responseStatus']=4
				return data_status

		else:
			flash("The staff member does not have permission to create a Gold Assign Api.", "danger")
			return redirect(url_for("gold_master.gold_assign_apis_list"))
		
	except Exception as e:
		data_status["responseStatus"] = 4
		app.logger.error(traceback.format_exc())
		flash("Unable to save Gold Assign Api!")
		return data_status


# View All KYC API's
@gold_master.route("/gold_assign_apis_list",methods=["POST","GET"])
@adminid_access_token_required
def gold_assign_apis_list():
	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))))))))))))))")

	assignGoldApisList = []
	goldApisList = []
	payinGatewaysList = []
	assignGoldApiPagePagination=""
	checkedGoldApi=[]
	goldApisAddList=[]
	total_count = ""
	per_page = ""
	snoCount = 0
	assignGoldApiPagePagination = ""

	permissionsList = check_permissions(adminId,"goldApiManagementPermissions")
	if "view" in permissionsList:    
		try:
			# search_element = request.args.get('search_element','')
			assignGoldApiPage = request.args.get(get_page_parameter('assignGoldApiPage'), type=int, default=1)
			
			per_page = 20
			start = (assignGoldApiPage - 1) * per_page
		 

			# page = request.args.get(get_page_parameter(), type=int, default=1)
			# page_start,page_end=fetch_limit_length_based_on_page_index(page,10)
			# pagination = Pagination(
			#     page=page,
			#     record_name='api_master',
			#     per_page=10,
			#     alignment="right"
			#     )

			assign_gold_gateway_queryset =( AssignGoldPaymentGateway.objects(status__in=[0,1])
										   .order_by("-id")
										   .skip(start).limit(per_page) )
			
			assignGoldApisList = list(assign_gold_gateway_queryset)

			print("assignGoldApiPage",assignGoldApiPage)
		
			total_count = assign_gold_gateway_queryset.count()

			# for each_assign_kyc in assign_gold_gateway_queryset:
			 
			#     assign_kyc_dict = {
			#         "id": str(each_assign_kyc.id),
			#         # "goldTransactionApiIdsList": each_assign_kyc.goldTransactionApiIdsList,
			#         "paymentGatewayApiId": str(each_assign_kyc.paymentGatewayApiId.id),
			#     }
			#     assignGoldApisList.append(assign_kyc_dict)
			#     assign_kyc_dict["snoCount"] = snoCount
			#     if each_assign_kyc.status==1:
			#         assign_kyc_dict["actionText"] = "Active"
			#     else:
			#         assign_kyc_dict["actionText"] = "Deactive"

			#     if each_assign_kyc.paymentGatewayApiId:
			#         assign_kyc_dict["paymentGatewayApiIdName"] = each_assign_kyc.paymentGatewayApiId.apiName
			#     else:
			#         assign_kyc_dict["paymentGatewayApiIdName"] = ""
					

			# if each_assign_kyc.goldTransactionApiIdsList:
			#     IdsList=[]
			#     assign_kyc_dict["goldTransactionApiIdsNameList"]=[str(each_documentname.apiName) for each_documentname in each_assign_kyc.goldTransactionApiIdsList]
			#     assign_kyc_dict["goldTransactionApiIdsNameList"] = ', '.join(assign_kyc_dict["goldTransactionApiIdsNameList"])
				
			#     for each_docId in each_assign_kyc.goldTransactionApiIdsList:
			#         IdsList.append(str(each_docId.id))
			#         if each_docId.id not in checkedGoldApi:
			#             checkedGoldApi.append(each_docId.id)
			#     # assign_kyc_dict["goldTransactionApiIdsList"] = [str(each_documentname.id) for each_documentname in each_assign_kyc.goldTransactionApiIdsList]
			#     assign_kyc_dict["goldTransactionApiIdsList"] = IdsList

			# else:
			#     assign_kyc_dict["goldTransactionApiIdsNameList"]=[]
			#     assign_kyc_dict["goldTransactionApiIdsList"]=[]
	
			snoCount = start
			assignGoldApiPagePagination = Pagination(assignGoldApiPage=assignGoldApiPage, total=total_count, page_parameter="assignGoldApiPage", per_page=per_page, alignment="right", record_name="assignGoldApi",href=f"?assignGoldApiPage={{0}}")

			transaction_apis_queryset = TransactionAPI.objects(status__in=[0,1]).order_by("-id").all()

			all_gold_asign_queryset = AssignGoldPaymentGateway.objects(status__in=[0,1]).only("goldTransactionApiIdsList").all()
			print("(((((checkedGoldApi)))))",checkedGoldApi)
			
			for each_record in all_gold_asign_queryset:
				for each_gold in each_record.goldTransactionApiIdsList: 
					if each_gold.id not in checkedGoldApi: 
						checkedGoldApi.append(each_gold.id)
				
			print("******checkedGoldApi************", checkedGoldApi)
			for each_tnx_record in transaction_apis_queryset:
				txn_api_dict = {
					"id":str(each_tnx_record.id),
					"apiName": each_tnx_record.apiName,
				}

				if each_tnx_record.transactionType == "Gold" :
					goldApisList.append(txn_api_dict)
					if each_tnx_record.id not in checkedGoldApi:
						goldApisAddList.append(txn_api_dict)
	
				elif each_tnx_record.transactionType == "paymentgateway" or "payout":
					payinGatewaysList.append(txn_api_dict)

				

			print("((((((((((gold apis))))))))))",goldApisAddList)
			# print("((((((((((assignGoldApisList apis))))))))))",assignGoldApisList)
			# print("((((((((((payinGatewaysList apis))))))))))",payinGatewaysList)

			return render_template("super_admin_templates/gold_assign_list.html",
				assignGoldApiPagePagination=assignGoldApiPagePagination,
				goldApisList=goldApisList,
				goldApisAddList=goldApisAddList,
				payinGatewaysList=payinGatewaysList,
				assignGoldApisList=assignGoldApisList,
				assignGoldApiPage = assignGoldApiPage, 
				snoCount = snoCount
				#pagination=pagination,
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch Assign Gold Api details!!"
			return render_template("super_admin_templates/gold_assign_list.html",
				error = error,
				assignGoldApiPagePagination=assignGoldApiPagePagination,
				payinGatewaysList=payinGatewaysList,
				goldApisList=goldApisList,
				goldApisAddList=goldApisAddList,
				assignGoldApisList=assignGoldApisList,
				#pagination=pagination,
				assignGoldApiPage = assignGoldApiPage, 
				snoCount = snoCount

				)
	else:
		flash("The staff member does not have permission to view Gold Assign Api list.", "danger")
		return render_template("super_admin_templates/gold_assign_list.html")

# Update scheme
@gold_master.route("/update_gold_assign_api",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_gold_assign_api():
	data_status = {"responseStatus": 0, "result": ""}

	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")
	userAgent=""
	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()  
	 
	date_format = "%Y-%m-%d"
	permissionsList = check_permissions(session.get("adminId"),"goldApiManagementPermissions")

	

	if "edit" in permissionsList:
		try:
			AssignKycId = request.args.get("AssignKycId")
			if request.method == "POST":
				goldAssignApiId = request.args.get("goldAssignApiId")

				goldTransactionApiIdsList = request.form.getlist("goldTransactionApiIdsList")
				paymentGatewayApiId = request.form.get("paymentGatewayApiId","")

				jsonData = request.form.to_dict(flat=True)
				assign_gold_payment_gateway_queryset = AssignGoldPaymentGateway.objects(id=goldAssignApiId, status__in=[0, 1]).first()
				original_data = {
							# "goldTransactionApiIdsList": [str(api.id) for api in assign_gold_payment_gateway_queryset.goldTransactionApiIdsList],
								"paymentGatewayApiId": str(assign_gold_payment_gateway_queryset.paymentGatewayApiId.id)
											}

				form = GoldMasterForm(request.form, current_id=goldAssignApiId, original_data=original_data)

				goldTransactionApiIdsListObjs = [ ObjectId(i) for i in goldTransactionApiIdsList]
				print("goldTransactionApiIdsListObjs",goldTransactionApiIdsListObjs)
				if form.validate_on_submit():
					if goldTransactionApiIdsList and paymentGatewayApiId:


						existing_record = assign_gold_payment_gateway_queryset.to_json()
						message=assign_gold_payment_gateway_queryset.adminId.userName+" Gold Payment Gateway updated successfully!"
						requestData=[existing_record]
						updatedrequestData=[jsonData]
						save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_gold_assign_api","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 

						if assign_gold_payment_gateway_queryset:
							assign_gold_payment_gateway_queryset.update(
								goldTransactionApiIdsList = goldTransactionApiIdsListObjs,
								paymentGatewayApiId = ObjectId(paymentGatewayApiId),
								)
							
							data_status["responseStatus"]=1
							flash("Gold Payment Gateway updated successfully!")
							return data_status
							
						else:
							flash("Invalid ID provided.", "danger")
							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
			else:
				flash("Invalid request.", "danger")
				data_status["responseStatus"]=4
				return data_status
				
		except Exception as e:
			app.logger.error(traceback.format_exc())
			flash("Unable to Update Gold Payment Code!!", "danger")
			data_status["responseStatus"]=4
			return data_status
	else:
		data_status["responseStatus"]=4
		flash("The staff member does not have permission to update Gold Assign Api.", "danger")
		return data_status


@gold_master.route("/update_gold_assign_api_status",methods=["POST","GET"])
@adminid_access_token_required
def update_gold_assign_api_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")
	userAgent=""
	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]
   
	print("In side stauts update")
	permissionsList = check_permissions(session.get("adminId"),"goldApiManagementPermissions")
	if "edit" in permissionsList:
		goldAssignApiId = request.args.get("goldAssignApiId")
		assignGoldApiPage = request.args.get("assignGoldApiPage")
		print(assignGoldApiPage,"******************************************************")

		redirectTo = url_for("gold_master.gold_assign_apis_list",assignGoldApiPage=assignGoldApiPage)
		
		if goldAssignApiId:
			try:
				assign_gold_payment_gateway_queryset = AssignGoldPaymentGateway.objects(id=goldAssignApiId,status__nin=[2]).first()
				existing_record = assign_gold_payment_gateway_queryset.to_json()
				requestData = [existing_record]
				print("In side stauts update")
				print("assign_gold_payment_gateway_queryset",assign_gold_payment_gateway_queryset.status)
				if assign_gold_payment_gateway_queryset:
					if assign_gold_payment_gateway_queryset.status == 0:
						assign_gold_payment_gateway_queryset.update(status=1)
						flash("Gold Api Gateway activated successfully!")
						message=assign_gold_payment_gateway_queryset.adminId.userName+" Gold Api Gateway activated successfully!"
					elif assign_gold_payment_gateway_queryset.status == 1:
						assign_gold_payment_gateway_queryset.update(status=0)
						flash("Gold Api Gateway deactivated successfully!")
						message=assign_gold_payment_gateway_queryset.adminId.userName+" Gold Api Gateway deactivated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_gold_assign_api_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(redirectTo)
				else:
					flash("Invaild id!!")
					return redirect(redirectTo)
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(redirectTo)
		else:
			flash("Required fields are missing!!")
			return redirect(redirectTo)
	else:
		flash("Staff member does not have given update Gold Assign Api permissions!!")
		flash("The staff member does not have permission to update Gold Assign Api status.", "danger")
		return redirect(redirectTo)




@gold_master.route("/gold_transactions_list",methods=["POST","GET"])
@adminid_access_token_required
def gold_transactions_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"goldApiTransactionPermissions")
	if "view" in permissionsList:
		goldTransactionsList = []
		goldApisList = []
		merchantsList = []
		goldGatewayId=""
		merchantId=""
		pgList=[]
		pgId=""
		searchId=""
		snoCount=0
		per_page = ""
		form = GoldTransactionSearchForm(request.args)
		try:
			adminId = session.get("adminId")

			startDate = request.args.get("startDate","")
			endDate = request.args.get("endDate","")
			# orderId = request.args.get("orderId","")
			# pgOrderId = request.args.get("pgOrderId","")
			merchantId = request.args.get("merchantId","")
			searchId=request.args.get("searchId","")
			pgId=request.args.get("pgId","")
			goldGatewayId=request.args.get("goldGatewayId","")

			# Set default date format
			date_format = "%d-%m-%Y"
			pagination = None
			pgList = []
			try:
				if startDate:
					startDate = datetime.datetime.strptime(startDate, date_format)
					startDate = startDate.replace(hour=0, minute=0, second=0, microsecond=0)
				else:
					startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)

				if endDate:
					endDate = datetime.datetime.strptime(endDate, date_format)
					endDate = endDate.replace(hour=23, minute=59, second=59, microsecond=999999)
				else:
					endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)
			except Exception as ve:
				app.logger.error("Date parsing error: %s", ve)
				startDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
				endDate = datetime.datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)

			if form.validate():

				page = request.args.get(get_page_parameter(), type=int, default=1)
				per_page = 20  # Number of items per page
				start = (page - 1) * per_page
				snoCount = start

				merchants_queryset = GoldUsers.objects(status__nin=[2]).only("id","userId").order_by("-createdOn")
				# for each_merchant in merchants_queryset:
				#     merchantDict = fetching_user_details(each_merchant)
					# merchantsList.append(merchantDict)
				merchantsList=list(merchants_queryset)

				gold_queryset = TransactionAPI.objects(transactionType="Gold",status__in=[0,1]).only("id","apiName").order_by("-id")
				#     pgDict = fetching_transaction_api_details(each_gold_api)
				#     goldApisList.append(pgDict)
				goldApisList = list(gold_queryset)
				print("goldApisList",goldApisList)

				pg_queryset = TransactionAPI.objects(transactionType="PaymentGateway",status__in=[0,1]).only("id","apiName" ).order_by("-id")
				pgList = list(pg_queryset)

				query=Q()
				if searchId:
					# gold_transaction_reports = gold_transaction_reports.filter(transactionId__icontains=searchId)
					query &= Q(transactionId__icontains=searchId) | Q(pgOrderId__icontains=searchId)
				
				else:
					query=Q(status__in=[0,1,2,3,4,5],createdOn__gte=startDate,createdOn__lte=endDate,goldTransactionType="Credit")

					if goldGatewayId:
						# gold_transaction_reports = gold_transaction_reports.filter(transactionApiId__in=[goldGatewayId])
						query&=Q(goldTransactionApiId=goldGatewayId)

					if pgId:
							# payin_queryset = payin_queryset.filter(paymentGatewayId__in=[pgId])
						query &= Q(paymentGatewayId=pgId)
					if merchantId:
						query &= Q(goldUserId__in=[merchantId])

				total_count = GoldTransactions.objects(query).count()
				gold_transaction_reports = GoldTransactions.objects(query).order_by("-createdOn").all().skip(start).limit(per_page) 
				# for each_gold_api in gold_queryset:

				for each_payin in gold_transaction_reports:
					payinDict = fetching_gold_transaction_details(each_payin)
					# print("(((((((payinDict)))))))",payinDict)
					goldTransactionsList.append(payinDict)

				# Pagination object for rendering pagination controls in the template
				pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="payins")
			else:
				print("form errors",form.errors)

			return render_template("super_admin_templates/gold_transactions_list.html",
				startDate=startDate.strftime(date_format),
				endDate=endDate.strftime(date_format),
				goldTransactionsList=goldTransactionsList,
				goldApisList=goldApisList,
				pagination=pagination,
				# pgOrderId=pgOrderId,
				goldGatewayId=goldGatewayId,
				searchId=searchId,
				merchantsList=merchantsList,
				merchantId=merchantId,
				pgId=pgId,
				pgList=pgList,
				form=form,
				snoCount=snoCount
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch gold transaction list data!!"
			return render_template("super_admin_templates/gold_transactions_list.html", 
				error=error,
				startDate=startDate.strftime(date_format),
				endDate=endDate.strftime(date_format),
				goldApisList=goldApisList,
				goldTransactionsList=goldTransactionsList,
				pagination=pagination,
				goldGatewayId=goldGatewayId,
				# pgOrderId=pgOrderId,
				merchantsList=merchantsList,
				merchantId=merchantId,
				# orderId=orderId,
				pgId=pgId,
				pgList=pgList,
				searchId=searchId,
				form=form,
				snoCount=snoCount
				)
	else:
		flash("The staff member does not have permission to view gold transaction.", "danger")
		return render_template("super_admin_templates/gold_transactions_list.html")



def fetching_gold_transaction_details(each_transaction_api):
	transaction_api_dict = {}
	try:
		transaction_api_dict={
			"id":str(each_transaction_api.id),
			"apiName":each_transaction_api.goldTransactionApiId.apiName,
			"paymentapiName":each_transaction_api.paymentGatewayId.apiName,
			"userName":each_transaction_api.userId.fullName,
			"transactionType":each_transaction_api.goldTransactionType,
			"transactionId":each_transaction_api.transactionId,
			"apiTransactionId":each_transaction_api.apiTransactionId,
			"invoiceId":each_transaction_api.invoiceId,
			"currentPrice":each_transaction_api.currentGoldPrice,
			"rateId":each_transaction_api.rateId,
			"purchaseAmount":each_transaction_api.goldPurchaseAmount,
			"purchaseGrams":each_transaction_api.goldPurchaseGrams,
			"purchaseGrandTotal":each_transaction_api.purchaseGrandTotal,
			"paymentGrandTotal":each_transaction_api.paymentGrandTotal,
			"statusCheckId":each_transaction_api.statusCheckId,
			"pgOrderId":each_transaction_api.pgOrderId,
			# "paymentStatus":each_transaction_api.paymentStatus,
			# "purchaseGrams":each_transaction_api.purchaseGrams,
		}

		status=""
		if each_transaction_api.status == 1:
			status = "Success"
		elif each_transaction_api.status == 2:
			status = "Processing"
		elif each_transaction_api.status == 3:
			status = "Initiated"
		elif each_transaction_api.status == 0:
			status = "Failed"
		transaction_api_dict["status"] =status
		paymentStatus=""
		# print("(((((((((((each_transaction_api.paymentStatus)))))))))))",each_transaction_api.paymentStatus)
		if each_transaction_api.paymentStatus == 1:
			paymentStatus = "Success"
		elif each_transaction_api.paymentStatus == 2:
			paymentStatus = "Processing"
		elif each_transaction_api.paymentStatus == 3:
			paymentStatus = "Initiated"
		elif each_transaction_api.paymentStatus == 0:
			paymentStatus = "Failed"
		transaction_api_dict["paymentStatus"] =paymentStatus
		
		if each_transaction_api.createdOn:
			transaction_api_dict["createdOn"] = each_transaction_api.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
		else:
			transaction_api_dict["createdOn"] = ""
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return transaction_api_dict


@gold_master.route("/delete_assign_gold_api",methods=["GET"])
@adminid_access_token_required
def delete_assign_gold_api():
	try:
		existing_record=""
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId=session.get("adminId")

		assignGoldApiPage = request.args.get("assignGoldApiPage")
		redirectTo = url_for("gold_master.gold_assign_apis_list",assignGoldApiPage=assignGoldApiPage)

		latitude = request.args.get("latitude", "")
		longitude = request.args.get("longitude", "")
		loginBrowser = request.headers.get("Sec-Ch-Ua")

		userAgent=""
		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)

		requestData = [existing_record]
		updatedrequestData = [jsonData]

		permissionsList = check_permissions(session.get("adminId"),"goldApiManagementPermissions")
		if "delete" in permissionsList:
			if request.method == "GET":
				goldAssignApiId = request.args.get("goldAssignApiId","")
				assign_gold_payment_gateway_queryset = AssignGoldPaymentGateway.objects(id=goldAssignApiId,status__in=[0,1]).first()
				existing_record = assign_gold_payment_gateway_queryset.to_json()
				requestData = [existing_record]
				updatedrequestData = [request.args.to_dict(flat=True)]
				assign_gold_payment_gateway_queryset.update(status=2)
				flash("Gold Payment Gateway deleted successfully!")
				message=assign_gold_payment_gateway_queryset.adminId.userName+" gold payment gateway deleted successfully!"
				save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_assign_gold_api","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
				return redirect(url_for("gold_master.gold_assign_apis_list"))
		else:
			flash("The staff member does not have permission to delete Gold Assign Api.", "danger")
			return redirect(redirectTo)
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete Gold Payment Gateway!!")
		return redirect(redirectTo)



def fetching_gold_user_balance_details(each_gold_user):
	gold_user_balance_dict = {}
	try:
		gold_user_balance_dict={
			"id":str(each_gold_user.id),
			"apiName":each_gold_user.transactionApiId.apiName,
			"userName":each_gold_user.userId.fullName,
			"apiReferenceId":each_gold_user.apiReferenceId,
			"goldBalanceAmount":each_gold_user.goldBalanceAmount,
			"goldBalanceGrams":each_gold_user.goldBalanceGrams,
			"sellGrams":each_gold_user.sellGrams,
			"sellAmount":each_gold_user.sellAmount,
			"mobileNumber":each_gold_user.mobileNumber,
			"pinCode":each_gold_user.pinCode,
			"email":each_gold_user.email,
			"kycVerify":each_gold_user.kycVerify,
			"aadharNumber":each_gold_user.aadharNumber,
			"panNumber":each_gold_user.panNumber,    
		}

		# status=""
		# if each_gold_user.status == 1:
		#     status = "Success"
		# elif each_gold_user.status == 2:
		#     status = "Processing"
		# elif each_gold_user.status == 3:
		#     status = "Initiated"
		# elif each_gold_user.status == 0:
		#     status = "Failed"
		# gold_user_balance_dict["status"] =status

		if each_gold_user.createdOn:
			gold_user_balance_dict["createdOn"] = each_gold_user.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
		else:
			gold_user_balance_dict["createdOn"] = ""
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return gold_user_balance_dict



@gold_master.route("/gold_user_balance_list",methods=["POST","GET"])
@adminid_access_token_required
def gold_user_balance_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"goldUserBalancePermission")
	if "view" in permissionsList:
		goldTransactionsList = []
		goldApisList = []
		pgList = []
		merchantsList = []
		goldGatewayId=""
		merchantId=""
	   
		searchId=""
		snoCount=0
		per_page = ""
		form = GoldUserBalanceSearchForm(request.args)
		try:
			adminId = session.get("adminId")
		   
			goldGatewayId=request.args.get("goldGatewayId","")
			userId = request.args.get("userId", "")
			pgId = request.args.get("pgId","")

			# Set default date format
			date_format = "%d-%m-%Y"
			pagination = None
			
			if form.validate():

				page = request.args.get(get_page_parameter(), type=int, default=1)
				per_page = 20  # Number of items per page
				start = (page - 1) * per_page
				snoCount = start

				merchants_queryset = Users.objects(status__nin=[2]).only("id","fullName","phoneNumber").order_by("-createdOn")
			   
				merchantsList=list(merchants_queryset)

				gold_queryset = TransactionAPI.objects(transactionType="Gold",status__in=[0,1]).only("id","apiName").order_by("-id")
				
				goldApisList = list(gold_queryset)
				
				pg_queryset = TransactionAPI.objects(transactionType="PaymentGateway",status__in=[0,1]).only("id","apiName" ).order_by("-id")
				pgList = list(pg_queryset)

				query=Q(status__in=[0,1])


				if goldGatewayId:
					query&=Q(transactionApiId=goldGatewayId)
				if userId:
					query&=Q(userId=userId)
				if pgId:
					query &= Q(paymentGatewayId__in=[pgId])

				total_count = GoldUsers.objects(query).count()
				gold_user_balance = GoldUsers.objects(query).order_by("-createdOn").all().skip(start).limit(per_page) 
			   

				for each_payin in gold_user_balance:
					gold_user_balance_dict = fetching_gold_user_balance_details(each_payin)
					goldTransactionsList.append(gold_user_balance_dict)
				pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="payins")
			else:
				print("form errors",form.errors)

			return render_template("super_admin_templates/gold_user_balance_list.html",
			   
				goldTransactionsList=goldTransactionsList,
				goldApisList=goldApisList,
				pagination=pagination,
				pgId=pgId,
				pgList=pgList,
				goldGatewayId=goldGatewayId,
				userId=userId,
				merchantsList=merchantsList,
				merchantId=merchantId,
				form=form,
				snoCount=snoCount
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch gold user balance list!!"
			return render_template("super_admin_templates/gold_user_balance_list.html", 
				error=error,
				
				goldApisList=goldApisList,
				pgId=pgId,
				pgList=pgList,
				goldTransactionsList=goldTransactionsList,
				pagination=pagination,
				goldGatewayId=goldGatewayId,
				userId=userId,
				merchantsList=merchantsList,
				merchantId=merchantId,
				form=form,
				snoCount=snoCount
				)
	else:
		flash("The staff member does not have permission to view gold user balance.", "danger")
		return render_template("super_admin_templates/gold_user_balance_list.html")
