from appservices.common.util import *
from appservices.common.form_schemas import *

gold_buy_transactions = Blueprint("gold_buy_transactions",__name__)


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=""
		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_buy_transactions.route("/gold_buy_success_transactions_list",methods=["POST","GET"])
@adminid_access_token_required
def gold_buy_success_transactions_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"goldBuySuccessTransactionPermission")
	if "view" in permissionsList:
		goldTransactionsList = []
		goldApisList = []
		merchantsList = []
		goldGatewayId=""
		merchantId=""
		pgList=[]
		pgId=""
		searchId=""
		snoCount=0
		per_page = ""
		form = GoldTransactionSuccessForm(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)

				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,2,3,4,5],createdOn__gte=startDate,createdOn__lte=endDate)
				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=1,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 merchantId:
								# payouts_queryset = payouts_queryset.filter(userId__in=[merchantId])
						query &= Q(goldUserId=merchantId)              
					if pgId:
							# payin_queryset = payin_queryset.filter(paymentGatewayId__in=[pgId])
						query &= Q(paymentGatewayId=pgId)

				total_count = GoldTransactions.objects(query).count()
				gold_transaction_reports = GoldTransactions.objects(query).order_by("-createdOn").all().skip(start).limit(per_page) 
				for each_payin in gold_transaction_reports:
					payinDict = fetching_gold_transaction_details(each_payin)
					goldTransactionsList.append(payinDict)

				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_buy_transactions.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_buy_transactions.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 buy success transaction details.", "danger")
		return render_template("super_admin_templates/gold_buy_transactions.html")



@gold_buy_transactions.route("/gold_buy_failed_transactions_list",methods=["POST","GET"])
@adminid_access_token_required
def gold_buy_failed_transactions_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"goldBuyFailedPermission")
	if "view" in permissionsList:
		goldTransactionsList = []
		goldApisList = []
		merchantsList = []
		goldGatewayId=""
		merchantId=""
		pgList=[]
		searchId=""
		snoCount=0
		per_page = ""
		form = GoldTransactionPendingForm(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")

				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)

				
				pg_queryset = TransactionAPI.objects(transactionType="PaymentGateway",status__in=[0,1]).only("id","apiName" ).order_by("-id")
				pgList = list(pg_queryset)
				# query=Q(status=0)
				# query=Q(status__in=[0,1,2,3,4,5],createdOn__gte=startDate,createdOn__lte=endDate)
				# query=Q(status=0,createdOn__gte=startDate,createdOn__lte=endDate)
				# query=Q(status=0,createdOn__gte=startDate,createdOn__lte=endDate)
				# query=(Q(createdOn__gte=startDate) & Q(createdOn__lte=endDate) & Q(status=0) | Q(paymentStatus=0))
				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=0,createdOn__gte=startDate,createdOn__lte=endDate,goldTransactionType="Credit")
					# query = Q(createdOn__gte=startDate) & Q(createdOn__lte=endDate) & (Q(status=0) | Q(paymentStatus=0))
					if goldGatewayId:
						# gold_transaction_reports = gold_transaction_reports.filter(transactionApiId__in=[goldGatewayId])
						query&=Q(goldTransactionApiId=goldGatewayId)
					if merchantId:
								# payouts_queryset = payouts_queryset.filter(userId__in=[merchantId])
						query &= Q(goldUserId=merchantId)

					if pgId:
							# payin_queryset = payin_queryset.filter(paymentGatewayId__in=[pgId])
						query &= Q(paymentGatewayId=pgId)

				

				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)
					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_failed_transactions.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 failed transaction!!"
			return render_template("super_admin_templates/gold_failed_transactions.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 failed transaction details.", "danger")
		return render_template("super_admin_templates/gold_failed_transactions.html")




@gold_buy_transactions.route("/gold_buy_pending_transactions_list",methods=["POST","GET"])
@adminid_access_token_required
def gold_buy_pending_transactions_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"goldBuyPendingTransactionPermission")
	if "view" in permissionsList:
		goldTransactionsList = []
		goldApisList = []
		merchantsList = []
		goldGatewayId=""
		merchantId=""
		pgList=[]
		searchId=""
		snoCount=0
		per_page = ""
		form = GoldTransactionFailForm(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")

				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)
								  

				pg_queryset = TransactionAPI.objects(transactionType="PaymentGateway",status__in=[0,1]).only("id","apiName" ).order_by("-id")
				pgList = list(pg_queryset)
				# query=Q(status=0)
				# query=Q(status__in=[0,1,2,3,4,5],createdOn__gte=startDate,createdOn__lte=endDate)
				# query=Q(status=0,createdOn__gte=startDate,createdOn__lte=endDate)
				# query=Q(status=0,createdOn__gte=startDate,createdOn__lte=endDate)
				query=Q()

				if searchId:
					query &= Q(transactionId__icontains=searchId) | Q(pgOrderId__icontains=searchId)
				
				else:
					query=(Q(createdOn__gte=startDate,createdOn__lte=endDate,goldTransactionType="Credit",paymentStatus=1,status__in=[2,3]))
					if goldGatewayId:
						query&=Q(goldTransactionApiId=goldGatewayId)
					if merchantId:
						query &= Q(goldUserId=merchantId)
					if pgId:
						# payin_queryset = payin_queryset.filter(paymentGatewayId__in=[pgId])
						query &= Q(paymentGatewayId=pgId)
				

				total_count = GoldTransactions.objects(query).count()
				gold_transaction_reports = GoldTransactions.objects(query).order_by("-createdOn").all().skip(start).limit(per_page) 

				for each_payin in gold_transaction_reports:
					payinDict = fetching_gold_transaction_details(each_payin)
					goldTransactionsList.append(payinDict)

				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_buy_pending_transactions.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 buy pending transaction list!!"
			return render_template("super_admin_templates/gold_buy_pending_transactions.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 buy pending transaction details.", "danger")
		return render_template("super_admin_templates/gold_buy_pending_transactions.html")


