from appservices.common.util import *
from appservices.common.form_schemas import *

sender_mails = Blueprint("sender_mails",__name__)


def fetching_sender_mails(sender_mails_queryset):
	sender_mails_dict = {}
	try:
		sender_mails_dict={
		"id":str(sender_mails_queryset.id),
		"mailType":sender_mails_queryset.mailType,
		"mailsList":sender_mails_queryset.mailsList,
		"mobileNumber":sender_mails_queryset.mobileNumber,
		}        
		if sender_mails_queryset.status==1:
			sender_mails_dict["actionText"] = "Active"
		else:
			sender_mails_dict["actionText"] = "Deactive"

		if sender_mails_queryset.createdOn:
			sender_mails_dict["createdOn"] = sender_mails_queryset.createdOn.strftime("%d-%m-%Y")
		else:
			sender_mails_dict["createdOn"] = ""

		

	except Exception as e:
		app.logger.error(traceback.format_exc())
	return sender_mails_dict

@sender_mails.route("/sender_mails_list", methods=["POST", "GET"])
@adminid_access_token_required
def sender_mails_list():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		flash("Session expired. Please log in again.", "danger")
		data_status["responseStatus"]=4
		return data_status

	senderMailsList = []
	senderMailsPagination = ""
	existing_mail_types = []
	mailType = ""
	error = ""
	page = ""
	snoCount=0
	pagination = None
	permissionsList = check_permissions(session.get("adminId"),"contactSetupPermissions")
	form = SenderMailsSearchForm(request.args)
	if "view" in permissionsList:
		try:
			sender_mails_queryset = SenderMails.objects(status__in=[0, 1]).order_by("-sorting")
			for each_sender_mail in sender_mails_queryset:
				existing_mail_types.append(each_sender_mail.mailType)

			mailType = request.args.get("mailType", "")

			page = request.args.get(get_page_parameter(), type=int, default=1)
			per_page = 20
			start = (page - 1) * per_page
			total_count=0

			filters = Q(status__in=[0, 1])
			if form.validate():
				if mailType:
					filters &= Q(mailType__icontains=mailType)

				total_count = SenderMails.objects(filters).count()

				sender_mails_queryset = (
						SenderMails.objects(filters)
						.only("id", "mailType", "mailsList","mobileNumber","status","createdOn")
						.order_by("-id")
						.skip(start)
						.limit(per_page)
				)
				senderMailsList=list(sender_mails_queryset)
			else:
				print("form errors",form.errors)
				senderMailsList = []
				
			snoCount = start
			pagination = Pagination(page=page,total=total_count,per_page=per_page,alignment="right",record_name="senderMail",href=f"?mailType={mailType}&page={{0}}")
			
			# senderMailsPage = request.args.get(get_page_parameter('senderMailsPage'), type=int, default=1)
			# per_page = 20
			# total_count = sender_mails_queryset.count()
			# start = (senderMailsPage - 1) * per_page
			# end = min(start + per_page, total_count)

			# total_sender_mails = sender_mails_queryset[start:end]
			# snoCount = start
			# for each_sender_mail in total_sender_mails:
			#     snoCount += 1
			#     sender_mails_dict = fetching_sender_mails(each_sender_mail)
			#     sender_mails_dict["snoCount"] = snoCount
			#     senderMailsList.append(sender_mails_dict)

			# senderMailsPagination = Pagination(senderMailsPage=senderMailsPage, total=total_count, page_parameter="senderMailsPage", per_page=per_page, alignment="right", record_name="senderMail")

			return render_template("super_admin_templates/sender_mails_list.html",
								   pagination=pagination,
								   senderMailsList=senderMailsList,
								   existing_mail_types=existing_mail_types, 
								   mailType=mailType,
								   page=page,
								   snoCount=snoCount,
								   form=form 
								
								   )

		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch Sender Mails !!"
			return render_template("super_admin_templates/sender_mails_list.html",
								   pagination=pagination,
								   senderMailsList=senderMailsList,
								   existing_mail_types=existing_mail_types, 
								   mailType=mailType,
								   page=page,
								   snoCount=snoCount,
								   form=form  
								   )
	else:
		flash("The staff member does not have permission to view contact setup.", "danger")
		return redirect(url_for("admin.dashboard"))


