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

auto_collects = Blueprint("auto_collects",__name__)
	

@auto_collects.route("/virtual_accounts_reports",methods=["POST","GET"])
@adminid_access_token_required
def virtual_accounts_reports():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		flash("Session expired. Please log in again.", "danger")
		data_status["responseStatus"]=4
		return data_status
		
	adminId = session.get("adminId")
	transactionAPIsList=[]
	virtualAccountsList = []
	virtualAccountNumber = ""
	selectStatus = ""
	error = ""
	page = ""
	snoCount=0
	pagination = None
	permissionsList = check_permissions(session.get("adminId"),"virtualAccountPermissions")
	form = VirtualAccountSearchForm(request.args)
	if "view" in permissionsList:
		try:
			transaction_API_queryset = TransactionAPI.objects(status=1,transactionType="Payout").order_by('-id')
			for each_transaction_api in transaction_API_queryset:
				transaction_api_dict = {
				"id":str(each_transaction_api.id),
				"apiName":each_transaction_api.apiName
				}
				transactionAPIsList.append(transaction_api_dict)

			virtualAccountNumber = request.args.get("virtualAccountNumber", "")
			selectStatus = request.args.get("selectStatus", "")

			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			total_count=0

			filters = Q(status__in=[0, 1])
			if form.validate():
				if virtualAccountNumber:
					filters &= Q(virtualAccountNumber__icontains=virtualAccountNumber)
				if selectStatus == "Active":
					filters &= Q(status=1)
				elif selectStatus == "Deactive":
					filters &= Q(status=0)

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

				virtual_accounts_queryset = (
						VirtualAccounts.objects(filters)
						.only("id", "gatewayId", "virtualAccountNumber","ifscCode","isThirdParty","status","createdOn")
						.order_by("-id")
						.skip(start)
						.limit(per_page)
				)
				virtualAccountsList=list(virtual_accounts_queryset)
			else:
				print("form errors",form.errors)
				virtualAccountsList = []
				
			snoCount = start
			pagination = Pagination(page=page,total=total_count,per_page=per_page,alignment="right",record_name="virtual account",href=f"?virtualAccountNumber={virtualAccountNumber}&selectStatus={selectStatus}&page={{0}}")

			# virtual_accounts_queryset = VirtualAccounts.objects(status__in=[0, 1]).order_by("-id")

			# if virtualAccountNumber:
			#   virtual_accounts_queryset= virtual_accounts_queryset.filter(virtualAccountNumber__icontains=virtualAccountNumber)


			# status = [0,1]
			# if selectStatus in ["Active","Deactive",""]:
			#   if selectStatus == "Active":
			#       status = [1]
			#   elif selectStatus == "Deactive":
			#       status = [0]
			#   virtual_accounts_queryset = virtual_accounts_queryset.filter(status__in=status)
		
			# for each_virtual_account in virtual_accounts_queryset:
			#   virtualAccountDict = fetching_virtual_account_details(each_virtual_account)
			#   virtualAccountsList.append(virtualAccountDict)


			return render_template("super_admin_templates/virtual_account_list.html",
				transactionAPIsList=transactionAPIsList,
				virtualAccountNumber=virtualAccountNumber,
				selectStatus=selectStatus,
				virtualAccountsList=virtualAccountsList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch virtual accounts data!!"
			return render_template("super_admin_templates/virtual_account_list.html", 
				error=error,
				transactionAPIsList=transactionAPIsList,
				virtualAccountNumber=virtualAccountNumber,
				selectStatus=selectStatus,
				virtualAccountsList=virtualAccountsList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
	else:
		flash("The staff member does not have permission to view Virtual accounts reports.", "danger")
		return redirect(url_for("admin.dashboard"))
		
@auto_collects.route("/white_list_pending_reports",methods=["POST","GET"])
@adminid_access_token_required
def white_list_pending_reports():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		flash("Session expired. Please log in again.", "danger")
		data_status["responseStatus"]=4
		return data_status
	adminId = session.get("adminId")    
	pendingWhiteList = []
	error = ""
	page = ""
	snoCount=0
	pagination = None
	search_element = ""
	permissionsList = check_permissions(session.get("adminId"),"whitelistPendingPermissions")
	form = WhiteListSearchForm(request.args)
	if "view" in permissionsList:
		try:
			search_element = request.args.get("search_element", "")

			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			total_count = 0

			filters = Q(status__in=[0]) 

			if form.validate():
				if search_element:
					filters &= Q(bankBranch__icontains=search_element) | Q(bankName__icontains=search_element)

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

				white_list_accounts_queryset = (
					WhiteListAccounts.objects(filters)
					.only("id", "virtualAccountId","ifscCode","bankName", "whiteListAccountNumber", "bankBranch", "document","status")
					.order_by("-id")
					.skip(start)
					.limit(per_page)
				)

				pendingWhiteList=list(white_list_accounts_queryset)

			else:
				print("Form errors:", form.errors)
				pendingWhiteList = []

			snoCount = start
			pagination = Pagination(page=page,total=total_count,per_page=per_page,alignment="right",record_name="white list account",href=f"?search_element={search_element}&page={{0}}")

			# white_list_accounts_queryset = WhiteListAccounts.objects(status__in=[0]).order_by("-id").all()
			# if search_element:
			#   white_list_accounts_queryset = white_list_accounts_queryset.filter(
			#       Q(bankBranch__icontains=search_element)|Q(bankName__icontains=search_element))
			
			# for each_white_list_account in white_list_accounts_queryset:
			#   whiteListAccountDict = fetching_white_list_account_details(each_white_list_account)
			#   pendingWhiteList.append(whiteListAccountDict)

			return render_template("super_admin_templates/pending_white_list.html",
				domain=domain,
				search_element=search_element,
				pendingWhiteList=pendingWhiteList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch pending white list data!!"
			return render_template("super_admin_templates/pending_white_list.html", 
				domain=domain,
				error=error,
				search_element=search_element,
				pendingWhiteList=pendingWhiteList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
	else:
		flash("The staff member does not have permission to view White list pending reports.", "danger")
		return redirect(url_for("admin.dashboard"))
		

@auto_collects.route("/white_list_account_history",methods=["POST","GET"])
@adminid_access_token_required
def white_list_account_history():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		flash("Session expired. Please log in again.", "danger")
		data_status["responseStatus"]=4
		return data_status
		
	adminId = session.get("adminId")
	whiteListAccountHistory = []
	page = ""
	snoCount=0
	error =""
	pagination = None
	search_element = ""
	permissionsList = check_permissions(session.get("adminId"),"whitelistAccountHistoryPermissions")
	form = WhiteListAccountHistorySearchForm(request.args)
	if "view" in permissionsList:
		try:
			search_element = request.args.get("search_element", "")
			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			total_count = 0

			filters = Q(status__in=[0, 1]) 

			if form.validate():
				if search_element:
					filters &= Q(bankBranch__icontains=search_element) | Q(bankName__icontains=search_element)

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

				white_list_accounts_queryset = (
					WhiteListAccounts.objects(filters)
					.only(
							"id", "bankName", "bankBranch", "createdOn",
							"userId", "whiteListAccountNumber",
							"ifscCode", "virtualAccountId", "document", "status"
						)
					.order_by("-id")
					.skip(start)
					.limit(per_page)
					)
				whiteListAccountHistory=list(white_list_accounts_queryset)
			else:
				print("Form errors:", form.errors)
				whiteListAccountHistory = []

			snoCount = start
			pagination = Pagination(page=page,total=total_count,per_page=per_page,alignment="right",record_name="white list history account",href=f"?search_element={search_element}&page={{0}}")

			# white_list_accounts_queryset = WhiteListAccounts.objects(status__in=[0,1]).order_by("-id").all()
			# if search_element:
			#     white_list_accounts_queryset = white_list_accounts_queryset.filter(
			#         Q(bankBranch__icontains=search_element)|Q(bankName__icontains=search_element))
			
			# for each_white_list_account in white_list_accounts_queryset:
			#     whiteListAccountDict = fetching_white_list_account_details(each_white_list_account)
			#     whiteListAccountHistory.append(whiteListAccountDict)

			return render_template("super_admin_templates/white_list_account_history.html",
				domain=domain,
				search_element=search_element,
				whiteListAccountHistory=whiteListAccountHistory,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch white list account history data!!"
			return render_template("super_admin_templates/white_list_account_history.html", 
				error=error,
				domain=domain,
				search_element=search_element,
				whiteListAccountHistory=whiteListAccountHistory,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
	else:
		flash("The staff member does not have permission to view White list account history reports.", "danger")
		return redirect(url_for("admin.dashboard"))
		

@auto_collects.route("/update_white_list_account_status",methods=["POST","GET"])
@adminid_access_token_required
def update_white_list_account_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")

	page=request.args.get("page")
	search_element = request.args.get("search_element")
	redirectTo=url_for("auto_collects.white_list_pending_reports",page=page,search_element=search_element)
	latitude = request.form.get("latitude", "")
	longitude = request.form.get("longitude", "")
	loginBrowser = request.headers.get("Sec-Ch-Ua")
	if loginBrowser:
		loginBrowseData = loginBrowser.split(";")
		browser = loginBrowseData[0]
	else:
		loginBrowseData = request.headers.get('User-Agent').split(";")
		browser = loginBrowseData[0]
	existing_record = ""
	client_ip=0
	# Extracting client IP address
	if request.headers.getlist("X-Forwarded-For"): 
		client_ip = request.headers.getlist("X-Forwarded-For")[0]
	else:
		client_ip = request.remote_addr

	actionDate=datetime.datetime.now()

	jsonData = request.form.to_dict(flat=True)
	
	updatedrequestData = [jsonData]
	whiteListAccountId = request.args.get("whiteListAccountId","")

	try:
		if whiteListAccountId:
			white_list_account_queryset = WhiteListAccounts.objects(id=whiteListAccountId,status__in=[0]).first()
			existing_record = white_list_account_queryset.to_json()
			requestData = [existing_record]
			if white_list_account_queryset:
				if white_list_account_queryset.status == 0:
					white_list_account_queryset.update(status=1)
					flash("White list account verified successfully!", "success")
					message=" White list account verified successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_white_list_account_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(redirectTo)  
			else:   
				flash("Invaild white list account id!!", "danger")
				return redirect(url_for(redirectTo))   
				
		else:
			flash("Required fields are missing!!", "danger")
			return redirect(redirectTo)
			
	except Exception as e:
		flash("Unable to verified white list account!!", "danger")
		app.logger.error(traceback.format_exc())
		return redirect(redirectTo)
	
		


@auto_collects.route("/auto_collect_transaction_reports_list_data",methods=["POST","GET"])
@adminid_access_token_required
def auto_collect_transaction_reports_list_data():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		flash("Session expired. Please log in again.", "danger")
		data_status["responseStatus"]=4
		return data_status
		
	adminId = session.get("adminId")
	creditNotifyList = []
	page = ""
	snoCount=0
	error =""
	pagination = None
	search_element = ""
	try:
		permissionsList = check_permissions(session.get("adminId"),"autoCollectTransactionReportPermissions")
		form = AutoCollectTransactionSearchForm(request.args)
		if "view" in permissionsList:

			search_element = request.args.get("search_element", "")

			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			total_count=0

			filters = Q(status__in=[0, 1])
			if form.validate():
				if search_element:
					filters &= Q(ecollectAccoutNo__icontains=search_element)
				
				total_count = CreditNotifications.objects(filters).count()

				cred_notifications_queryset = (
						CreditNotifications.objects(filters)
						.only("id", "transactionUniqueId", "userId","ecollectAccoutNo","remitterName","transactionAmount","responseStatus","transactionDate","transferType")
						.order_by("-id")
						.skip(start)
						.limit(per_page)
				)
				creditNotifyList=list(cred_notifications_queryset)
			else:
				print("form errors",form.errors)
				creditNotifyList = []
				
			snoCount = start
			pagination = Pagination(page=page,total=total_count,per_page=per_page,alignment="right",record_name="AutoCollectTransactionReport",href=f"?search_element={search_element}&page={{0}}")

			# cred_notifications_queryset = CreditNotifications.objects(status__in=[0,1]).order_by("-id").all()
			# if search_element:
			#   cred_notifications_queryset = cred_notifications_queryset.filter(
			#       Q(ecollectAccoutNo__icontains=search_element))
			
			# for each_cred_notify in cred_notifications_queryset:
			#   creditNotifyDict = fetching_credit_notifications_details(each_cred_notify)
			#   creditNotifyList.append(creditNotifyDict)

			return render_template("super_admin_templates/auto_collect_transaction_reports.html",
				search_element=search_element,
				creditNotifyList=creditNotifyList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
		else:
			flash("The staff member does not have permission to view Auto collection transaction reports.","danger")
			return redirect(url_for("admin.dashboard"))
			
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to fetch transaction report data!!"
		return render_template("super_admin_templates/auto_collect_transaction_reports.html", 
			error=error,
			search_element=search_element,
			creditNotifyList=creditNotifyList,
			page=page,
			snoCount=snoCount,
			pagination=pagination,
			form=form
			)

@auto_collects.route("/generate_virtual_accounts",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def generate_virtual_accounts():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			flash("session expired.Please login again.")
			data_status["responseStatus"]=4
			return data_status
		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(session.get("adminId"),"virtualAccountPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				transactionAPIId = request.form.get("transactionAPIId","")
				noOfAccounts = request.form.get("noOfAccounts",0)
				remark =  request.form.get("remark","")
				isThirdParty =  request.form.get("isThirdParty",False)
				# escrowDigitNumber =  request.form.get("escrowDigitNumber","")
				
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				# print(len(escrowDigitNumber),"len(escrowDigitNumber)")
				form = VirtualAccountForm()
				if form.validate_on_submit():
					if transactionAPIId and noOfAccounts and remark: 
						try:
							api_query_set = TransactionAPI.objects(id=transactionAPIId,status=1).first()
							if not api_query_set:
								flash("Invalid Request!")
								data_status['responseStatus']=4
								return data_status
							
							api_name=api_query_set.apiName
							virtualCode=api_query_set.virtualCode
							lastSixDigits=api_query_set.lastSixDigits
							if lastSixDigits:
								escrowDigitNumber = lastSixDigits[-6:]
							else:
								escrowDigitNumber = 0

							#escrowDigitNumber = escrowDigitNumber = lastSixDigits[-6:] if lastSixDigits and len(lastSixDigits) >= 6 else None

							ifscCode=api_query_set.ifscCode
							generatedCount=1000
							generatedvaCount=0

							
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							generatedvaCount = GeneratedVirtualAccounts.objects(transactionAPIId = transactionAPIId).sum('noOfAccounts')
							print(generatedCount,"generatedCount")
							if admin_queryset:
								message=admin_queryset.userName+" generated "+api_name+" virtual Accounts successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"generate_virtual_accounts","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
								
							virtual_queryset_table = GeneratedVirtualAccounts(
								adminId=adminId,
								transactionAPIId = transactionAPIId,
								remark = remark,
								virtualAccountPrefix = virtualCode,
								ifscCode = ifscCode,
								escrowDigitNumber = escrowDigitNumber,
								noOfAccounts = int(noOfAccounts),
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = virtual_queryset_table.save()
							gvirtualId = str(save_table.id)
							if gvirtualId:
								for each_nom in range(int(noOfAccounts)):
									print(each_nom,"each_nom")
									randomCount=int(generatedCount)+int(generatedvaCount)+int(each_nom+1)
									print(randomCount,"randomCount")
									virtualAccountNumber=str(virtualCode)+str(escrowDigitNumber)+str(randomCount)

									virtual_queryset_table = VirtualAccounts(
									adminId=adminId,
									gatewayId = transactionAPIId,
									generatedVirtualAccountId = gvirtualId,
									remark = remark,
									isThirdParty = isThirdParty,
									virtualAccountNumber = virtualAccountNumber,
									ifscCode = ifscCode,
									createdOn = datetime.datetime.now(),
									status = 1,
									).save()

							flash("Virtual Accounts Generated successfully!", "success")
							data_status['responseStatus']=1
							return data_status
							
						except Exception as e:
							flash("Unable to generate Virtual Accounts!!", "danger")
							app.logger.error(traceback.format_exc())
							data_status['responseStatus']=4
							return data_status
							
					else:
						data_status['responseStatus']=2
						data_status['result']="Required fields are missing!!"
						return data_status
				else:
					data_status['result']=form.errors
					return data_status   
			else:
				flash("Invalid request.", "danger")
				data_status['responseStatus']=4
				return data_status   
		else:
			flash("The staff member does not have permission to Generate virtual account.", "danger")
			data_status['responseStatus']=4
			return data_status
			
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to generate Virtual Accounts!!", "danger")
		data_status['responseStatus']=4
		return data_status
		

@auto_collects.route("/assign_thirdparty_virtual_account",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def assign_thirdparty_virtual_account():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			flash("session expired.Please login again.")
			data_status["responseStatus"]=4
			return data_status
		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(session.get("adminId"),"assignThirdpartyvirtualAccountPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				userId = request.form.get("userId","")
				virtualAccountId =  request.form.get("virtualAccountId","")
				print(request.form,"request.form")
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				form = AssignedThirdPartyVirtualAccountForm()
				if form.validate_on_submit():
					if userId and virtualAccountId: 
						try:
							api_query_set = AssignedVirtualAccounts.objects(thirdpartyUserId=userId,virtualAccountId=virtualAccountId).first()
							if api_query_set:
								flash("Already virtual account assigned!!", "danger")
								data_status['responseStatus']=4
								return data_status
								
							user_queryset = ThirdPartyMerchants.objects(id=userId).first()
							va_queryset = VirtualAccounts.objects(id=virtualAccountId).first()
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName+" assigned "+va_queryset.virtualAccountNumber+" to "+user_queryset.name+" successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"assign_thirdparty_virtual_account","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
								
							virtual_queryset_table = AssignedVirtualAccounts(
								adminId=adminId,
								virtualAccountId = virtualAccountId,
								isThirdParty = True,
								thirdpartyUserId = userId,
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = virtual_queryset_table.save()
							
							try:
								if user_queryset.enablePayout==True and user_queryset.payoutVAWebhook!="":
									webhookURL=user_queryset.payoutVAWebhook
									print(va_queryset.gatewayId.code,"va_queryset.gatewayId.code")
									headers = {'Content-Type': 'application/json'}
									payload = {
									"responseStatus":1,
									"result":"success",
									"api_key":str(user_queryset.apiKey),
									"api_check":str(va_queryset.gatewayId.code),
									"virtualAccountsDict":{
									"virtualAccountNumber":va_queryset.virtualAccountNumber,
									"ifscCode":va_queryset.ifscCode,
									"status":1
									}
									}
									print(webhookURL,"*****webhookURL****")
									print(payload,"*****payload****")
									respnseData = requests.post(webhookURL, json=payload, headers=headers)
							except Exception as e:
								pass
							flash("Virtual Account Assigned successfully!", "success")
							data_status['responseStatus']=1
							return data_status
							
						except Exception as e:
							flash("Unable to assign Virtual Accounts!!", "danger")
							app.logger.error(traceback.format_exc())
							data_status['responseStatus']=4
							return data_status
							
					else:
						data_status['responseStatus']=2
						data_status['result']="Required fields are missing!!"
						return data_status
				else:
					data_status['result']=form.errors
					return data_status
			else:
				flash("Invalid request.", "danger")
				data_status['responseStatus']=4
				return data_status 
		else:
			flash("The staff member does not have permissions to create Assign third party virtual account.", "danger")
			data_status['responseStatus']=4
			return data_status
			
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to assign Virtual Accounts!!", "danger")
		data_status['responseStatus']=4
		return data_status
		


@auto_collects.route("/assign_virtual_account",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def assign_virtual_account():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			flash("session expired.Please login again.")
			data_status["responseStatus"]=4
			return data_status
		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(session.get("adminId"),"assignvirtualAccountPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				userId = request.form.get("userId","")
				virtualAccountId =  request.form.get("virtualAccountId","")
				print(request.form,"request.form")
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				form = AssignedVirtualAccountForm()
				if form.validate_on_submit():
					if userId and virtualAccountId: 
						try:
							api_query_set = AssignedVirtualAccounts.objects(userId=userId,virtualAccountId=virtualAccountId).first()
							if api_query_set:
								flash("Already virtual account assigned!!", "danger")
								data_status['responseStatus']=4
								return data_status

							
							user_queryset = Users.objects(id=userId).first()
							va_queryset = VirtualAccounts.objects(id=virtualAccountId).first()
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName+" assigned "+va_queryset.virtualAccountNumber+" to "+user_queryset.fullName+" successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"assign_virtual_account","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
								
							virtual_queryset_table = AssignedVirtualAccounts(
								adminId=adminId,
								virtualAccountId = virtualAccountId,
								userId = userId,
								isThirdParty = False,
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = virtual_queryset_table.save()
							
							flash("Virtual Account Assigned successfully!", "success")
							data_status['responseStatus']=1
							return data_status
							
						except Exception as e:
							flash("Unable to assign Virtual Accounts!!", "danger")
							app.logger.error(traceback.format_exc())
							data_status['responseStatus']=4
							return data_status
							
					else:
						data_status['responseStatus']=2
						data_status['result']="Required fields are missing!!"
						return data_status
				else:
					data_status['result']=form.errors
					return data_status
			else:
				flash("Invalid request.", "danger")
				data_status['responseStatus']=4
				return data_status 
		else:
			flash("The staff member does not have permission to Generate assign virtual account.", "danger")
			data_status['responseStatus']=4
			return data_status
			
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to assign Virtual Accounts!!", "danger")
		data_status['responseStatus']=4
		return data_status
		


@auto_collects.route("/assigned_virtual_accounts_list",methods=["POST","GET"])
@adminid_access_token_required
def assigned_virtual_accounts_list():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		flash("Session expired. Please log in again.", "danger")
		data_status["responseStatus"]=4
		return data_status
	adminId = session.get("adminId")

	virtualAccountsList=[]
	assignedVirtualAccountsList=[]
	usersList=[]
	virtualAccountId=""
	userId=""
	error = ""
	page = ""
	snoCount=0
	pagination = None
	permissionsList = check_permissions(session.get("adminId"),"assignvirtualAccountPermissions")
	form = AssignedVirtualAccountFormSearch(request.args)
	if "view" in permissionsList:
		
		try:
			virtualAccountId = request.args.get("virtualAccountId", "")
			userId = request.args.get("userId", "")

			# vaaccounts_queryset = VirtualAccounts.objects(status=1,isThirdParty=False).order_by('-id')
			# for each_va in vaaccounts_queryset:
			#   va_dict = {
			#   "id":str(each_va.id),
			#   "virtualAccountNumber":each_va.virtualAccountNumber
			#   }
			#   virtualAccountsList.append(va_dict)

			vaaccounts_queryset = (
				VirtualAccounts.objects(status=1,isThirdParty=False)
				.only("id","virtualAccountNumber")
				.order_by("-id")
			)
			virtualAccountsList=list(vaaccounts_queryset)
			# users_queryset = ThirdPartyMerchants.objects(status=1).order_by('-id')
			# for each_user in users_queryset:
			#   user_dict = {
			#   "id":str(each_user.id),
			#   "fullName":each_user.name
			#   }
			#   usersList.append(user_dict)
			# users_queryset = Users.objects(status=1).order_by('-id')
			# for each_user in users_queryset:
			#   user_dict = {
			#   "id":str(each_user.id),
			#   "fullName":each_user.fullName
			#   }
			#   usersList.append(user_dict)

			users_queryset = (
				Users.objects(status=1)
				.only("id","fullName")
				.order_by("-id")
			)
			usersList=list(users_queryset)

			# virtual_accounts_queryset = AssignedVirtualAccounts.objects(status__in=[0, 1],isThirdParty=False).order_by("-id")


			# if virtualAccountId:
			#   virtual_accounts_queryset= virtual_accounts_queryset.filter(virtualAccountId=virtualAccountId)
			# if userId:
			#   virtual_accounts_queryset= virtual_accounts_queryset.filter(userId=userId)

		
			# for each_virtual_account in virtual_accounts_queryset:
			#   virtualAccountDict = fetching_assigned_virtual_account_details(each_virtual_account)
			#   assignedVirtualAccountsList.append(virtualAccountDict)

			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page

			total_count=0

			filters = Q(status__in=[0, 1])
			if form.validate():
				if virtualAccountId:
					filters &= Q(virtualAccountId__icontains=virtualAccountId)
				if userId:
					filters &= Q(userId__icontains=userId)

				total_count = AssignedVirtualAccounts.objects(filters,isThirdParty=False).count()
			
				assigned_virtual_accounts_queryset = (
					AssignedVirtualAccounts.objects(filters,isThirdParty=False)
					.only("id", "userId", "virtualAccountId","status","createdOn")
					.order_by("-id")
					.skip(start)
					.limit(per_page)
				)
				assignedVirtualAccountsList=list(assigned_virtual_accounts_queryset)
				
			else:
				print("form errors",form.errors)
				assignedVirtualAccountsList=[]
				

			snoCount = start
		  
			pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="assignedvirtualaccount", href=f"?virtualAccountId={virtualAccountId}&userId={userId}&page={{0}}")


			return render_template("super_admin_templates/assigned_virtual_account_list.html",
				virtualAccountId=virtualAccountId,
				userId=userId,
				virtualAccountsList=virtualAccountsList,
				usersList=usersList,
				assignedVirtualAccountsList=assignedVirtualAccountsList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch virtual accounts data!!"
			return render_template("super_admin_templates/assigned_virtual_account_list.html", 
				error=error,
				virtualAccountId=virtualAccountId,
				userId=userId,
				virtualAccountsList=virtualAccountsList,
				usersList=usersList,
				assignedVirtualAccountsList=assignedVirtualAccountsList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
	else:
		flash("The staff member does not have permission to view Assign virtual accounts reports.","danger")
		return redirect(url_for("admin.dashboard"))
		

@auto_collects.route("/assigned_thirdparty_virtual_accounts_list",methods=["POST","GET"])
@adminid_access_token_required
def assigned_thirdparty_virtual_accounts_list():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		flash("Session expired. Please log in again.", "danger")
		data_status["responseStatus"]=4
		return data_status
	virtualAccountsList=[]
	assignedVirtualAccountsList=[]
	usersList=[]
	thirdPartyList=[]
	virtualAccountId=""
	userId=""
	error = ""
	page = ""
	snoCount=0
	pagination = None
	permissionsList = check_permissions(session.get("adminId"),"assignThirdpartyvirtualAccountPermissions")
	form = AssignedThirdPartyVirtualAccountFormSearch(request.args)
	if "view" in permissionsList:
		try:
			# vaaccounts_queryset = VirtualAccounts.objects(status=1,isThirdParty=True).order_by('-id')
			# for each_va in vaaccounts_queryset:
			#   va_dict = {
			#   "id":str(each_va.id),
			#   "virtualAccountNumber":each_va.virtualAccountNumber
			#   }
			#   virtualAccountsList.append(va_dict)

			vaaccounts_queryset = (
				VirtualAccounts.objects(status=1,isThirdParty=True)
				.only("id","virtualAccountNumber")
				.order_by("-id")
			)
			virtualAccountsList=list(vaaccounts_queryset)

			# users_queryset = ThirdPartyMerchants.objects(status=1).order_by('-id')
			# for each_user in users_queryset:
			#   user_dict = {
			#   "id":str(each_user.id),
			#   "fullName":each_user.name
			#   }
			#   usersList.append(user_dict)

			users_queryset = (
				ThirdPartyMerchants.objects(status=1)
				.only("id","name")
				.order_by("-id")
			)
			usersList=list(users_queryset)

			virtualAccountId = request.args.get("virtualAccountId", "")
			thirdpartyUserId = request.args.get("thirdpartyUserId", "")

			# virtual_accounts_queryset = AssignedVirtualAccounts.objects(status__in=[0, 1],isThirdParty=True).order_by("-id")


			# if virtualAccountId:
			#   virtual_accounts_queryset= virtual_accounts_queryset.filter(virtualAccountId=virtualAccountId)
			# if userId:
			#   virtual_accounts_queryset= virtual_accounts_queryset.filter(thirdpartyUserId=userId)

		
			# for each_virtual_account in virtual_accounts_queryset:
			#   virtualAccountDict = fetching_assigned_virtual_account_details(each_virtual_account)
			#   assignedVirtualAccountsList.append(virtualAccountDict)

			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page

			total_count=0

			filters = Q(status__in=[0, 1])
			if form.validate():
				# if virtualAccountId:
				#   filters &= Q(virtualAccountId=ObjectId(virtualAccountId))
				# if thirdpartyUserId:
				#   filters &= Q(thirdpartyUserId=ObjectId(thirdpartyUserId))
				if virtualAccountId:
					filters &= Q(virtualAccountId=virtualAccountId)
				if thirdpartyUserId:
					filters &= Q(thirdpartyUserId__icontains=thirdpartyUserId)

				total_count = AssignedVirtualAccounts.objects(filters,isThirdParty=True).count()
			
				assigned_virtual_accounts_queryset = (
					AssignedVirtualAccounts.objects(filters,isThirdParty=True)
					.only("id","thirdpartyUserId", "virtualAccountId","status","createdOn")
					.order_by("-id")
					.skip(start)
					.limit(per_page)
				)
				assignedVirtualAccountsList=list(assigned_virtual_accounts_queryset)

				
			else:
				print("form errors",form.errors)
				assignedVirtualAccountsList=[]
				

			snoCount = start
		  
			pagination = Pagination(page=page, total=total_count, per_page=per_page, alignment="right", record_name="assignedvirtualaccount", href=f"?virtualAccountId={virtualAccountId}&thirdpartyUserId={thirdpartyUserId}&page={{0}}")
			return render_template("super_admin_templates/assigned_thirdparty_virtual_accounts_list.html",
				virtualAccountId=virtualAccountId,
				thirdpartyUserId=thirdpartyUserId,
				thirdPartyList=thirdPartyList,
				virtualAccountsList=virtualAccountsList,
				usersList=usersList,
				assignedVirtualAccountsList=assignedVirtualAccountsList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch virtual accounts data!!"
			return render_template("super_admin_templates/assigned_thirdparty_virtual_accounts_list.html", 
				error=error,
				virtualAccountId=virtualAccountId,
				thirdpartyUserId=thirdpartyUserId,
				thirdPartyList=thirdPartyList,
				virtualAccountsList=virtualAccountsList,
				usersList=usersList,
				assignedVirtualAccountsList=assignedVirtualAccountsList,
				page=page,
				snoCount=snoCount,
				pagination=pagination,
				form=form
				)
	else:
		flash("The staff member does not have permission to view Assigned third party virtual accounts reports.","danger")
		return redirect(url_for("admin.dashboard"))
		