@gold_buy_transactions.route("/gold_buy_pending_payment_list",methods=["POST","GET"])
@adminid_access_token_required
def gold_buy_pending_payment_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"goldBuyPendingPaymentPermission")
	if "view" in permissionsList:
		goldTransactionsList = []
		goldApisList = []
		merchantsList = []
		goldGatewayId=""
		merchantId=""
		pgList=[]
		searchId=""
		snoCount=0
		per_page = ""
		form = GoldPendingPaymentForm(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  
				start = (page - 1) * per_page
				snoCount = start

				merchants_queryset = GoldUsers.objects(status__nin=[2]).only("id","userId").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=0)
				# query=Q(status__in=[0,1,2,3,4,5],createdOn__gte=startDate,createdOn__lte=endDate)
				# query=Q(status=0,createdOn__gte=startDate,createdOn__lte=endDate)
				# query=Q(status=0,createdOn__gte=startDate,createdOn__lte=endDate)
				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(createdOn__gte=startDate,createdOn__lte=endDate,goldTransactionType="Credit",paymentStatus__in=[2,3]))
					if goldGatewayId:
						# gold_transaction_reports = gold_transaction_reports.filter(transactionApiId__in=[goldGatewayId])
						query&=Q(goldTransactionApiId=goldGatewayId)
					if merchantId:
								# payouts_queryset = payouts_queryset.filter(userId__in=[merchantId])
						query &= Q(goldUserId=merchantId)

					if pgId:
							# payin_queryset = payin_queryset.filter(paymentGatewayId__in=[pgId])
						query &= Q(paymentGatewayId=pgId)

					

				total_count = GoldTransactions.objects(query).count()
				gold_transaction_reports = GoldTransactions.objects(query).order_by("-createdOn").all().skip(start).limit(per_page) 

				for each_payin in gold_transaction_reports:
					payinDict = fetching_gold_transaction_details(each_payin)
					goldTransactionsList.append(payinDict)

				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_buy_pending_payment_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 buy pending payment list!!"
			return render_template("super_admin_templates/gold_buy_pending_payment_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 buy pending payment details.", "danger")
		return render_template("super_admin_templates/gold_buy_pending_payment_list.html")



@gold_buy_transactions.route("/gold_buy_payment_failed_transactions_list",methods=["POST","GET"])
@adminid_access_token_required
def gold_buy_payment_failed_transactions_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"goldBuyPaymentFailedPermission")
	if "view" in permissionsList:
		goldTransactionsList = []
		goldApisList = []
		merchantsList = []
		goldGatewayId=""
		merchantId=""
		pgList=[]
		searchId=""
		snoCount=0
		per_page = ""
		form = GoldBuyPaymentFailedForm(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")

				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)

				
				pg_queryset = TransactionAPI.objects(transactionType="PaymentGateway",status__in=[0,1]).only("id","apiName" ).order_by("-id")
				pgList = list(pg_queryset)
				# query=Q(status=0)
				# query=Q(status__in=[0,1,2,3,4,5],createdOn__gte=startDate,createdOn__lte=endDate)
				# query=Q(status=0,createdOn__gte=startDate,createdOn__lte=endDate)
				# query=Q(status=0,createdOn__gte=startDate,createdOn__lte=endDate)
				# query=(Q(createdOn__gte=startDate) & Q(createdOn__lte=endDate) & Q(status=0) | Q(paymentStatus=0))
				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,paymentStatus=0,goldTransactionType="Credit")
					if goldGatewayId:
						query&=Q(goldTransactionApiId=goldGatewayId)
					if merchantId:
						query &= Q(goldUserId=merchantId)


					if pgId:
							# payin_queryset = payin_queryset.filter(paymentGatewayId__in=[pgId])
						query &= Q(paymentGatewayId=pgId)
					

				total_count = GoldTransactions.objects(query).count()
				gold_transaction_reports = GoldTransactions.objects(query).order_by("-createdOn").all().skip(start).limit(per_page) 

				for each_payin in gold_transaction_reports:
					payinDict = fetching_gold_transaction_details(each_payin)
					goldTransactionsList.append(payinDict)

				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_buy_payment_failed_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 payment failed transaction list!!"
			return render_template("super_admin_templates/gold_buy_payment_failed_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 buy payment failed transaction details", "danger")
		return render_template("super_admin_templates/gold_buy_payment_failed_transactions_list.html")