@sender_mails.route("/add_sender_mail", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def add_sender_mail():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			flash("session expired.Please login again.")
			data_status["responseStatus"]=4
			return data_status
			
		adminId = session.get("adminId")
		
		csrf_token = request.form.get("csrf_token")
		print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
		latitude = request.form.get("latitude", "")
		longitude = request.form.get("longitude", "")
		loginBrowser = request.headers.get("Sec-Ch-Ua")
		if loginBrowser:
			loginBrowseData = loginBrowser.split(";")
			browser = loginBrowseData[0]
		else:
			loginBrowseData = request.headers.get('User-Agent').split(";")
			browser = loginBrowseData[0]

		client_ip=0
		# Extracting client IP address
		if request.headers.getlist("X-Forwarded-For"): 
			client_ip = request.headers.getlist("X-Forwarded-For")[0]
		else:
			client_ip = request.remote_addr

		actionDate=datetime.datetime.now()
		
		permissionsList = check_permissions(adminId,"contactSetupPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				mailType = request.form.get("mailType", "")
				mailsList = request.form.get("mailsList", "")  # Get the value from the form
				mailsList = mailsList.split(',') if mailsList else []

				# mailsList = mailsList.split(',') # Clean up any extra spaces
				print("mailsList",mailsList)
				# mobileNumbers = request.form.getlist("mobileNumber")
				
				
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]

				mobileNumber = request.form.get("mobileNumber", "").strip()
				mobileNumbersList = mobileNumber.split(",")

				form = SenderMailsForm()
				if form.validate_on_submit():

					# valid_numbers = []
					# invalid_numbers = []

					# for num in mobileNumbersList:
					#     num = num.strip() 
					#     if num:  
					#         if is_valid_phone(num):
					#             valid_numbers.append(num)  
					#         else:
					#             invalid_numbers.append(num)  

					# if invalid_numbers:
					#     flash(f"Invalid phone numbers: {', '.join(invalid_numbers)}. Each must be exactly 10 digits.")
					#     return redirect(url_for("sender_mails.sender_mails_list"))
					

					# valid_email = []
					# invalid_email = []

					# for email in mailsList:
					#     email = email.strip() 
					#     if email:  
					#         if validate_email(email):
					#             valid_email.append(email)  
					#         else:
					#             invalid_email.append(email)  

					# if invalid_email:
					#     flash(f"Invalid email format! {', '.join(invalid_email)}")
					#     return redirect(url_for("sender_mails.sender_mails_list"))
					

					# The date format for the input type "date" is "YYYY-MM-DD"
					if mailType and mailsList and mobileNumber:

						try:
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName+" "+mailType+" Sender Mail saved successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_sender_mail","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
								print("(((((((((((((save_admin_log_table)))))))))))))",save_admin_log_table)

							sender_mails_table = SenderMails(
								adminId=adminId,
								mailType=mailType,
								mailsList=mailsList,
								mobileNumber=mobileNumbersList,
								createdOn=datetime.datetime.now(),
								status=1,        
							)
							save_table = sender_mails_table.save()  
							senderMailId = str(sender_mails_table.id)
							flash("Sender Mail saved successfully!", "success")
							data_status['responseStatus']=1
							return data_status
							
						except Exception as e:
							flash("Unable to save Sender Mail!", "danger")
							app.logger.error(traceback.format_exc())
							data_status['responseStatus']=4
							return data_status
							
					else:
						data_status['responseStatus']=2
						data_status['result']="Required fields are missing!!"
						return data_status
				else:
					data_status['result']=form.errors
					return data_status
			else:
				flash("Invalid request.")
				data_status['responseStatus']=4
				return data_status            
					
		else:
			flash("The staff member does not have permission to create a contact setup.", "danger")
			data_status['responseStatus']=4
			return data_status
			

	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to Add Sender Mail!"
		flash(error)
		data_status['responseStatus']=4
		return data_status
		


@sender_mails.route("/update_sender_mail_status",methods=["POST","GET"])
@adminid_access_token_required
def update_sender_mail_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")

	page=request.args.get("page")
	mailType=request.args.get("mailType")
	
	redirectTo=url_for("sender_mails.sender_mails_list",page=page,mailType=mailType)
	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]
   
	permissionsList = check_permissions(session.get("adminId"),"contactSetupPermissions")
	if "edit" in permissionsList:
		senderMailId = request.args.get("senderMailId","")
		if senderMailId:
			try:
				message=""
				sender_mails_queryset = SenderMails.objects(id=senderMailId,status__nin=[2]).first()
				existing_record = sender_mails_queryset.to_json()
				requestData = [existing_record]
				if sender_mails_queryset:
					admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
					if sender_mails_queryset.status == 0:
						sender_mails_queryset.update(status=1)
						flash("Sender Mail activated successfully!", "success")
						message=admin_queryset.userName+" "+sender_mails_queryset.mailType+" Sender Mail activated successfully!"
					elif sender_mails_queryset.status == 1:
						sender_mails_queryset.update(status=0)
						flash("Sender Mail deactivated successfully!", "success")
						message=admin_queryset.userName+" "+sender_mails_queryset.mailType+" Sender Mail deactivated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sender_mail_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					print("((((((((((((((save_admin_log_table))))))))))))))",save_admin_log_table)
					return redirect(redirectTo) 
					
				else:
					flash("Invaild id!!", "danger")
					return redirect(url_for(redirectTo))
					
			except Exception as e:
				flash("Unable to update the status", "danger")
				app.logger.error(traceback.format_exc())
				return redirect(redirectTo)
		else:
			return redirect(redirectTo)
		   
	else:
		flash("The staff member does not have permission to update contact setup status.", "danger")
		return redirect(redirectTo)
		



