from appservices.common.util import *

auto_collects = Blueprint("auto_collects",__name__)


@auto_collects.route("/virtual_accounts_reports",methods=["POST","GET"])
def virtual_accounts_reports():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"virtualAccountPermissions")
	if "view" in permissionsList:
		transactionAPIsList=[]
		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)
		try:
			adminId = session.get("adminId")
			virtualAccountsList = []

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

			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
				)
		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
				)
	else:
		flash("Staff member does not have given view virtual accounts reports permissions!!")
		return render_template("super_admin_templates/virtual_account_list.html")

@auto_collects.route("/white_list_pending_reports",methods=["POST","GET"])
def white_list_pending_reports():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"whitelistPendingPermissions")
	if "view" in permissionsList:
		try:
			adminId = session.get("adminId")
			pendingWhiteList = []

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


			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",
				search_element=search_element,
				pendingWhiteList=pendingWhiteList
				)
		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", 
				error=error,
				search_element=search_element,
				pendingWhiteList=pendingWhiteList
				)
	else:
		flash("Staff member does not have given view white list pending reports permissions!!")
		return render_template("super_admin_templates/pending_white_list.html")

@auto_collects.route("/white_list_account_history",methods=["POST","GET"])
def white_list_account_history():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"whitelistAccountHistoryPermissions")
	if "view" in permissionsList:
		try:
			adminId = session.get("adminId")
			whiteListAccountHistory = []

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


			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",
				search_element=search_element,
				whiteListAccountHistory=whiteListAccountHistory
				)
		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,
				search_element=search_element,
				whiteListAccountHistory=whiteListAccountHistory
				)
	else:
		flash("Staff member does not have given view white list account history reports permissions!!")
		return render_template("super_admin_templates/white_list_account_history.html")

