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



auto_beneficiaries = Blueprint("auto_beneficiaries",__name__)

@auto_beneficiaries.route("/add_auto_beneficiary",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_auto_beneficiary():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId = session.get("adminId")
		
		csrf_token = request.form.get("csrf_token")
	  
		latitude = request.form.get("latitude", "")
		longitude = request.form.get("longitude", "")
		loginBrowser = request.headers.get("Sec-Ch-Ua")
		if loginBrowser:
			loginBrowseData = loginBrowser.split(";")
			browser = loginBrowseData[0]
		else:
			loginBrowseData = request.headers.get('User-Agent').split(";")
			browser = loginBrowseData[0]

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

		actionDate=datetime.datetime.now()

		permissionsList = check_permissions(adminId,"autoBeneficiariesListPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
			   
				otp_check_id = request.form.get("otpLogid", "")
			  
				if not otp_check_id:
					flash("Invalid Request.")
					return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))

				otpcheck_queryset = OtpChecks.objects(adminId=adminId, id=str(otp_check_id), status=1).first()

				if not otpcheck_queryset:
					flash("Invalid Request.")
					return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
				# Update OTP status to 2 after verification
				otpcheck_queryset.update(status=2)
				
				transactionAPIId = request.form.get("transactionAPIId")

				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]

				form = AutoBenficiaryListForm()

				if form.validate_on_submit():

					if transactionAPIId:
						try:
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName+" Auto beneficiary created successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_auto_beneficiary","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
							auto_beneificary_table = AutoBeneficiaries(
								adminId=adminId,
								transactionAPIId = transactionAPIId,
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = auto_beneificary_table.save()

							flash("Auto beneficiary saved successfully!")
							data_status['responseStatus']=1
							return data_status
						except Exception as e:
							flash("Unable to save profile details!!")
							app.logger.error(traceback.format_exc())
							data_status['responseStatus']=4
							return data_status
					else:
						flash("Required fields are missing!")
						data_status['responseStatus']=2
						data_status['result']="Required fields are missing!!"
						return data_status
				else:
			  
					data_status['result']=form.errors
					return data_status
			else:
				data_status['responseStatus']=4
				return data_status   
		else:
			flash("The staff member does not have permission to create a Auto Beneficiaries List.","danger")
			data_status['responseStatus']=4
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to save auto beneficiaries details!!")
		data_status['responseStatus']=4
		return data_status


@auto_beneficiaries.route("/update_auto_beneficiary",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_auto_beneficiary():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")  
	csrf_token = request.form.get("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]

	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()
	permissionsList = check_permissions(session.get("adminId"),"autoBeneficiariesListPermissions")
	if "edit" in permissionsList:
		try:
			autoBenificaryId = request.args.get("autoBenificaryId","")
			if request.method == "POST":
				action = request.form.get("action", "").strip()
				data = request.form.to_dict()
				# Step 1: Handle OTP Generation

				otp_check_id = request.form.get("otpLogid", "")
			 
				if not otp_check_id:
					flash("Invalid Request.")
					return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))

				otpcheck_queryset = OtpChecks.objects(adminId=adminId, id=str(otp_check_id), status=1).first()

				if not otpcheck_queryset:
					flash("Invalid Request.")
					return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
				# Update OTP status to 2 after verification
				otpcheck_queryset.update(status=2)

				transactionAPIId = request.form.get("transactionAPIId")

				jsonData = request.form.to_dict(flat=True)
				remark = request.form.get("remark","")


				if autoBenificaryId and transactionAPIId:
					auto_beneficiary_queryset = AutoBeneficiaries.objects(id=autoBenificaryId,status__in=[0,1]).first()
					existing_record = auto_beneficiary_queryset.to_json()
					
					requestData=[existing_record]
					updatedrequestData=[jsonData]
					message=auto_beneficiary_queryset.adminId.userName+" "+transactionAPIId.apiName+" Auto beneficiary updated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_auto_beneficiary","update",actionDate,client_ip,browser,None,requestData,updatedrequestData,latitude,longitude)
					save_remarks_data=save_admin_remarks_data(autoBenificaryId,adminId,remark,"beneficiary") 

					if auto_beneficiary_queryset:
						auto_beneficiary_queryset.update(
							transactionAPIId = ObjectId(transactionAPIId),
							)
						flash("Auto beneficiary updated successfully!")
						return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
					else:
						flash("Invaild id!!")
						return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
				else:
					flash("Required fields are missing!!")
					return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to update auto beneficiaries details!!"
			return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
	else:
		flash("The staff member does not have permission to update Auto Beneficiaries.","danger")
		return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))