# Update scheme
@sender_mails.route("/update_sender_mail", methods=["POST", "GET"])
@adminid_access_token_required
@csrf_protect
def update_sender_mail():
	data_status={"responseStatus":0,"result":""}
	if not session.get("adminId"):
		flash("session Expired.")
		data_status["responseStatus"]=4
		return data_status
		
	adminId = session.get("adminId")
	
	csrf_token = request.form.get("csrf_token")
	print(csrf_token,"((((((((((((((csrf_token))))))))))))))")
	latitude = request.form.get("latitude", "")
	longitude = request.form.get("longitude", "")
	loginBrowser = request.headers.get("Sec-Ch-Ua")
	if loginBrowser:
		loginBrowseData = loginBrowser.split(";")
		browser = loginBrowseData[0]
	else:
		loginBrowseData = request.headers.get('User-Agent').split(";")
		browser = loginBrowseData[0]

	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()
	

	date_format = "%Y-%m-%d"
	try:
		permissionsList = check_permissions(session.get("adminId"),"contactSetupPermissions")
		if "edit" in permissionsList:
			senderMailId = request.args.get("senderMailId", "hi")
			
			if request.method == "POST":
				mailType = request.form.get("mailType", "")
				
				# Assuming mailsList comes as a comma-separated string, split it into a list of emails
				mailsList = request.form.get("mailsList")
				mailsList = mailsList.split(',') # Clean up any extra spaces
				print("mailsList",mailsList)
				# mailsList = [email.strip() for email in mailsList]  # Clean up any extra spaces

				# mobileNumber = request.form.getlist("mobileNumber")
				
				jsonData = request.form.to_dict(flat=True)
				mobileNumber = request.form.get("mobileNumber", "").strip()
				mobileNumbersList = mobileNumber.split(",")
				jsonData = request.form.to_dict(flat=True)
				
				
				# Find the sender mail using the senderMailId
				form = SenderMailsForm(request.form, current_id=senderMailId)
				if form.validate_on_submit():
					sender_mails_queryset = SenderMails.objects(id=senderMailId).first()
					
					if sender_mails_queryset:
						existing_record = sender_mails_queryset.to_json()
						admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
						message=str(mobileNumber)+" Sender Mail updated successfully!"
						message=admin_queryset.userName+" "+sender_mails_queryset.mailType+" Sender Mail updated successfully!"
						requestData=[sender_mails_queryset]
						updatedrequestData=[jsonData]
						save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_sender_mail","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
						print("(((((((((((((save_admin_log_table)))))))))))))",save_admin_log_table)
						sender_mails_queryset.update(
							mailsList=mailsList,  # Save the list of emails as strings
							mailType=mailType,
							mobileNumber=mobileNumbersList,
						)
						flash("Sender Mail updated successfully!", "success")
						data_status["responseStatus"]=1
						return data_status
						
					else:
						flash("Invalid id!!", "danger")
						data_status["responseStatus"]=4
						return data_status
				else:
					data_status["result"]=form.errors
					return data_status   
			else:
				flash("Invalid request. Please try again.", "danger")
				data_status["responseStatus"]=4
				return data_status     
		else:
			flash("The staff member does not have permission to update contact setup.", "danger")
			data_status["responseStatus"]=4
			return data_status
		   
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to update Sender Mail!!"
		flash(error)
		data_status["responseStatus"]=4
		return data_status
		


# Delete scheme
@sender_mails.route("/delete_sender_mail",methods=["GET"])
@adminid_access_token_required
def delete_sender_mail():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId=session.get("adminId")

		page=request.args.get("page")
		mailType=request.args.get("mailType")
		
		redirectTo=url_for("sender_mails.sender_mails_list",page=page,mailType=mailType)
		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]
		
		permissionsList = check_permissions(session.get("adminId"),"contactSetupPermissions")
		if "delete" in permissionsList:
			if request.method == "GET":
				admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
				senderMailId = request.args.get("senderMailId","")
				sender_mails_queryset = SenderMails.objects(id=senderMailId,status__in=[0,1]).first()
				existing_record = sender_mails_queryset.to_json()
				requestData = [existing_record]
				sender_mails_queryset.update(status=2)
				flash("Sender Mail deleted successfully!", "success")
				message=admin_queryset.userName+" "+sender_mails_queryset.mailType+" Sender Mail deleted successfully!"
				save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_sender_mail","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
				
				return redirect(redirectTo)
			else:
				flash("Invalid ID provided.", "danger")
				return redirect(redirectTo)
		else:
			flash("The staff member does not have permission to delete contact setup.", "danger")
			return redirect(redirectTo)
			
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete Sender Mail!!", "danger")
		return redirect(redirectTo)
		