import math
from appservices.common.util import *
from appservices.common.form_schemas import *

sms_apis = Blueprint("sms_apis",__name__)


# Add sms API


def fetching_sms_api_details(sms_apis_queryset):
	sms_api_dict = {}
	try:
		sms_api_dict={
		"id":str(sms_apis_queryset.id),
		"apiName":sms_apis_queryset.apiName,
		"code":sms_apis_queryset.code,
		}
		if sms_apis_queryset.paramsList:
			sms_api_dict["paramsList"] = sms_apis_queryset.paramsList
		else:
			sms_api_dict["paramsList"] = ""

		if sms_apis_queryset.status==1:
			sms_api_dict["actionText"] = "Active"
		else:
			sms_api_dict["actionText"] = "Deactive"

		if sms_apis_queryset.createdOn:
			sms_api_dict["createdOn"] = sms_apis_queryset.createdOn.strftime("%m-%d-%Y")
		else:
			sms_api_dict["createdOn"] = ""

	except Exception as e:
		app.logger.error(traceback.format_exc())
	return sms_api_dict



# View All sms API's
@sms_apis.route("/sms_apis_list",methods=["POST","GET"])
@adminid_access_token_required
def sms_apis_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId = session.get("adminId")
	
	permissionsList = check_permissions(adminId,"smsApiPermissions")
	if "view" in permissionsList:    
		smsAPIList =[]
		assignSmsList = []
		smsTemplatesList=[]
		redirectto = request.args.get('redirectto','smsApis')
		search_element = ""
		assign_search_element = ""
		smstemplate_search_element = ""
		smsSnoCount = 0
		assignSmsSnoCount = 0
		smsTemplateSnoCount = 0
		pagination = ""
		assignSmsPagination = ""
		smsTemplatePagination = ""
		smsForm  = smsSearchForm(request.args)        
		assignSmsForm = assignSmsSearchForm(request.args)
		smsTemplateForm = smsTemplateSearchForm(request.args)
		smsPage=1
		assignSmsPage = 1
		smsTemplatePage=1


		try:
			if redirectto:
				redirectval=redirectto
			else:
				redirectval="smsApis"

			search = False  
			search_element = request.args.get('search_element','')
			assign_search_element = request.args.get("assign_search_element","")
			smstemplate_search_element = request.args.get("smstemplate_search_element","")

			if search_element:
				redirectval="smsApis"
			elif assign_search_element:
				redirectval="AssignSms"
			elif smstemplate_search_element:
				redirectval="smsTemplates"
			# if search_element:
			#     search = True
				
			# if not assign_search_element:
			#     assign_search_element = request.args.get("assign_search_element","")
			# if assign_search_element:
			#     search = True
				
			# if not smstemplate_search_element:
			#     smstemplate_search_element = request.args.get("smstemplate_search_element","")
			# if smstemplate_search_element:
			#     search = True

			# page = request.args.get(get_page_parameter(), type=int, default=1)
			# page_start,page_end=fetch_limit_length_based_on_page_index(page,10)
			# pagination = Pagination(
			#     page=page,
			#     record_name='api_master',
			#     per_page=10,
			#     alignment="right"
			#     )

			 ######### sms Api ############
			
			smsPage = request.args.get("smsPage", type=int, default=1)
			per_page = 20
			page_start = (smsPage - 1) * per_page
			total_count = 0
			smsAPIList = []
			filters = Q(status__in=[0,1])
			if smsForm.validate():
				if search_element:
					filters &= Q(apiName__icontains=search_element)

				try:
					total_count = smsApis.objects(filters).count()
					temp = math.ceil(total_count/per_page)
					if smsPage>temp:
						page_start = 0
						smsPage = 1

					sms_apis_queryset = (
						smsApis.objects(filters)
						.only("id","apiName","paramsList","code", "status")
						.order_by("-id")
						.skip(page_start)
						.limit(per_page)
						)
					smsAPIList = list(sms_apis_queryset)
				except Exception as e:
					print("1. Error during DB query:", e)
					smsAPIList = []
					total_count = 0
			else:
				smsAPIList = []
				total_count = 0

			smsSnoCount = page_start
			pagination = Pagination(
				smsPage=smsPage,
				total=total_count,
				page_parameter="smsPage",
				record_name='sms_api_list',
				per_page=per_page,
				alignment="right",
				href=f"?search_element={search_element}&smsPage={{0}}"
				)
			#length = transaction_apis_queryset.count()
			#transaction_apis_queryset=transaction_apis_queryset[page_start:page_end]

			# for each_sms_api in sms_apis_queryset:
			#     sms_api_dict = fetching_sms_api_details(each_sms_api)
			#     smsAPIList.append(sms_api_dict)

			  ######### Assign sms ############
			# assign_search_element = request.args.get("assign_search_element")

			assignSmsPage = request.args.get("assignSmsPage", type=int, default=1)
			print("((((((((((assignSmsPage))))))))))",assignSmsPage)
			print("(((((((((((((re)))))))))))))", redirectval)
			per_page = 20
			page_start = (assignSmsPage - 1) * per_page
			total_count = 0
			filters = Q(status__in=[0,1])
			assignSmsList = []

			if assignSmsForm.validate():
				if assign_search_element:
					matching_apis = smsApis.objects(apiName__icontains=assign_search_element).only('id')
					matching_ids = [api.id for api in matching_apis]
					filters &= Q(smsApiId__in=matching_ids)

				try:

					total_count = AssignSms.objects(filters).count()
					temp = math.ceil(total_count/per_page)
					if assignSmsPage>temp:
						page_start = 0
						assignSmsPage = 1

					assign_sms_queryset = (
						AssignSms.objects(filters)
						.only("id", "status", "otpTypeList", "smsApiId")  # Field projection
						.order_by("-id")
						.skip(page_start)
						.limit(per_page)
						.select_related()
						)
					
					
					for sms in assign_sms_queryset:
						print("(((((((####### asign)))))))",sms.smsApiId.apiName if sms.smsApiId else None,)
						assignSmsList.append({
							"id": str(sms.id),
							"status": sms.status,
							"otpTypeList": sms.otpTypeList,
							"apiName": sms.smsApiId.apiName if sms.smsApiId else None,
							"smsApiId": str(sms.smsApiId.id)
						})
					
					print("((((((((((((((2 list))))))))))))))", assignSmsList)
				except Exception as e:
					print("2. Error during DB query:", e)
					assignSmsList = []
					total_count = 0
			else:
				assignSmsList = []
				total_count = 0
			
			assignSmsSnoCount = page_start
			assignSmsPagination = Pagination(
				assignSmsPage=assignSmsPage,
				total=total_count,
				page_parameter="assignSmsPage",
				record_name='sms_api_list',
				per_page=per_page,
				alignment="right",
				href=f"?redirectto=AssignSms&assign_search_element={assign_search_element}&assignSmsPage={{0}}"
				)
			


			smsTemplatePage = request.args.get("smsTemplatePage", type=int, default=1)
			per_page = 20
			page_start = (smsTemplatePage - 1) * per_page
			total_count = 0
			filters = Q(status__in=[0,1])
			
			smsTemplatesList = []
			if smsTemplateForm.validate():
				if smstemplate_search_element:
					matching_apis = smsApis.objects(apiName__icontains=smstemplate_search_element).only('id')
					matching_ids = [api.id for api in matching_apis]
					filters &= Q(smsApiId__in=matching_ids)

				try:
					total_count = SmsTemplates.objects(filters).count()
					temp = math.ceil(total_count/per_page)
					if smsTemplatePage>temp:
						page_start = 0
						smsTemplatePage = 1
					#########  sms Templates ############
					sms_templates_queryset = (
						SmsTemplates.objects(filters)
						.only("id", "status", "templateContent","otpTypeList", "smsApiId")  # Field projection
						.order_by("-id")
						.skip(page_start)
						.limit(per_page)
						.select_related()
						)
					
					for sms in sms_templates_queryset:
						smsTemplatesList.append({
							"id": str(sms.id),
							"status": sms.status,
							"otpTypeList": sms.otpTypeList,
							"apiName": sms.smsApiId.apiName if sms.smsApiId else None,
							"templateContent": sms.templateContent,
							"smsApiId": str(sms.smsApiId.id)
						})
				except Exception as e:
					print("3. Error during DB query:", e)
					smsTemplatesList = []
					total_count = 0
			else:
				smsTemplatesList = []
				total_count = 0
				
			
			smsTemplateSnoCount = page_start

			# if smstemplate_search_element:
			#     sms_templates_queryset = [sms_templates for sms_templates in sms_templates_queryset 
			#                               if smstemplate_search_element.lower() in sms_templates.smsApiId.apiName.lower()]

			# for each_sms_template in sms_templates_queryset:
			#     sms_templates_dict = fetching_sms_templates_details(each_sms_template)
			#     smsTemplatesList.append(sms_templates_dict)

			
			smsTemplatePagination = Pagination(
				smsTemplatePage=smsTemplatePage,
				total=total_count,
				page_parameter="smsTemplatePage",
				record_name='sms_api_list',
				per_page=per_page,
				alignment="right",
				href=f"?redirectto=smsTemplates&smstemplate_search_element={smstemplate_search_element}&smsTemplatePage={{0}}"
				)

	   

			return render_template("super_admin_templates/sms_apis_list.html",
				search_element=search_element,
				assign_search_element=assign_search_element,
				smstemplate_search_element=smstemplate_search_element,
				smsAPIList=smsAPIList,
				assignSmsList=assignSmsList,
				smsTemplatesList=smsTemplatesList,
				redirectval = redirectval,
				smsForm = smsForm,
				assignSmsForm = assignSmsForm,
				smsTemplateForm = smsTemplateForm,
				smsSnoCount = smsSnoCount,
				assignSmsSnoCount = assignSmsSnoCount,
				smsTemplateSnoCount = smsTemplateSnoCount,
				pagination = pagination,
				assignSmsPagination = assignSmsPagination,
				smsTemplatePagination = smsTemplatePagination,
				smsPage=smsPage,
				assignSmsPage = assignSmsPage,
				smsTemplatePage=smsTemplatePage

				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch Sms api details!!"
			return render_template("super_admin_templates/sms_apis_list.html",
				search_element=search_element,
				assign_search_element=assign_search_element,
				smstemplate_search_element=smstemplate_search_element,
				smsAPIList=smsAPIList,
				assignSmsList=assignSmsList,
				redirectval = redirectval,
				smsTemplatesList=smsTemplatesList,
				smsForm = smsForm,
				assignSmsForm = assignSmsForm,
				smsTemplateForm = smsTemplateForm,
				smsSnoCount = smsSnoCount,
				assignSmsSnoCount = assignSmsSnoCount,
				smsTemplateSnoCount = smsTemplateSnoCount,
				pagination = pagination,
				assignSmsPagination = assignSmsPagination,
				smsTemplatePagination = smsTemplatePagination,
				smsPage=smsPage,
				assignSmsPage = assignSmsPage,
				smsTemplatePage=smsTemplatePage
				)
	else:
		flash("The staff member does not have permission to view Sms Api.", "danger")
		return render_template("super_admin_templates/sms_apis_list.html")


@sms_apis.route("/add_sms_api",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_sms_api():
	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")
		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(adminId,"smsApiPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				form = AddSmsForm(request.form)
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				print("otp_check_id",otp_check_id)
				if not otp_check_id:
					flash("Invalid Request.")
					data_status["responseStatus"] = 4
					data_status["result"] = "Invalid Request"
					return data_status
				if form.validate_on_submit():
					otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
					
					if not otpcheck_queryset:
						flash("Invalid Request.")
						data_status["responseStatus"] = 4
						data_status["result"] = "Invalid Request"
						return data_status

					# Update OTP status to 2 after verification
					otpcheck_queryset.update(status=2)

					apiName = request.form.get("apiName","")
					code = request.form.get("code","")
				# paramsList = request.form.getlist("paramsList[]")
					inputKeyField = request.form.getlist("inputKeyField[]")
					inputValueField = request.form.getlist("inputValueField[]")

					jsonData = request.form.to_dict(flat=True)
					requestData = [jsonData]
					updatedrequestData = [jsonData]

					if len(inputKeyField) == len(inputValueField):
						# Create a list of dictionaries
						paramsList = [{'key': key, 'value': value} for key, value in zip(inputKeyField, inputValueField)]
					else:
						flash("Please give selected params values","SmsApis_danger")
						data_status["responseStatus"] = 4
						data_status["result"] = "Please give selected params values"
						return data_status

					
					if apiName:
						try:
							sms_api_queryset = smsApis.objects(Q(apiName__iexact=apiName)).first()
							if sms_api_queryset:
								flash("API Name already Exists!!")
								data_status["responseStatus"] = 4
								return data_status

							
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName+" "+apiName+" Sms Api created successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_sms_api","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
							sms_apis_table = smsApis(
								adminId = adminId,
								apiName = apiName,
								code = code,
								paramsList = paramsList,
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = sms_apis_table.save()
							smsApiId = str(save_table.id)

							flash("Sms Api added successfully!","SmsApis_success")
							data_status["responseStatus"] = 1
							return data_status

						except Exception as e:
							flash("Unable to save sms Api!!","SmsApis_danger")
							app.logger.error(traceback.format_exc())
							data_status["responseStatus"] = 4
							return data_status

						except Exception as e:
							flash("Unable to save sms Api!!","SmsApis_danger")
							app.logger.error(traceback.format_exc())
							data_status["responseStatus"] = 4
							return data_status
					else:
						flash("Required fields are missing!!","SmsApis_danger")
						data_status["responseStatus"] = 4
						return data_status
				else:
					data_status["result"] = form.errors
					return data_status
		else:
			flash("The staff member does not have permission to create a Sms Api.", "SmsApis_danger")
			return render_template("super_admin_templates/sms_apis_list.html")
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to save sms Api!!"
		return render_template("super_admin_templates/sms_apis_list.html",error=error)


# Update sms api
@sms_apis.route("/update_sms_apis",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_sms_apis():
	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")
	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"),"smsApiPermissions")
	if "edit" in permissionsList:
		try:
			smsApiId = request.args.get("smsApiId","")
			search_element = request.args.get("search_element", "")
			smsPage = request.args.get("smsPage", type=int, default=1)
			form = AddSmsForm(request.form, current_id=smsApiId)

			if request.method == "POST":
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				print("otp_check_id",otp_check_id)

				if form.validate_on_submit():
					if not otp_check_id:
						flash("Invalid Request.","SmsApis_danger")
						data_status["responseStatus"] = 4
						return data_status
					
					otpcheck_queryset = OtpChecks.objects(adminId=adminId, defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
					
					if not otpcheck_queryset:
						flash("Invalid Request.","SmsApis_danger")
						data_status["responseStatus"] = 4
						return data_status
					# Update OTP status to 2 after verification
					otpcheck_queryset.update(status=2)

					apiName = request.form.get("apiName","")
					code = request.form.get("code","")
					#paramsList = request.form.getlist("paramsList[]")
					inputKeyField = request.form.getlist("inputKeyField[]")
					inputValueField = request.form.getlist("inputValueField[]")

					jsonData = request.form.to_dict(flat=True)

					if len(inputKeyField) == len(inputValueField):
						# Create a list of dictionaries
						paramsList = [{'key': key, 'value': value} for key, value in zip(inputKeyField, inputValueField)]
					else:
						flash("Please give selected params values","SmsApis_danger")
						data_status["responseStatus"] = 4
						return data_status
					

					sms_api_queryset = smsApis.objects(id=smsApiId,status__nin=[2]).first()
					existing_record = sms_api_queryset.to_json()

					message=sms_api_queryset.adminId.userName+" "+apiName+" sms API updated successfully!"
					requestData=[existing_record]
					updatedrequestData=[jsonData]
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sms_apis","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)

					if sms_api_queryset:
						sms_api_queryset.update(
							apiName = apiName,
							code = code,
							paramsList = paramsList,
							)


						flash(" sms API updated successfully!","SmsApis_success")
						data_status["responseStatus"] = 1
						return data_status
					else:
						flash("Invaild id!!")
						data_status["responseStatus"] = 4
						return data_status
				else:
					data_status["result"] = form.errors
					return data_status
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to update sms api!!"
			data_status["responseStatus"] = 4
			return data_status
	else:
		flash("The staff member does not have permission to update Sms Api.", "SmsApis_danger")
		return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsApis"))


# Update sms api status
@sms_apis.route("/update_sms_api_status",methods=["POST","GET"])
@adminid_access_token_required
def update_sms_api_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	latitude = request.args.get("latitude", "")
	longitude = request.args.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)

	requestData = [existing_record]
	updatedrequestData = [jsonData]
	
	permissionsList = check_permissions(session.get("adminId"),"smsApiPermissions")
	search_element = request.args.get("search_element","")
	smsPage = request.args.get("smsPage", type=int, default=1)
	redirectto = url_for("sms_apis.sms_apis_list",redirectto="smsApis",search_element=search_element, smsPage=smsPage)
	if "edit" in permissionsList:
		smsApiId = request.args.get("smsApiId","")
		if smsApiId:
			try:
				sms_api_queryset = smsApis.objects(id=smsApiId,status__nin=[2]).first()
				existing_record = sms_api_queryset.to_json()      
			   
				if sms_api_queryset:
					if sms_api_queryset.status == 0:
						sms_api_queryset.update(status=1)
						flash("sms API activated successfully!","SmsApis_success")
						message=sms_api_queryset.adminId.userName+" "+sms_api_queryset.apiName+" sms API activated successfully!"
					elif sms_api_queryset.status == 1:
						sms_api_queryset.update(status=0)
						flash("sms API deactivated successfully!","SmsApis_success")
						message=sms_api_queryset.adminId.userName+" "+sms_api_queryset.apiName+" sms API deactivated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sms_api_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(redirectto)
				else:
					flash("Invaild id!!","SmsApis_danger")
					return redirect(redirectto)
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(redirectto)
		else:
			return redirect(redirectto)
	else:
		flash("The staff member does not have permission to update Sms Api status.", "SmsApis_danger")
		return redirect(redirectto)


# Delete sms API
# @sms_apis.route("/delete_sms_api",methods=["GET"])
# def delete_sms_api():
#     try:
#         existing_record=""
#         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()

#         jsonData = request.form.to_dict(flat=True)

#         requestData = [existing_record]
#         updatedrequestData = [jsonData]
#         if request.method == "GET":
#             smsApiId = request.args.get("smsApiId","")
#             sms_api_queryset = smsApis.objects(id=smsApiId,status__in=[0,1]).first()
#             existing_record = sms_api_queryset.to_json()
#             sms_api_queryset.update(status=2)
#             flash("sms API deleted successfully!")
#             message=sms_api_queryset.adminId.userName+" "+sms_api_queryset.apiName+" sms API deleted successfully!"
#             save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sms_api","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
#             return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsApis"))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         flash("Unable to delete sms api!!")
#         return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsApis"))



@sms_apis.route("/delete_sms_api", methods=["GET", "POST"])
@adminid_access_token_required
@csrf_protect
def delete_sms_api():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")

		adminId = session.get("adminId")
		
		csrf_token = request.form.get("csrf_token")
		print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
		latitude = request.args.get("latitude", "")
		longitude = request.args.get("longitude", "")
		loginBrowser = request.headers.get("Sec-Ch-Ua")
		browser = loginBrowser.split(";")[0] if loginBrowser else request.headers.get("User-Agent").split(";")[0]
		client_ip = request.headers.getlist("X-Forwarded-For")[0] if request.headers.getlist("X-Forwarded-For") else request.remote_addr

		actionDate = datetime.datetime.now()
		jsonData = request.form.to_dict(flat=True)
		requestData = []
		updatedrequestData = [jsonData]
		action = request.form.get("action", "").strip()
		permissionsList = check_permissions(session.get("adminId"),"smsApiPermissions")
		
		search_element = request.args.get("search_element", "")
		smsPage = request.args.get("smsPage", type=int, default=1)
		
		if "delete" in permissionsList:

			otp_check_id = request.form.get("otpLogid", "")
			defaultVerificationId = request.form.get("defaultVerificationId", "")
			print("otp_check_id",otp_check_id)
			if not otp_check_id:
				flash("Invalid Request.","SmsApis_danger")
				return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsApis", search_element=search_element, smsPage=smsPage))
			
			otpcheck_queryset = OtpChecks.objects(adminId=adminId, defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
			
			if not otpcheck_queryset:
				flash("Invalid Request.","SmsApis_danger")
				return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsApis", search_element=search_element, smsPage=smsPage))
			# Update OTP status to 2 after verification
			otpcheck_queryset.update(status=2)

			smsApiId = request.args.get("smsApiId", "")

			sms_api_queryset = smsApis.objects(id=smsApiId, status__in=[0, 1]).first()
			if not sms_api_queryset:
				flash("SMS API not found!","SmsApis_danger")
				return redirect(url_for("sms_apis.sms_apis_list", redirectto="smsApis", search_element=search_element, smsPage=smsPage))

			existing_record = sms_api_queryset.to_json()
			requestData = [existing_record]

			sms_api_queryset.update(status=2)

			flash("SMS API deleted successfully!","SmsApis_success")
			message=sms_api_queryset.adminId.userName+" "+sms_api_queryset.apiName+" sms API deleted successfully!"
			save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sms_api","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
			return redirect(url_for("sms_apis.sms_apis_list", redirectto="smsApis", search_element=search_element, smsPage=smsPage))
		else:
			flash("The staff member does not have permission to delete Sms Api.", "SmsApis_danger")
			return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsApis", search_element=search_element, smsPage=smsPage))

	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete SMS API!!","SmsApis_danger")
		return redirect(url_for("sms_apis.sms_apis_list", redirectto="smsApis"))


############## ASSIGN sms ##############

def fetching_assign_sms_details(assign_sms_queryset):
	assign_sms_dict = {}
	sms_templates_dict={}
	try:
		assign_sms_dict={
		"id":str(assign_sms_queryset.id),
		"smsApiId":str(assign_sms_queryset.smsApiId.id),
		"apiName":assign_sms_queryset.smsApiId.apiName,
		}

		if assign_sms_queryset.otpTypeList:
			assign_sms_dict["otpTypeList"]=[str(each_otptype) for each_otptype in assign_sms_queryset.otpTypeList]
			assign_sms_dict["otpTypeName"] = ', '.join(assign_sms_dict["otpTypeList"])
		else:
			assign_sms_dict["otpTypeList"]=[]


		if assign_sms_queryset.status==1:
			assign_sms_dict["actionText"] = "Active"
		else:
			assign_sms_dict["actionText"] = "Deactive"

		if assign_sms_queryset.createdOn:
			assign_sms_dict["createdOn"] = assign_sms_queryset.createdOn.strftime("%m-%d-%Y")
		else:
			assign_sms_dict["createdOn"] = ""

	except Exception as e:
		app.logger.error(traceback.format_exc())
	return assign_sms_dict


@sms_apis.route("/add_assign_sms_api",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_assign_sms_api():
	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")
		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(adminId,"assignSmsPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				form = AddAssignSmsForm(request.form)
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				print("otp_check_id",otp_check_id)
				if not otp_check_id:
					flash("Invalid Request.","SmsAssign_danger")
					data_status["responseStatus"] = 4
					return data_status
				if form.validate_on_submit():
					otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
					
					if not otpcheck_queryset:
						flash("Invalid Request.","SmsAssign_danger")
						data_status["responseStatus"] = 4
						return data_status
					# Update OTP status to 2 after verification
					otpcheck_queryset.update(status=2)

					smsApiId = request.form.get("smsApiId","")
					otpTypeList = request.form.getlist("otpTypeList")

					jsonData = request.form.to_dict(flat=True)
					requestData = [jsonData]
					updatedrequestData = [jsonData]

					if smsApiId:
						try:
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName +" Assign sms created successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_assign_sms_api","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
							assign_sms_table = AssignSms(
								adminId = adminId,
								smsApiId = ObjectId(smsApiId),
								otpTypeList = otpTypeList,
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = assign_sms_table.save()
							AssignsmsId = str(save_table.id)
							# if isActive == None:
							#     save_table.update(isActive=False)
							# else:
							#     save_table.update(isActive=True)


							flash(" Assign sms added successfully!","SmsAssign_success")
							data_status["responseStatus"]=1
							return data_status

						except Exception as e:
							flash("Unable to save  Assign sms!!","SmsAssign_danger")
							app.logger.error(traceback.format_exc())
							data_status["responseStatus"] = 4
							return data_status

						except Exception as e:
							flash("Unable to save  Assign sms!!","SmsAssign_danger")
							app.logger.error(traceback.format_exc())
							data_status["responseStatus"] = 4
							return data_status
					else:
						flash("Required fields are missing!!","SmsAssign_danger")
						data_status["responseStatus"] = 4
						return data_status
				else:
					data_status["result"] = form.errors
					return data_status
		else:
			flash("The staff member does not have permission to create a Assign sms.", "SmsAssign_danger")
			return redirect(url_for("sms_apis.sms_apis_list",redirectto="AssignSms"))    
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to save  Assign sms!!"
		return render_template("super_admin_templates/sms_apis_list.html",error=error)


# Update transaction api
@sms_apis.route("/update_assign_sms",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_assign_sms():
	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")
	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]

	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"),"assignSmsPermissions")
	if "edit" in permissionsList:
		try:
			AssignsmsId = request.args.get("AssignsmsId","")
			assign_search_element = request.args.get("assign_search_element", "")
			assignSmsPage = request.args.get("assignSmsPage", type=int, default=1)
			form = AddAssignSmsForm(request.form)
			if request.method == "POST":
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				print("otp_check_id",otp_check_id)
				if form.validate_on_submit():
					if not otp_check_id:
						flash("Invalid Request.","SmsAssign_danger")
						data_status["responseStatus"] = 4
						return data_status
					
					otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
					
					if not otpcheck_queryset:
						flash("Invalid Request.","SmsAssign_danger")
						data_status["responseStatus"] = 4
						return data_status
					# Update OTP status to 2 after verification
					otpcheck_queryset.update(status=2)

					smsApiId = request.form.get("smsApiId","")
					otpTypeList = request.form.getlist("otpTypeList")
					jsonData = request.form.to_dict(flat=True)


					assign_smss_queryset = AssignSms.objects(id=AssignsmsId,status__nin=[2]).first()
					existing_record = assign_smss_queryset.to_json()

					message=assign_smss_queryset.adminId.userName+" "+assign_smss_queryset.smsApiId.apiName+" Assign sms updated successfully!"
					requestData=[existing_record]
					updatedrequestData=[jsonData]
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_assign_sms","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					if assign_smss_queryset:
						assign_smss_queryset.update(
							smsApiId = ObjectId(smsApiId),
							# otpTypeList = otpTypeList,
							otpTypeList=[str(each_otptype) for each_otptype in otpTypeList]
							)

						flash("Assign sms updated successfully!","SmsAssign_success")
						data_status["responseStatus"] = 1
						return data_status
					else:
						flash("Invaild id!!","SmsAssign_danger")
						data_status["responseStatus"] = 4
						return data_status
				else:
					data_status["result"]= form.errors
					return data_status
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to update Assign sms!!"
			data_status["responseStatus"] = 4
			return data_status
	else:
		flash("The staff member does not have permission to update Assign sms.", "SmsAssign_danger")
		return redirect(url_for("sms_apis.sms_apis_list",redirectto="AssignSms"))




# Update transaction api status
@sms_apis.route("/update_assign_sms_status",methods=["POST","GET"])
@adminid_access_token_required
def update_assign_sms_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	latitude = request.args.get("latitude", "")
	longitude = request.args.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]
	assign_search_element = request.args.get("search_element","")
	assignSmsPage = request.args.get("assignSmsPage", type=int, default=1)
	redirectto = url_for("sms_apis.sms_apis_list",redirectto="AssignSms", assign_search_element=assign_search_element, assignSmsPage=assignSmsPage)
	
	permissionsList = check_permissions(session.get("adminId"),"assignSmsPermissions")
	if "edit" in permissionsList:
		AssignsmsId = request.args.get("AssignsmsId","")
		if AssignsmsId:
			try:
				assign_sms_queryset = AssignSms.objects(id=AssignsmsId,status__nin=[2]).first()
				existing_record = assign_sms_queryset.to_json()
				requestData = [existing_record]
				if assign_sms_queryset:
					if assign_sms_queryset.status == 0:
						assign_sms_queryset.update(status=1)
						flash(" Assign sms activated successfully!","SmsAssign_success")
						message=assign_sms_queryset.adminId.userName+" "+assign_sms_queryset.smsApiId.apiName+" Assign sms activated successfully!"
					elif assign_sms_queryset.status == 1:
						assign_sms_queryset.update(status=0)
						flash("Assign sms deactivated successfully!","SmsAssign_success")
						message=assign_sms_queryset.adminId.userName+" "+assign_sms_queryset.smsApiId.apiName+" Assign sms deactivated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_assign_sms_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(redirectto)
				else:
					flash("Invaild id!!","SmsAssign_danger")
					return redirect(redirectto)
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(redirectto)
		else:
			return redirect(redirectto)
	else:
		flash("The staff member does not have permission to update Assign sms status.", "SmsAssign_danger")
		return redirect(redirectto)

# Delete Transaction API
# @sms_apis.route("/delete_assign_sms",methods=["GET"])
# def delete_assign_sms():
#     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()

#         jsonData = request.form.to_dict(flat=True)

#         existing_record =""
#         updatedrequestData = [jsonData]
#         if request.method == "GET":
#             AssignsmsId = request.args.get("AssignsmsId","")
#             assign_sms_queryset = AssignSms.objects(id=AssignsmsId,status__in=[0,1]).first()
#             existing_record = assign_sms_queryset.to_json()
#             requestData = [existing_record]
#             assign_sms_queryset.update(status=2)
#             flash("Assign sms deleted successfully!")
#             message=assign_sms_queryset.adminId.userName+" Assign sms deleted successfully!"
#             save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_assign_sms","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
#             return redirect(url_for("sms_apis.sms_apis_list",redirectto="AssignSms"))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         flash("Unable to delete Assign sms!!")
#         return redirect(url_for("sms_apis.sms_apis_list",redirectto="AssignSms"))


@sms_apis.route("/delete_assign_sms", methods=["GET", "POST"])
@adminid_access_token_required
@csrf_protect
def delete_assign_sms():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")

		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", "")
		permissionsList = check_permissions(session.get("adminId"),"assignSmsPermissions")
		search_element = request.args.get("search_element", "")
		assignSmsPage = request.args.get("assignSmsPage", type=int, default=1)

		if "delete" in permissionsList:
			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 = (
				request.headers.getlist("X-Forwarded-For")[0]
				if request.headers.getlist("X-Forwarded-For")
				else request.remote_addr
			)

			actionDate = datetime.datetime.now()
			jsonData = request.form.to_dict(flat=True)

			existing_record =""
			updatedrequestData = [jsonData]
			action = request.form.get("action", "").strip()

			otp_check_id = request.form.get("otpLogid", "")
			defaultVerificationId = request.form.get("defaultVerificationId", "")
			print("otp_check_id",otp_check_id)
			if not otp_check_id:
				flash("Invalid Request.","SmsAssign_danger")
				return redirect(url_for("sms_apis.sms_apis_list",redirectto="AssignSms"))
			
			otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId,  id=str(otp_check_id), status=1).first()
			
			if not otpcheck_queryset:
				flash("Invalid Request.","SmsAssign_danger")
				return redirect(url_for("sms_apis.sms_apis_list",redirectto="AssignSms"))
			# Update OTP status to 2 after verification
			otpcheck_queryset.update(status=2)


			AssignsmsId = request.args.get("AssignsmsId", "")
			assign_sms_queryset = AssignSms.objects(id=AssignsmsId, status__in=[0, 1]).first()

			if not assign_sms_queryset:
				flash("Assigned SMS not found!","SmsAssign_danger")
				return redirect(url_for("sms_apis.sms_apis_list", redirectto="AssignSms"))

			existing_record = assign_sms_queryset.to_json()
			requestData = [existing_record]
			assign_sms_queryset.update(status=2)

			flash("Assigned SMS deleted successfully!","SmsAssign_success")
			message=assign_sms_queryset.adminId.userName+" "+assign_sms_queryset.smsApiId.apiName+" Assign sms deleted successfully!"
			save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_assign_sms","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
			return redirect(url_for("sms_apis.sms_apis_list",redirectto="AssignSms"))
		else:
			flash("The staff member does not have permission to delete Assign sms.", "SmsAssign_danger")
			return redirect(url_for("sms_apis.sms_apis_list",redirectto="AssignSms"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete Assigned SMS!!","SmsAssign_danger")
		return redirect(url_for("sms_apis.sms_apis_list", redirectto="AssignSms"))



##sms templates

def fetching_sms_templates_details(sms_templates_queryset):
	sms_templates_dict = {}
	try:
		sms_templates_dict={
		"id":str(sms_templates_queryset.id),
		"templateContent":sms_templates_queryset.templateContent,
		"apiName":sms_templates_queryset.smsApiId.apiName,
		}
		

		if sms_templates_queryset.otpTypeList:
			sms_templates_dict["otpTypeList"]=[str(each_otptype) for each_otptype in sms_templates_queryset.otpTypeList]
			sms_templates_dict["otpTypeName"] = ', '.join(sms_templates_dict["otpTypeList"])
		else:
			sms_templates_dict["otpTypeList"]=[]



		if sms_templates_queryset.status==1:
			sms_templates_dict["actionText"] = "Active"
		else:
			sms_templates_dict["actionText"] = "Deactive"

		if sms_templates_queryset.createdOn:
			sms_templates_dict["createdOn"] = sms_templates_queryset.createdOn.strftime("%m-%d-%Y")
		else:
			sms_templates_dict["createdOn"] = ""

	except Exception as e:
		app.logger.error(traceback.format_exc())
	return sms_templates_dict


@sms_apis.route("/add_sms_template",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_sms_template():
	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")
		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(adminId,"smsTemplatePermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				form = addSmsTemplateForm(request.form)
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				print("otp_check_id",otp_check_id)
				if not otp_check_id:
					flash("Invalid Request.","SmsTemplates_danger")
					data_status["responseStatus"] = 4
					return data_status
				if form.validate_on_submit():
					otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId,  id=str(otp_check_id), status=1).first()
					
					if not otpcheck_queryset:
						flash("Invalid Request.","SmsTemplates_danger")
						data_status["responseStatus"] = 4
						return data_status
					# Update OTP status to 2 after verification
					otpcheck_queryset.update(status=2)

					smsApiId = request.form.get("smsApiId","")
					templateContent = request.form.get("templateContent","")
					otpTypeList = request.form.getlist("otpTypeList")

					jsonData = request.form.to_dict(flat=True)
					requestData = [jsonData]
					updatedrequestData = [jsonData]
					
					# if templateContent and not is_valid_description(templateContent):
					#     flash("Template Content contains alphabets, numbers, spaces, special characters and basic punctuation.")
					#     return redirect(url_for("sms_apis.sms_apis_list"))

					if smsApiId:
						try:
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName +" sms template created successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_sms_template","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
							sms_templates_table = SmsTemplates(
								adminId = adminId,
								smsApiId = ObjectId(smsApiId),
								otpTypeList = otpTypeList,
								templateContent = templateContent,
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = sms_templates_table.save()
							smsTemplateId = str(save_table.id)
							# if isActive == None:
							#     save_table.update(isActive=False)
							# else:
							#     save_table.update(isActive=True)


							flash(" sms template added successfully!","SmsTemplates_success")
							data_status["responseStatus"] = 1
							return data_status

						except Exception as e:
							flash("Unable to save sms template!!","SmsTemplates_danger")
							app.logger.error(traceback.format_exc())
							data_status["responseStatus"] = 4
							return data_status

						except Exception as e:
							flash("Unable to save  sms template!!","SmsTemplates_danger")
							app.logger.error(traceback.format_exc())
							data_status["responseStatus"] = 4
							return data_status
					else:
						flash("Required fields are missing!!","SmsTemplates_danger")
						data_status["responseStatus"] = 4
						return data_status
				else:
					data_status["result"] = form.errors
					return data_status
		else:
			flash("The staff member does not have permission to create a Sms Template.", "SmsTemplates_danger")
			return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsTemplates"))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to save  sms template!!"
		return render_template("super_admin_templates/sms_apis_list.html",error=error)


# Update transaction api
@sms_apis.route("/update_sms_template",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def update_sms_template():
	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")
	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]
	# browser = None
	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"),"smsTemplatePermissions")
	if "edit" in permissionsList:
		try:
			smsTemplateId = request.args.get("smsTemplateId","")
			smstemplate_search_element = request.args.get("smstemplate_search_element", "")
			smsTemplatePage = request.args.get("smsTemplatePage", type=int, default=1)
			if request.method == "POST":
				otp_check_id = request.form.get("otpLogid", "")
				defaultVerificationId = request.form.get("defaultVerificationId", "")
				print("otp_check_id",otp_check_id)
				
				form = addSmsTemplateForm(request.form)
				if form.validate_on_submit():
					if not otp_check_id:
						flash("Invalid Request.","SmsTemplates_danger")
						data_status["responseStatus"] = 4
						return data_status
					
					otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
					
					if not otpcheck_queryset:
						flash("Invalid Request.","SmsTemplates_danger")
						data_status["responseStatus"] = 4
						return data_status
					# Update OTP status to 2 after verification
					otpcheck_queryset.update(status=2)

					smsApiId = request.form.get("smsApiId","")
					templateContent = request.form.get("templateContent","")
					otpTypeList = request.form.getlist("otpTypeList")
					jsonData = request.form.to_dict(flat=True)

					# if templateContent and not is_valid_description(templateContent):
					#     flash("Template Content contains alphabets, numbers, spaces, special characters and basic punctuation.")
					#     return redirect(url_for("sms_apis.sms_apis_list"))

					sms_templates_queryset = SmsTemplates.objects(id=smsTemplateId,status__nin=[2]).first()
					existing_record = sms_templates_queryset.to_json()

					message=sms_templates_queryset.adminId.userName+" "+sms_templates_queryset.smsApiId.apiName+" sms template updated successfully!"
					requestData=[existing_record]
					updatedrequestData=[jsonData]
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sms_template","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					if sms_templates_queryset:
						sms_templates_queryset.update(
							smsApiId = ObjectId(smsApiId),
							templateContent = templateContent,
							# otpTypeList = otpTypeList,
							otpTypeList=[str(each_otptype) for each_otptype in otpTypeList]
							)

						flash("sms template updated successfully!","SmsTemplates_success")
						data_status["responseStatus"] = 1
						return data_status
					else:
						flash("Invaild id!!","SmsTemplates_danger")
						data_status["responseStatus"] = 4
						return data_status
				else:
					data_status["result"] = form.errors
					return data_status

		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to update sms template!!"
			data_status["responseStatus"] = 4
			return data_status
	else:
		flash("The staff member does not have permission to update Sms Template.", "SmsTemplates_danger")
		return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsTemplates"))




# Update transaction api status
@sms_apis.route("/update_sms_template_status",methods=["POST","GET"])
@adminid_access_token_required
def update_sms_template_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	latitude = request.args.get("latitude", "")
	longitude = request.args.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]
	smsTemplate_search_element = request.args.get("search_element","")
	smsTemplatePage = request.args.get("smsTemplatePage", type=int, default=1)
	redirectto = url_for("sms_apis.sms_apis_list",redirectto="smsTemplates", smsTemplate_search_element=smsTemplate_search_element,smsTemplatePage=smsTemplatePage)
	
	permissionsList = check_permissions(session.get("adminId"),"smsTemplatePermissions")
	if "edit" in permissionsList:
		smsTemplateId = request.args.get("smsTemplateId","")
		if smsTemplateId:
			try:
				sms_templates_queryset = SmsTemplates.objects(id=smsTemplateId,status__nin=[2]).first()
				existing_record = sms_templates_queryset.to_json()
				requestData = [existing_record]
				if sms_templates_queryset:
					if sms_templates_queryset.status == 0:
						sms_templates_queryset.update(status=1)
						flash(" sms template activated successfully!","SmsTemplates_success")
						message=sms_templates_queryset.adminId.userName+" "+sms_templates_queryset.smsApiId.apiName+" sms template activated successfully!"
					elif sms_templates_queryset.status == 1:
						sms_templates_queryset.update(status=0)
						flash("sms template deactivated successfully!","SmsTemplates_success")
						message=sms_templates_queryset.adminId.userName+" "+sms_templates_queryset.smsApiId.apiName+" sms template deactivated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_assign_sms_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(redirectto)
				else:
					flash("Invaild id!!","SmsTemplates_danger")
					return redirect(redirectto)
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(redirectto)
		else:
			return redirect(redirectto)
	else:
		flash("The staff member does not have permission to update Sms Template status.", "SmsTemplates_danger")
		return redirect(redirectto)

# Delete Transaction API
# @sms_apis.route("/delete_sms_template",methods=["GET"])
# def delete_sms_template():
#     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()

#         jsonData = request.form.to_dict(flat=True)

#         existing_record =""
#         updatedrequestData = [jsonData]
#         if request.method == "GET":
#             smsTemplateId = request.args.get("smsTemplateId","")
#             sms_templates_queryset = SmsTemplates.objects(id=smsTemplateId,status__in=[0,1]).first()
#             existing_record = sms_templates_queryset.to_json()
#             requestData = [existing_record]
#             sms_templates_queryset.update(status=2)
#             flash("sms template deleted successfully!")
#             message=sms_templates_queryset.adminId.userName+" sms template deleted successfully!"
#             save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sms_template","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData)
#             return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsTemplates"))
#     except Exception as e:
#         app.logger.error(traceback.format_exc())
#         flash("Unable to delete sms template!!")
#         return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsTemplates"))




# @sms_apis.route("/delete_sms_template", methods=["POST"])
# def delete_sms_template():
#     try:
#         if not session.get("adminId"):
#             return redirect(url_for("admin_login"))

#         adminId = session.get("adminId")
#         loginBrowser = request.headers.get("Sec-Ch-Ua")
#         browser = loginBrowser.split(";")[0] if loginBrowser else request.headers.get('User-Agent').split(";")[0]

#         client_ip = request.headers.getlist("X-Forwarded-For")[0] if request.headers.getlist("X-Forwarded-For") else request.remote_addr
#         actionDate = datetime.datetime.now()

#         data = request.form.to_dict()
#         print("🔹 Received Data:", data)  # Debugging

#         action = data.get("action", "").strip()

#         # Step 1: Generate OTP
#         if action == "generate":
#             mail_type = data.get("mailType", "").strip()
#             if not mail_type:
#                 return jsonify({"responseStatus": 0, "result": "mailType is required!"}), 400
#             return jsonify(generate_otp_helper(mail_type))

#         # Step 2: Verify OTP & Delete SMS Template
#         elif action == "verify":
#             otp_check_id = data.get("otpCheckId", "")
#             otp_code = data.get("otpCode", "").strip()
#             smsTemplateId = data.get("smsTemplateId", "")

#             print(f"🔹 Verifying OTP: otpCheckId={otp_check_id}, otpCode={otp_code}, smsTemplateId={smsTemplateId}")

#             if not otp_check_id or not otp_code or not smsTemplateId:
#                 return jsonify({"responseStatus": 0, "result": "Missing required fields!"})

#             # Verify OTP
#             otp_response = verify_otp_helper(otp_check_id, otp_code)
#             if otp_response["responseStatus"] == 1:
#                 sms_templates_queryset = SmsTemplates.objects(id=smsTemplateId, status__in=[0, 1]).first()
				
#                 if not sms_templates_queryset:
#                     return jsonify({"responseStatus": 0, "result": "SMS Template not found!"})

#                 sms_templates_queryset.delete()  # Hard delete
#                 message = f"{sms_templates_queryset.adminId.userName} SMS template deleted successfully!"
#                 save_admin_logs_data(adminId, None, None, "delete_sms_template", "delete", actionDate, client_ip, browser, message, [smsTemplateId], data)
				
#                 return jsonify({"responseStatus": 1, "result": "SMS Template deleted successfully!"})
			
#             return jsonify(otp_response)

#     except Exception as e:
#         traceback.print_exc()
#         return jsonify({"responseStatus": 0, "result": f"Error: {str(e)}"})



@sms_apis.route("/delete_sms_template", methods=["GET", "POST"])
@adminid_access_token_required
@csrf_protect
def delete_sms_template():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")

		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", "")
		permissionsList = check_permissions(session.get("adminId"),"smsTemplatePermissions")
		smstemplate_search_element = request.args.get("smstemplate_search_element", "")
		smsTemplatePage = request.args.get("smsTemplatePage", type=int, default=1)
		if "delete" in permissionsList:
			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 = (
				request.headers.getlist("X-Forwarded-For")[0]
				if request.headers.getlist("X-Forwarded-For")
				else request.remote_addr
			)

			actionDate = datetime.datetime.now()
			jsonData = request.form.to_dict(flat=True)
			existing_record =""
			updatedrequestData = [jsonData]

			otp_check_id = request.form.get("otpLogid", "")
			defaultVerificationId = request.form.get("defaultVerificationId", "")
			print("otp_check_id",otp_check_id)
			if not otp_check_id:
				flash("Invalid Request.","SmsTemplates_danger")
				return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsTemplates", smstemplate_search_element=smstemplate_search_element, smsTemplatePage=smsTemplatePage))
			
			otpcheck_queryset = OtpChecks.objects(adminId=adminId,defaultVerificationField=defaultVerificationId, id=str(otp_check_id), status=1).first()
			
			if not otpcheck_queryset:
				flash("Invalid Request.","SmsTemplates_danger")
				return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsTemplates", smstemplate_search_element=smstemplate_search_element, smsTemplatePage=smsTemplatePage))
			# Update OTP status to 2 after verification
			otpcheck_queryset.update(status=2)
			smsTemplateId = request.args.get("smsTemplateId", "")
			sms_templates_queryset = SmsTemplates.objects(id=smsTemplateId, status__in=[0, 1]).first()

			if not sms_templates_queryset:
				flash("SMS Template not found!","SmsTemplates_danger")
				return redirect(url_for("sms_apis.sms_apis_list", redirectto="smsTemplates", smstemplate_search_element=smstemplate_search_element, smsTemplatePage=smsTemplatePage))

			existing_record = sms_templates_queryset.to_json()
			requestData = [existing_record]
			sms_templates_queryset.update(status=2)

			flash("SMS Template deleted successfully!","SmsTemplates_success")
			message=sms_templates_queryset.adminId.userName+" "+sms_templates_queryset.smsApiId.apiName+" sms template deleted successfully!"
			save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sms_template","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
			return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsTemplates", smstemplate_search_element=smstemplate_search_element, smsTemplatePage=smsTemplatePage))
		else:
			flash("The staff member does not have permission to delete Sms Template.", "SmsTemplates_danger")
			return redirect(url_for("sms_apis.sms_apis_list",redirectto="smsTemplates", smstemplate_search_element=smstemplate_search_element, smsTemplatePage=smsTemplatePage))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete SMS Template!!")
		return redirect(url_for("sms_apis.sms_apis_list", redirectto="smsTemplates"))