@auto_collects.route("/update_white_list_account_status",methods=["POST","GET"])
def update_white_list_account_status():
	whiteListAccountId = request.args.get("whiteListAccountId","")

	try:
		if whiteListAccountId:
			white_list_account_queryset = WhiteListAccounts.objects(id=whiteListAccountId,status__in=[0]).first()
			if not white_list_account_queryset:
				flash("Invaild white list account id!!")
				return redirect(url_for("auto_collects.white_list_pending_reports"))

			if white_list_account_queryset.status == 0:
				white_list_account_queryset.update(status=1)
				flash("White list account verified successfully!")
				return redirect(url_for("auto_collects.white_list_pending_reports"))
		else:
			flash("Required fields are missing!!")
			return redirect(url_for("auto_collects.white_list_pending_reports"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to verified white list account!!")
		return redirect(url_for("auto_collects.white_list_pending_reports"))


@auto_collects.route("/auto_collect_transaction_reports_list_data",methods=["POST","GET"])
def auto_collect_transaction_reports_list_data():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")
		permissionsList = check_permissions(session.get("adminId"),"autoCollectTransactionReportPermissions")
		if "view" in permissionsList:
			creditNotifyList = []

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


			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
				)
		else:
			flash("Staff member does not have given view auto collection reports permissions!!")
			return render_template("super_admin_templates/auto_collect_transaction_reports.html")
	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
			)

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

		loginBrowser = request.headers.get("Sec-Ch-Ua")
		if loginBrowser:
			loginBrowseData = loginBrowser.split(";")
			browser = loginBrowseData[0]
		else:
			loginBrowseData = request.headers.get('User-Agent').split(";")
			browser = loginBrowseData[0]

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

		actionDate=datetime.datetime.now()
		

		permissionsList = check_permissions(session.get("adminId"),"virtualAccountPermissions")
		if "view" 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)")
				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!")
							return redirect(url_for("auto_collects.virtual_accounts_reports"))
						api_name=api_query_set.apiName
						virtualCode=api_query_set.virtualCode
						lastSixDigits=api_query_set.lastSixDigits
						escrowDigitNumber = lastSixDigits[-6:]
						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) 
							
						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!")
						return redirect(url_for("auto_collects.virtual_accounts_reports"))
					except Exception as e:
						flash("Unable to generate Virtual Accounts!!")
						app.logger.error(traceback.format_exc())
						return redirect(url_for("auto_collects.virtual_accounts_reports"))
				else:
					flash("Required fields are missing!!")
					return redirect(url_for("auto_collects.virtual_accounts_reports"))
		else:
			flash("Staff member does not have given generate virtual account permissions!!")
			return redirect(url_for("auto_collects.virtual_accounts_reports"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to generate Virtual Accounts!!")
		return redirect(url_for("auto_collects.virtual_accounts_reports"))


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

		loginBrowser = request.headers.get("Sec-Ch-Ua")
		if loginBrowser:
			loginBrowseData = loginBrowser.split(";")
			browser = loginBrowseData[0]
		else:
			loginBrowseData = request.headers.get('User-Agent').split(";")
			browser = loginBrowseData[0]

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

		actionDate=datetime.datetime.now()
		

		permissionsList = check_permissions(session.get("adminId"),"virtualAccountPermissions")
		if "view" 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]
				if userId and virtualAccountId: 
					try:
						api_query_set = AssignedVirtualAccounts.objects(thirdpartyUserId=userId,virtualAccountId=virtualAccountId).first()
						if api_query_set:
							flash("Already virtual account assigned!!")
							print("Already virtual account assigned!!")
							return redirect(url_for("auto_collects.assigned_thirdparty_virtual_accounts_list"))

						
						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) 
							
						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!")
						return redirect(url_for("auto_collects.assigned_thirdparty_virtual_accounts_list"))
					except Exception as e:
						flash("Unable to assign Virtual Accounts!!")
						app.logger.error(traceback.format_exc())
						return redirect(url_for("auto_collects.assigned_thirdparty_virtual_accounts_list"))
				else:
					flash("Required fields are missing!!")
					return redirect(url_for("auto_collects.assigned_thirdparty_virtual_accounts_list"))
		else:
			flash("Staff member does not have given generate virtual account permissions!!")
			return redirect(url_for("auto_collects.assigned_thirdparty_virtual_accounts_list"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to assign Virtual Accounts!!")
		return redirect(url_for("auto_collects.assigned_thirdparty_virtual_accounts_list"))

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

		loginBrowser = request.headers.get("Sec-Ch-Ua")
		if loginBrowser:
			loginBrowseData = loginBrowser.split(";")
			browser = loginBrowseData[0]
		else:
			loginBrowseData = request.headers.get('User-Agent').split(";")
			browser = loginBrowseData[0]

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

		actionDate=datetime.datetime.now()
		

		permissionsList = check_permissions(session.get("adminId"),"virtualAccountPermissions")
		if "view" 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]
				if userId and virtualAccountId: 
					try:
						api_query_set = AssignedVirtualAccounts.objects(userId=userId,virtualAccountId=virtualAccountId).first()
						if api_query_set:
							flash("Already virtual account assigned!!")
							return redirect(url_for("auto_collects.assigned_virtual_accounts_list"))

						
						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,"generate_virtual_accounts","create",actionDate,client_ip,browser,message,requestData,updatedrequestData) 
							
						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!")
						return redirect(url_for("auto_collects.assigned_virtual_accounts_list"))
					except Exception as e:
						flash("Unable to assign Virtual Accounts!!")
						app.logger.error(traceback.format_exc())
						return redirect(url_for("auto_collects.assigned_virtual_accounts_list"))
				else:
					flash("Required fields are missing!!")
					return redirect(url_for("auto_collects.assigned_virtual_accounts_list"))
		else:
			flash("Staff member does not have given generate virtual account permissions!!")
			return redirect(url_for("auto_collects.assigned_virtual_accounts_list"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to assign Virtual Accounts!!")
		return redirect(url_for("auto_collects.assigned_virtual_accounts_list"))

@auto_collects.route("/assigned_virtual_accounts_list",methods=["POST","GET"])
def assigned_virtual_accounts_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"virtualAccountPermissions")
	virtualAccountId=""
	userId=""
	if "view" in permissionsList:
		virtualAccountsList=[]
		assignedVirtualAccountsList=[]
		usersList=[]
		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)
		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)
		try:
			adminId = session.get("adminId")

			virtualAccountId = request.form.get("virtualAccountId", "")
			userId = request.form.get("userId", "")

			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)


			return render_template("super_admin_templates/assigned_virtual_account_list.html",
				virtualAccountId=virtualAccountId,
				userId=userId,
				virtualAccountsList=virtualAccountsList,
				usersList=usersList,
				assignedVirtualAccountsList=assignedVirtualAccountsList
				)
		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
				)
	else:
		flash("Staff member does not have given view virtual accounts reports permissions!!")
		return render_template("super_admin_templates/assigned_virtual_account_list.html")


@auto_collects.route("/assigned_thirdparty_virtual_accounts_list",methods=["POST","GET"])
def assigned_thirdparty_virtual_accounts_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	permissionsList = check_permissions(session.get("adminId"),"virtualAccountPermissions")
	virtualAccountId=""
	userId=""
	if "view" in permissionsList:
		virtualAccountsList=[]
		assignedVirtualAccountsList=[]
		usersList=[]
		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)
		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)
		try:
			adminId = session.get("adminId")

			virtualAccountId = request.form.get("virtualAccountId", "")
			userId = request.form.get("userId", "")

			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)


			return render_template("super_admin_templates/assigned_thirdparty_virtual_accounts_list.html",
				virtualAccountId=virtualAccountId,
				userId=userId,
				virtualAccountsList=virtualAccountsList,
				usersList=usersList,
				assignedVirtualAccountsList=assignedVirtualAccountsList
				)
		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,
				userId=userId,
				virtualAccountsList=virtualAccountsList,
				usersList=usersList,
				assignedVirtualAccountsList=assignedVirtualAccountsList
				)
	else:
		flash("Staff member does not have given view virtual accounts reports permissions!!")
		return render_template("super_admin_templates/assigned_thirdparty_virtual_accounts_list.html")