@auto_beneficiaries.route("/auto_beneficiaries_list",methods=["POST","GET"])
@adminid_access_token_required
def auto_beneficiaries_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	autoBeneficiariesList = []
	transactionAPIsList = []
	pagination = ""
	search_element=""
	redirectval=""
	snoCount=0
	AutoBenficiariesPage=1

	
	adminId = session.get("adminId")
	permissionsList = check_permissions(session.get("adminId"),"autoBeneficiariesListPermissions")
	if "view" in permissionsList:
		try:
			redirectTo = request.args.get("redirectTo","beneficiaries")
			if redirectTo:
				redirectval = redirectTo
			else:
				redirectval = "beneficiaries"
			search_element = request.form.get("search_element","")
			AutoBenficiariesPage = request.args.get(get_page_parameter("AutoBenficiariesPage"), type=int, default=1)

			per_page = 20
			start = (AutoBenficiariesPage - 1) * per_page

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

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

			auto_beneficiaries_queryset = ( 
				AutoBeneficiaries.objects(filters)
				.only("id","transactionAPIId","createdOn","status")
				.order_by("-id")
				.skip(start)
				.limit(per_page)
			)

			snoCount = start

			autoBeneficiariesList = list(auto_beneficiaries_queryset)

			transaction_API_queryset = TransactionAPI.objects(status=1,preAuthorization=True,transactionType="Payout").only("id","apiName").order_by('-id')

			transactionAPIsList = list(transaction_API_queryset)

			pagination = Pagination(AutoBenficiariesPage=AutoBenficiariesPage, total=total_count, per_page=per_page, page_parameter ="AutoBenficiariesPage", alignment="right", record_name="AutoBenficiaries")


			# auto_beneficiaries_queryset = AutoBeneficiaries.objects(status__in=[0,1]).order_by("-id")
			# # if search_element:
			# #     AutoBeneficiaries_queryset = AutoBeneficiaries_queryset.filter(Q(name__icontains=search_element))

			# for each_record in auto_beneficiaries_queryset:
			#     autoDict = {
			#     "id":str(each_record.id),
			#     "transactionAPIId":str(each_record.transactionAPIId.id),
			#     "transactionAPIName":str(each_record.transactionAPIId.apiName),
			#     "createdOn":each_record.createdOn.strftime("%d-%m-%Y %I:%M %p")
			#     }
			#     if each_record.status == 1:
			#         autoDict["actionText"]="Active"
			#     else:
			#         autoDict["actionText"]="Deactive"
			#     autoBeneficiariesList.append(autoDict)

			# transaction_API_queryset = TransactionAPI.objects(status=1,preAuthorization=True,transactionType="Payout").order_by('-id').all()
			# for each_transaction_api in transaction_API_queryset:
			#     transactionapiDict = {
			#     "id":str(each_transaction_api.id),
			#     "apiName":each_transaction_api.apiName,
			#     "transactionType":each_transaction_api.transactionType
			#     }
			#     transactionAPIsList.append(transactionapiDict)
		

			return render_template("super_admin_templates/auto_beneficiaries_list.html",
				pagination=pagination,
				autoBeneficiariesList=autoBeneficiariesList,
				transactionAPIsList=transactionAPIsList,
				redirectval=redirectval,
				search_element=search_element,
				snoCount = snoCount,
				AutoBenficiariesPage = AutoBenficiariesPage
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch auto beneficiaries details!!"
			return render_template("super_admin_templates/auto_beneficiaries_list.html", 
				error=error,
				pagination=pagination,
				autoBeneficiariesList=autoBeneficiariesList,
				transactionAPIsList=transactionAPIsList,
				redirectval=redirectval,
				search_element=search_element,
				snoCount = snoCount,
				AutoBenficiariesPage = AutoBenficiariesPage
				)
	else:
		flash("The staff member does not have permission to view Auto Beneficiaries.","danger")
		return redirect(url_for("admin.dashboard"))
	


@auto_beneficiaries.route("/update_auto_beneficiary_status",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_auto_beneficiary_status():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	
	csrf_token = request.form.get("csrf_token")
   
	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()

	jsonData = request.form.to_dict(flat=True)

	existing_record = ""
	updatedrequestData = [jsonData]

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

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

	# if remark and not is_valid_alphanumeric(remark):
	#     # flash("Remark must contain only alphanumeric characters, spaces, and specific special characters:@#$()+_-/","danger")
	#     return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",search_element=search_element,AutoBenficiariesPage=AutoBenficiariesPage))
	form=RemarkForm()
	if form.validate_on_submit():
		permissionsList = check_permissions(session.get("adminId"),"autoBeneficiariesListPermissions")
		if "edit" in permissionsList:
			autoBenificaryId = request.args.get("autoBenificaryId","")

			if autoBenificaryId:
				try:
					auto_beneficiary_queryset = AutoBeneficiaries.objects(id=autoBenificaryId,status__in=[0,1]).first()
					existing_record = auto_beneficiary_queryset.to_json()
					requestData = [existing_record]
					if auto_beneficiary_queryset:
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						if auto_beneficiary_queryset.status == 0:
							auto_beneficiary_queryset.update(status=1)
							flash("Auto beneficiary activated successfully!")
							message=admin_queryset.userName+" "+auto_beneficiary_queryset.transactionAPIId.apiName+" Auto beneficiary activated successfully!"
						elif auto_beneficiary_queryset.status == 1:
							auto_beneficiary_queryset.update(status=0)
							flash("Auto beneficiary deactivated successfully!")
							message=admin_queryset.userName+" "+auto_beneficiary_queryset.transactionAPIId.apiName+" Auto beneficiary deactivated successfully!"
						save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_auto_beneficiary_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
						data_status['responseStatus']=1
						return data_status
					else:
						flash("Invaild id!!")
						data_status['responseStatus']=4
						return data_status
				except Exception as e:
					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:
			flash("The staff member does not have permission to update Auto beneficiaries status.","danger")
			data_status['responseStatus']=4
			return data_status
	else:
	 
	   data_status['result']=form.errors
	   return data_status

	# permissionsList = check_permissions(session.get("adminId"),"autoBeneficiariesListPermissions")
	# if "edit" in permissionsList:
	#     autoBenificaryId = request.args.get("autoBenificaryId","")

	#     if autoBenificaryId:
	#         try:
	#             auto_beneficiary_queryset = AutoBeneficiaries.objects(id=autoBenificaryId,status__in=[0,1]).first()
	#             existing_record = auto_beneficiary_queryset.to_json()
	#             requestData = [existing_record]
	#             if auto_beneficiary_queryset:
	#                 admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
	#                 if auto_beneficiary_queryset.status == 0:
	#                     auto_beneficiary_queryset.update(status=1)
	#                     flash("Auto beneficiary activated successfully!")
	#                     message=admin_queryset.userName+" "+auto_beneficiary_queryset.transactionAPIId.apiName+" Auto beneficiary activated successfully!"
	#                 elif auto_beneficiary_queryset.status == 1:
	#                     auto_beneficiary_queryset.update(status=0)
	#                     flash("Auto beneficiary deactivated successfully!")
	#                     message=admin_queryset.userName+" "+auto_beneficiary_queryset.transactionAPIId.apiName+" Auto beneficiary deactivated successfully!"
	#                 save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_auto_beneficiary_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData)
	#                 return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
	#             else:
	#                 flash("Invaild id!!")
	#                 return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
	#         except Exception as e:
	#             app.logger.error(traceback.format_exc())
	#             return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
	#     else:
	#         flash("Required field is missing!!")
	#         return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))
	# else:
	#     flash("Staff member does not have given status update auto Beneficiaries List permissions!!")
	#     return redirect(url_for("auto_beneficiaries.auto_beneficiaries_list",redirectTo="beneficiaries"))