from appservices.common.util import *

virtual_accounts = Blueprint("virtual_accounts",__name__)

@virtual_accounts.route("/create_virtual_account",methods=["POST"])
@user_required
def create_virtual_account():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	gatewayId = request.json.get("gatewayId","")
	email = request.json.get("email","")
	mobileNumber = request.json.get("mobileNumber","")
	virtualAccountNumber = request.json.get("virtualAccountNumber","")
	label = request.json.get("label","")
	virtualPaymentAddress = request.json.get("virtualPaymentAddress","")
	remark = request.json.get("remark","")

	try:
		if userId and gatewayId and label and virtualAccountNumber:
			payment_gateway_queryset = TransactionAPI.objects(id=gatewayId,status__in=[0,1]).first()
			if not payment_gateway_queryset:
				data_status["result"]="Invaild gateway id!!"
				return data_status
			virtual_account_table = VirtualAccounts(
				userId=userId,
				gatewayId=gatewayId,
				email=email,
				mobileNumber=mobileNumber,
				label=label,
				virtualAccountNumber=virtualAccountNumber,
				virtualPaymentAddress=virtualPaymentAddress,
				remark=remark,
				createdOn=datetime.datetime.now(),
				status=1
				)
			save_table=virtual_account_table.save()

			data_status["responseStatus"]=1
			data_status["result"]="Virtual account created successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to create virtual account!!"
		return data_status

@virtual_accounts.route("/update_virtual_account",methods=["POST"])
@user_required
def update_virtual_account():
	data_status = {"responseStatus":0,"result":""}
	virtualAccountId = request.json.get("virtualAccountId","")
	userId = request.json.get("userId","")
	email = request.json.get("email","")
	mobileNumber = request.json.get("mobileNumber","")
	virtualAccountNumber = request.json.get("virtualAccountNumber","")
	label = request.json.get("label","")
	virtualPaymentAddress = request.json.get("virtualPaymentAddress","")
	remark = request.json.get("remark","")
	gatewayId = request.json.get("gatewayId","")

	try:
		if virtualAccountId and userId:
			virtual_account_queryset = VirtualAccounts.objects(id=virtualAccountId,userId=userId,status__in=[0,1]).first()
			if not virtual_account_queryset:
				data_status["result"]="Invaild virtual account id!!"
				return data_status

			virtual_account_queryset.update(
				email=email,
				mobileNumber=mobileNumber,
				label=label,
				virtualAccountNumber=virtualAccountNumber,
				virtualPaymentAddress=virtualPaymentAddress,
				remark=remark
				)
			if gatewayId:
				virtual_account_queryset.update(gatewayId=ObjectId(gatewayId))

			data_status["responseStatus"]=1
			data_status["result"]="Virtual account updated successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to update virtual account!!"
		return data_status

@virtual_accounts.route("/activate_or_deactivate_virtual_account_status",methods=["POST"])
@user_required
def activate_or_deactivate_virtual_account_status():
	data_status = {"responseStatus":0,"result":""}
	virtualAccountId = request.json.get("virtualAccountId","")
	userId = request.json.get("userId","")

	try:
		if virtualAccountId and userId:
			virtual_account_queryset = VirtualAccounts.objects(id=virtualAccountId,userId=userId,status__in=[0,1]).first()
			if not virtual_account_queryset:
				data_status["result"]="Invaild virtual account id!!"
				return data_status

			if virtual_account_queryset.status == 0:
				virtual_account_queryset.update(status=1)
				data_status["result"]="Virtual account status activated successfully!"
			elif virtual_account_queryset.status == 1:
				virtual_account_queryset.update(status=0)
				data_status["result"]="Virtual account status deactivated successfully!"

			data_status["responseStatus"]=1
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to update virtual account status!!"
		return data_status

@virtual_accounts.route("/delete_virtual_account",methods=["POST"])
@user_required
def delete_virtual_account():
	data_status = {"responseStatus":0,"result":""}
	virtualAccountId = request.json.get("virtualAccountId","")
	userId = request.json.get("userId","")

	try:
		if virtualAccountId and userId:
			virtual_account_queryset = VirtualAccounts.objects(id=virtualAccountId,userId=userId,status__in=[0,1]).first()
			if not virtual_account_queryset:
				data_status["result"]="Invaild virtual account id!!"
				return data_status
			virtual_account_queryset.update(status=2)

			data_status["responseStatus"]=1
			data_status["result"]="Virtual account deleted successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to delete virtual account!!"
		return data_status

