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

tax_master = Blueprint("tax_master",__name__)

# Add Tax Type
@tax_master.route("/add_tax_type",methods=["POST","GET"])
@adminid_access_token_required
@csrf_protect
def add_tax_type():
	data_status={"responseStatus":0,"result":""}
	try:
		if not session.get("adminId"):
			flash("Session expired Please login again.","danger")
			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,"taxmasterPermissions")
		if "add" in permissionsList:
			if request.method == "POST":
				taxTypeName = request.form.get("taxTypeName","")
				taxType = request.form.get("taxType","")
				primaryTax = request.form.get("primaryTax","")
				secondaryTax = request.form.get("secondaryTax","")
				jsonData = request.form.to_dict(flat=True)
				requestData = [jsonData]
				updatedrequestData = [jsonData]
				form = AddTaxTypeForm()
				if form.validate_on_submit():

					# if taxTypeName and not is_valid_alphanumeric(taxTypeName):
					#     flash("Tax type Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
					#     return redirect(url_for("tax_master.tax_types_list"))

					# if primaryTax and not is_valid_numeric(primaryTax):
					#     flash("Primary Tax contain only numeric characters")
					#     return redirect(url_for("tax_master.tax_types_list"))

					# if secondaryTax and not is_valid_numeric(secondaryTax):
					#     flash("Secondary Tax contain only numeric characters")
					#     return redirect(url_for("tax_master.tax_types_list"))

					if taxTypeName and taxType and primaryTax and secondaryTax:
						try:
							admin_queryset = SuperAdmin.objects(id=adminId,status=1).first()
							if admin_queryset:
								message=admin_queryset.userName+" "+taxTypeName+" Tax Type created successfully!"
								save_admin_log_table = save_admin_logs_data(adminId,None,None,"add_tax_type","create",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 
							taxType_table = TaxTypes(
								adminId = adminId,
								taxTypeName = taxTypeName,
								taxType = taxType,
								primaryTax = primaryTax,
								secondaryTax = secondaryTax,
								createdOn = datetime.datetime.now(),
								status = 1,
								)
							save_table = taxType_table.save()
							taxTypeId = str(save_table.id)
							flash("Tax Type saved successfully","success")
							data_status['responseStatus']=1
							return data_status
						except Exception as e:
							flash("Unable to save tax type","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.","danger")
				data_status['responseStatus']=4
				return data_status
		else:
			flash("The staff member does not have permission to create a Tax type", "danger")
			data_status['responseStatus']=4
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		error = "Unable to save service charge details!!"
		flash("Unable to save service charges.", "danger")
		data_status['responseStatus']=4
		return data_status



def fetching_tax_type_details(taxType_queryset):
	taxType_dict = {}
	try:
		taxType_dict={
		"id":str(taxType_queryset.id),
		"taxTypeName":taxType_queryset.taxTypeName,
		"taxType":taxType_queryset.taxType,
		"primaryTax":taxType_queryset.primaryTax,
		"secondaryTax":taxType_queryset.secondaryTax,
		}
		if taxType_queryset.status==1:
			taxType_dict["actionText"] = "Active"
		else:
			taxType_dict["actionText"] = "Deactive"
		if taxType_queryset.createdOn:
			taxType_dict["createdOn"] = taxType_queryset.createdOn.strftime("%m-%d-%Y")
		else:
			taxType_dict["createdOn"] = ""
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return taxType_dict

# View All Tax Types
@tax_master.route("/tax_types_list",methods=["POST","GET"])
@adminid_access_token_required
def tax_types_list():
	if not session.get("adminId"):
		return redirect("admin_login")
	taxTypesList = []
	pagination = None
	search_element=""
	snoCount=0
	servicePage=None
	adminId = session.get("adminId")
	# categories_queryset = Category.objects(status__in=[1]).order_by('-id').all()
	permissionsList = check_permissions(session.get("adminId"),"taxmasterPermissions")
	print(permissionsList,"((((((((permissionsList))))))))")
	if "view" in permissionsList:
		try:
			
			form = serviceFormSearch(request.args)
			search_element = request.args.get("search_element", "")
			servicePage = request.args.get(get_page_parameter("servicePage"), type=int, default=1)
			print(servicePage,"((((((((((servicePage))))))))))")
			per_page = 20
			start = (servicePage - 1) * per_page
			total_count=0
			filters = Q(status__in=[0, 1])
			print(per_page,"((((((((((((((per_page))))))))))))))")
			if form.validate():
				if search_element:
					filters &= Q(taxTypeName__icontains=search_element)
				total_count = TaxTypes.objects(filters).count()

				tax_type_queryset = (
					TaxTypes.objects(filters)
					.only("id", "taxTypeName", "taxType", "primaryTax","secondaryTax","status")
					.order_by("-id")
					.skip(start)
					.limit(per_page)
				)
				taxTypesList=list(tax_type_queryset)
			else:
				taxTypesList=[]
				
			snoCount = start
			
			# page = request.args.get(get_page_parameter(), type=int, default=1)
			# page_start,page_end=fetch_limit_length_based_on_page_index(page,20)
			# pagination = Pagination(
			#   page=page,
			#   record_name='tax_master',
			#   per_page=20,
			#   alignment="right"
			#   )
			# tax_type_queryset = TaxTypes.objects(status__in=[0,1]).order_by("-id")
			# if search_element:
			#   tax_type_queryset = tax_type_queryset.filter(Q(taxTypeName__icontains=search_element))
			#   length = tax_type_queryset.count()
			#   tax_type_queryset=tax_type_queryset[page_start:page_end]
			# else:
			#   length = tax_type_queryset.count()
			#   tax_type_queryset=tax_type_queryset[page_start:page_end]
			# for each_tax_type in tax_type_queryset:
			#   taxType_dict = fetching_tax_type_details(each_tax_type)
			#   taxTypesList.append(taxType_dict)
			pagination = Pagination(servicePage=servicePage, total=total_count, per_page=per_page,page_parameter ="servicePage", alignment="right", record_name="tax_master",href=f"?search_element={search_element}&servicePage={{0}}")
				
			return render_template("super_admin_templates/tax_master_list.html",
				taxTypesList=taxTypesList,
				search_element=search_element,
				snoCount=snoCount,
				servicePage = servicePage,
				form=form,
				pagination=pagination,
				)
		except Exception as e:
			app.logger.error(traceback.format_exc())
			error = "Unable to fetch tax type details!!"
			return render_template("super_admin_templates/tax_master_list.html",
				error=error,
				taxTypesList=taxTypesList,
				search_element=search_element,
				snoCount=snoCount,
				servicePage = servicePage,
				form=form,
				pagination=pagination,
				)
	else:
		flash("The staff member does not have permission to view Tax master.", "danger")
		return redirect(url_for("admin.dashboard"))



# Update Tax Type
@tax_master.route("/update_tax_type",methods=["POST","GET"])
@csrf_protect
@adminid_access_token_required
def update_tax_type():
	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
	adminId=session.get("adminId")   
	latitude = request.form.get("latitude", "")
	longitude = request.form.get("longitude", "")
	csrf_token = request.form.get("csrf_token")
	print(csrf_token,"((((((((((((((csrf_token))))))))))))))") 
	
	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"),"taxmasterPermissions")
	if "edit" in permissionsList:
		try:
			taxTypeId = request.args.get("taxTypeId","")
			if request.method == "POST":
	   
				form = AddTaxTypeForm()
				
				if form.validate():
					taxTypeName = request.form.get("taxTypeName","")
					taxType = request.form.get("taxType","")
					primaryTax = request.form.get("primaryTax","")
					secondaryTax = request.form.get("secondaryTax","")
					jsonData = request.form.to_dict(flat=True)

					# if taxTypeName and not is_valid_alphanumeric(taxTypeName):
					#   flash("Tax type Name must contain only alphanumeric characters, spaces, and specific special characters: @#$()+_-/.")
					#   return redirect(url_for("tax_master.tax_types_list"))

					# if primaryTax and not is_valid_numeric(primaryTax):
					#   flash("Primary Tax contain only numeric characters")
					#   return redirect(url_for("tax_master.tax_types_list"))

					# if secondaryTax and not is_valid_numeric(secondaryTax):
					#   flash("Secondary Tax contain only numeric characters")
					#   return redirect(url_for("tax_master.tax_types_list"))

					if taxTypeName and taxType and primaryTax and secondaryTax:
						taxType_queryset = TaxTypes.objects(id=taxTypeId).first()
						existing_record = taxType_queryset.to_json()
						message=taxType_queryset.adminId.userName+" "+taxTypeName+" Tax Type updated successfully!"
						requestData=[existing_record]
						updatedrequestData=[jsonData]
						save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_tax_type","update",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude) 

						if taxType_queryset:
							taxType_queryset.update(
								taxTypeName = taxTypeName,
								taxType = taxType,
								primaryTax = primaryTax,
								secondaryTax = secondaryTax,
								)
							flash("Tax Type 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["responseStatus"]=2
						data_status["result"]="Required fields are missing."
						return data_status 
				else:
					data_status["result"]=form.errors
					return data_status
					print("formaerror(((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))",form.errors)
			else:                     
				flash("Invalid request", "danger")
				data_status["responseStatus"]=4
				return data_status
		except Exception as e:
			app.logger.error(traceback.format_exc())
			flash("Unable to update tax type!!")
			data_status["responseStatus"]=4
			return data_status
	else:
		flash("The staff member does not have permission to update Tax type","danger")
		data_status["responseStatus"]=4
		return data_status

# Update Tax Type Status
@tax_master.route("/update_tax_type_status",methods=["POST","GET"])
@adminid_access_token_required
def update_tax_type_status():
	if not session.get("adminId"):
		return redirect("admin_login")
	adminId=session.get("adminId")
	servicePage = request.args.get("servicePage")
	search_element = request.args.get("search_element", "")
	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"),"taxmasterPermissions")
	if "edit" in permissionsList:
		taxTypeId = request.args.get("taxTypeId","")
		if taxTypeId:
			try:
				taxType_queryset = TaxTypes.objects(id=taxTypeId,status__nin=[2]).first()
				existing_record = taxType_queryset.to_json()
				requestData = [existing_record]
				if taxType_queryset:
					if taxType_queryset.status == 0:
						taxType_queryset.update(status=1)
						flash("Tax Type activated successfully","success")
						message=taxType_queryset.adminId.userName+" "+taxType_queryset.taxTypeName+" Tax Type activated successfully!"
					elif taxType_queryset.status == 1:
						taxType_queryset.update(status=0)
						flash("Tax Type deactivated successfully","success")
						message=taxType_queryset.adminId.userName+" "+taxType_queryset.taxTypeName+" Tax Type deactivated successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"update_tax_type_status","updatestatus",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))
				else:
					flash("Invaild id","danger")
					return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))
			except Exception as e:
				app.logger.error(traceback.format_exc())
				return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))
		else:
			return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))
	else:
		flash("The staff member does not have permission to update Tax Type status.", "danger")
		return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))