@virtual_accounts.route("/single_view_virtual_account",methods=["POST"])
@user_required
def single_view_virtual_account():
	data_status = {"responseStatus":0,"result":""}
	virtualAccountId = request.json.get("virtualAccountId","")
	userId = request.json.get("userId","")

	try:
		if virtualAccountId and userId:
			virtual_account_queryset = VirtualAccounts.objects(id=virtualAccountId,userId=userId,status__in=[0,1]).first()
			if not virtual_account_queryset:
				data_status["result"]="Invaild virtual_account id!!"
				return data_status

			data_status["responseStatus"]=1
			data_status["result"]="Virtual account fetched data successfully!"
			data_status["virtualAccountDetails"]=fetching_virtual_account_details(virtual_account_queryset)
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch virtual account details!!"
		return data_status

@virtual_accounts.route("/view_all_virtual_accounts",methods=["POST"])
@user_required
def view_all_virtual_accounts():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	virtualAccountNumber = request.json.get("virtualAccountNumber","")
	label = request.json.get("label","")
	selectStatus = request.json.get("selectStatus","")
	virtualAccountsList=[]
	try:
		virtual_accounts_queryset = VirtualAccounts.objects(userId=userId).order_by("-id").all()
		if virtualAccountNumber:
			virtual_accounts_queryset = virtual_accounts_queryset.filter(virtualAccountNumber__icontains=virtualAccountNumber)
		if label:
			virtual_accounts_queryset = virtual_accounts_queryset.filter(label__icontains=label)
		if selectStatus:
			virtual_accounts_queryset = virtual_accounts_queryset.filter(status__in=[selectStatus])
		
		for each_virtual_account in virtual_accounts_queryset:
			virtualAccountDict = fetching_virtual_account_details(each_virtual_account)
			virtualAccountsList.append(virtualAccountDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "Virtual accounts fetched data successfully!"
		data_status["virtualAccountsList"] = virtualAccountsList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch virtual accounts data!!"
		return data_status

@virtual_accounts.route("/payment_gateways_list",methods=["POST"])
@user_required
def payment_gateways_list():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	paymentGateWaysList=[]
	try:
		payment_gateways_queryset = TransactionAPI.objects(Q(transactionType="PaymentGateway")|Q(transactionType="Payout"),status__in=[0,1]).order_by("-id").all()
		for each_payment_gateway in payment_gateways_queryset:
			paymentGatewayDict = fetching_transaction_api_details(each_payment_gateway)
			paymentGateWaysList.append(paymentGatewayDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "Payment gateways fetched data successfully!"
		data_status["paymentGateWaysList"] = paymentGateWaysList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch payment gateways data!!"
		return data_status


##################### White List Account API's Here #############################
@virtual_accounts.route("/create_white_list_account",methods=["POST"])
@user_required
def create_white_list_account():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	virtualAccountId = request.json.get("virtualAccountId","")
	whiteListAccountNumber = request.json.get("whiteListAccountNumber","")
	ifscCode = request.json.get("ifscCode","")
	bankBranch = request.json.get("bankBranch","")
	bankName = request.json.get("bankName","")
	bankDocumentName = request.json.get("bankDocumentName","")
	document = request.json.get("document","")

	try:
		if userId and virtualAccountId and whiteListAccountNumber and bankName and ifscCode:
			virtual_account_queryset = VirtualAccounts.objects(id=virtualAccountId,status__in=[0,1]).first()
			if not virtual_account_queryset:
				data_status["result"]="Invaild virtual account id!!"
				return data_status
			white_list_account_table = WhiteListAccounts(
				userId=userId,
				virtualAccountId=virtualAccountId,
				whiteListAccountNumber=whiteListAccountNumber,
				ifscCode=ifscCode,
				bankName=bankName,
				bankBranch=bankBranch,
				bankDocumentName=bankDocumentName,
				createdOn=datetime.datetime.now(),
				status=0
				)
			save_table=white_list_account_table.save()

			if document:
				document_data = upload_file_image(document, "whitelistdocuments", str(get_epoch_milli_time()), "")
				if document_data:
					save_table.update(document=document_data)

			data_status["responseStatus"]=1
			data_status["result"]="White list account created successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to create white list account!!"
		return data_status

@virtual_accounts.route("/update_white_list_account",methods=["POST"])
@user_required
def update_white_list_account():
	data_status = {"responseStatus":0,"result":""}
	whiteListAccountId = request.json.get("whiteListAccountId","")
	userId = request.json.get("userId","")
	virtualAccountId = request.json.get("virtualAccountId","")
	whiteListAccountNumber = request.json.get("whiteListAccountNumber","")
	ifscCode = request.json.get("ifscCode","")
	bankBranch = request.json.get("bankBranch","")
	bankName = request.json.get("bankName","")
	bankDocumentName = request.json.get("bankDocumentName","")
	document = request.json.get("document","")

	try:
		if whiteListAccountId and userId:
			white_list_account_queryset = WhiteListAccounts.objects(id=whiteListAccountId,userId=userId,status__in=[0,1]).first()
			if not white_list_account_queryset:
				data_status["result"]="Invaild white list account id!!"
				return data_status

			white_list_account_queryset.update(
				whiteListAccountNumber=whiteListAccountNumber,
				ifscCode=ifscCode,
				bankName=bankName,
				bankBranch=bankBranch,
				bankDocumentName=bankDocumentName
				)
			if virtualAccountId:
				white_list_account_queryset.update(virtualAccountId=ObjectId(virtualAccountId))

			if document:
				document_data = upload_file_image(document, "whitelistdocuments", str(get_epoch_milli_time()), "")
				if document_data:
					white_list_account_queryset.update(document=document_data)

			data_status["responseStatus"]=1
			data_status["result"]="White list account updated successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to update white list account!!"
		return data_status

@virtual_accounts.route("/activate_or_deactivate_white_list_account_status",methods=["POST"])
@user_required
def activate_or_deactivate_white_list_account_status():
	data_status = {"responseStatus":0,"result":""}
	whiteListAccountId = request.json.get("whiteListAccountId","")
	userId = request.json.get("userId","")

	try:
		if whiteListAccountId and userId:
			white_list_account_queryset = WhiteListAccounts.objects(id=whiteListAccountId,userId=userId,status__in=[0,1]).first()
			if not white_list_account_queryset:
				data_status["result"]="Invaild white list account id!!"
				return data_status

			if white_list_account_queryset.status == 0:
				white_list_account_queryset.update(status=1)
				data_status["result"]="White list account status activated successfully!"
			elif white_list_account_queryset.status == 1:
				white_list_account_queryset.update(status=0)
				data_status["result"]="White list account status deactivated successfully!"

			data_status["responseStatus"]=1
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to update white list account status!!"
		return data_status

@virtual_accounts.route("/delete_white_list_account",methods=["POST"])
@user_required
def delete_white_list_account():
	data_status = {"responseStatus":0,"result":""}
	whiteListAccountId = request.json.get("whiteListAccountId","")
	userId = request.json.get("userId","")

	try:
		if whiteListAccountId and userId:
			white_list_account_queryset = WhiteListAccounts.objects(id=whiteListAccountId,userId=userId,status__in=[0,1]).first()
			if not white_list_account_queryset:
				data_status["result"]="Invaild white list account id!!"
				return data_status
			white_list_account_queryset.update(status=2)

			data_status["responseStatus"]=1
			data_status["result"]="White list account deleted successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to delete white list account!!"
		return data_status

@virtual_accounts.route("/single_view_white_list_account",methods=["POST"])
@user_required
def single_view_white_list_account():
	data_status = {"responseStatus":0,"result":""}
	whiteListAccountId = request.json.get("whiteListAccountId","")
	userId = request.json.get("userId","")

	try:
		if whiteListAccountId and userId:
			white_list_account_queryset = WhiteListAccounts.objects(id=whiteListAccountId,userId=userId,status__in=[0,1]).first()
			if not white_list_account_queryset:
				data_status["result"]="Invaild white list account id!!"
				return data_status

			data_status["responseStatus"]=1
			data_status["result"]="White list account fetched data successfully!"
			data_status["whiteListAccountDetails"]=fetching_white_list_account_details(white_list_account_queryset)
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch white list account details!!"
		return data_status

@virtual_accounts.route("/view_all_white_list_accounts",methods=["POST"])
@user_required
def view_all_white_list_accounts():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	search_element = request.json.get("search_element","")
	whiteListAccountsList=[]
	try:
		virtualAccountIds = []
		virtual_accounts_queryset = VirtualAccounts.objects(virtualAccountNumber__icontains=search_element)
		virtualAccountIds = [str(each_virtual_account.id) for each_virtual_account in virtual_accounts_queryset]

		white_list_accounts_queryset = WhiteListAccounts.objects(userId=userId,status__in=[0,1]).order_by("-id").all()
		if search_element:
			white_list_accounts_queryset = white_list_accounts_queryset.filter(
				Q(whiteListAccountNumber__icontains=search_element)|Q(bankName__icontains=search_element)|Q(virtualAccountId__in=virtualAccountIds))
		
		for each_white_list_account in white_list_accounts_queryset:
			whiteListAccountDict = fetching_white_list_account_details(each_white_list_account)
			whiteListAccountsList.append(whiteListAccountDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "White list accounts fetched data successfully!"
		data_status["whiteListAccountsList"] = whiteListAccountsList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch white list accounts data!!"
		return data_status