# Delete Tax Type
@tax_master.route("/delete_tax_type",methods=["GET"])
@adminid_access_token_required
def delete_tax_type():
	try:
		if not session.get("adminId"):
			return redirect("admin_login")
		adminId=session.get("adminId")
		servicePage = request.args.get("servicePage")
		search_element = request.args.get("search_element", "")
		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"),"taxmasterPermissions")
		if "delete" in permissionsList:
			if request.method == "GET":
				taxTypeId = request.args.get("taxTypeId","")
				taxType_queryset = TaxTypes.objects(id=taxTypeId,status__in=[0,1]).first()
				existing_record = taxType_queryset.to_json()
				requestData = [existing_record]
				if taxType_queryset:
					taxType_queryset.update(status=2)
					flash("Tax Type deleted successfully","success")
					message=taxType_queryset.adminId.userName+" "+taxType_queryset.taxTypeName+" Tax Type deleted successfully!"
					save_admin_log_table = save_admin_logs_data(adminId,None,None,"delete_tax_type","delete",actionDate,client_ip,browser,message,requestData,updatedrequestData,latitude,longitude)
					return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))
				else:
					flash("Invaild id","danger")
					return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))
		else:
			flash("The staff member does not have permission to delete Tax type.", "danger")
			return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))
	except Exception as e:
		app.logger.error(traceback.format_exc())
		flash("Unable to delete tax type!!")
		return redirect(url_for("tax_master.tax_types_list",servicePage=servicePage,search_element=search_element))