from django.shortcuts import render
from django.views.generic.base import View
from django.views.generic import TemplateView
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.http.response import HttpResponse
from adminapi.models import *
from django.contrib import messages
from django.core import mail
from django.template.loader import render_to_string
import math, random, string
from django.conf import settings
from django.core.paginator import Paginator
from django.http import JsonResponse
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
import datetime
from django.http import HttpResponseRedirect
from . import forms
from .functions import *
from datetime import datetime
from django.utils.html import strip_tags
from django.contrib.auth.models import User
from firebase_admin import messaging
from django.core.mail import EmailMessage

def checkEmail(request):
	text = request.GET.get('email')
	post = User.objects.filter(username=text).first()
	if post:
		print("true")
		return HttpResponse ('true')
	else:
		print('This email does not exist in our database')
		message = 'This email does not exist in our database'
		return JsonResponse(message,safe=False)
	
def checkLoginPassword(request):
	text = request.GET.get('email','')
	print(text)
	password = request.GET.get('password')
	print(password)
	admin_obj = SuperAdmin.objects.filter(email = text).first()
	print("Admin object:", admin_obj)
	user = admin_obj.user
	if user.check_password(password) == False:
		message = '<p style="color: red;">Please enter the correct password</p>'
		
		return JsonResponse(message,safe=False)
	else:
		return HttpResponse ('true')
	
def adminCheckPassword(request):
	old_password = request.GET.get('old_password')
	user         = User.objects.get(email=request.user.email)
	if user.check_password(old_password) == False:
		message = 'Does not match with the old password.'
		return JsonResponse(message,safe=False)
	else:
		return HttpResponse ('true')
	

def send_push_notification(registration_id, title, body, booking_id=None,and_message=None, and_title=None):
	message_data = {}
	
	if booking_id is not None:
		message_data['booking_id'] = str(booking_id)
		
	if and_message is not None:
		message_data['and_message'] = str(and_message)

	if and_title is not None:
		message_data['and_title'] = str(and_title)


	message = messaging.Message(
		notification=messaging.Notification(
			title=title,
			body=body
		),
		token=registration_id,
		data=message_data if message_data else None
	)
	
	response = messaging.send(message)
	return response
# Create your views here.
class AdminLogIn(TemplateView):
	template_name = 'admin-signin.html'
	def get(self,request):
		if(request.user.is_authenticated):
			return HttpResponseRedirect('/admin-dashboard')
		return render(request,self.template_name)
	
	def post(self,request):
		try:
			form = forms.AdminSigninForm(request.POST)
			if form.is_valid():
				email    = form.cleaned_data.get('email')
				password = form.cleaned_data.get('password')
				print('email',email)
				print('password',password)

				user = authenticate(username=email, password=password)
				if user:
						print('yes')
						login(request, user)
						messages.success(request, "Login successfully")
						return redirect('/admin-dashboard')

				else:
					messages.success(request, "Invalid email and password.")
					return render(request, self.template_name)
			else:
				return render(request,self.template_name, {'form': form})
		except Exception as e:
			messages.warning(request, "Something went wrong.Please try again.")
			return redirect('/admin-dashboard')     


class AdminForgetPassword(TemplateView):
	template_name = 'forget-password.html'
	def get(self,request):
		return render(request,self.template_name)
	
	def post(self,request):
		form = forms.adminforgetpassword(request.POST)
		if form.is_valid():
			email =  form.cleaned_data.get('email')
			print(email)
			admin_obj = SuperAdmin.objects.filter(email = email).first()
			print(admin_obj)
			ran_num = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(12)])
			baselink =  '/forgot-admin/' + str(admin_obj.email) + '/' + ran_num
			completelink = str(settings.BASE_URL) + baselink
			admin_obj.forgotPasswordLink = baselink
			admin_obj.save()            
			subject = 'Forgot Password'
			html_message = render_to_string('forget_admin_password_email.html', {'link': completelink})
			plain_message = html_message
			from_email = settings.EMAIL_HOST_USER
			to = email
			mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
			messages.success(request, "A link has been successfully sent to your mail.")
			return redirect('/admin-forget-password')
		else:
			return render(request, self.template_name, {'form': form})
	
class ForgetPasswordVerification(TemplateView):
	template_name = 'reset-password.html'
	def get(self,request):
		link = str(self.request.path)
		user_email = link.split('/')[-2]
		link_expiry = SuperAdmin.objects.filter(email = user_email).first()
		if link_expiry.forgotPasswordLink == "LinkExpiry":
			return render(request,'link-expire.html')
		admin_obj = SuperAdmin.objects.filter(email = user_email, forgotPasswordLink = link).first()
		if admin_obj:
			valid = True
		else:
			valid = False
		return render(request,self.template_name,locals())

	def post(self,request):
		form = forms.ForgetVerificationForm(request.POST)
		if form.is_valid():
			new_password = form.cleaned_data.get('new_password')
			print(new_password)
			confirm_new_password = form.cleaned_data.get('confirm_new_password')
			print(confirm_new_password)
			link = str(self.request.path)
			user_email = link.split('/')[-3]
			print('user_email:-',user_email)
			admin_obj = SuperAdmin.objects.filter(email = user_email).first()
			print("Admin object:", admin_obj)
			user_obj = admin_obj.user
			print("User object:", user_obj)
			print(user_obj.password)

			if admin_obj:
				print("here")
				user_obj.set_password(new_password)
				user_obj.save()
				print("here2")
				admin_obj.forgotPasswordLink = "LinkExpiry"
				print("here3")
				admin_obj.save()
				messages.success(request, "Password changed successfully")
				return redirect('/')
			else:
				messages.error(request, "Something went wrong")
				return redirect('/')
		else:
			print("Form errors:", form.errors)
			return render(request, self.template_name, {'form': form})


class AdminLogout(TemplateView):
	@method_decorator(login_required(login_url='/'))
	def get(self,request):
		logout(request)
		messages.success(request, "Logout Succesfully")
		return redirect('/')


class AdminResetPassword(TemplateView):
	template_name = 'admin_reset_password.html'
	def get(self,request):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		return render(request,self.template_name,locals())

	def post(self,request):
		try:
			form = forms.change_password_form(request.POST)
			if form.is_valid():
				password = request.POST.get("confirmPassword")
				print(password)
				user     = SuperAdmin.objects.get(email=request.user.email)
				print(user)
				user=user.user.id
				print(user)
				user=User.objects.get(id=user)
				print(user)
				user.set_password(password)
				user.save()
				logout(request)
				messages.info(request, 'You have successfully reset your password')
				return redirect('/')
			else:
				return render(request, 'admin_reset_password.html', {'form': form})
		except Exception as e:
			messages.warning(request, "Something went wrong.Please try again.")
			return redirect('admin-dashboard')
		

class AdminProfile(TemplateView):
	template_name = 'admin_profile.html'
	@method_decorator(login_required(login_url='/'))
	def get(self,request):
		try:
			admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
			
			return render(request,self.template_name,locals())
		except Exception as e:
			messages.warning(request, "Something went wrong.Please try again.")
			return HttpResponse(e)
		
	def post(self,request):
		try:
			form = forms.AdminProfileForm(request.POST)
			if form.is_valid(): 
				first_name = form.cleaned_data.get('first_name')
				last_name = form.cleaned_data.get('last_name')
				email = form.cleaned_data.get('email')
				phone_number = form.cleaned_data.get('phone_number')
				address = form.cleaned_data.get('address')
				SuperAdmin.objects.filter(user=request.user.id).update(firstName=first_name,lastName=last_name,email=email,phoneNumber=phone_number,address=address)
				if request.FILES.get('avatar'):
					fileUrl = uploadTheImages(request.FILES.get('avatar'))
					fileUrl=settings.BASE_URL+'/'+fileUrl
					print(fileUrl)
					SuperAdmin.objects.filter(user=request.user.id).update(image=str(fileUrl))
				messages.success(request, "Update Succesfully")
				return redirect('/admin-dashboard')
			else:
				print(form.errors)
				messages.warning(request, f"{form.errors}")
				return redirect('/admin-dashboard')
		except Exception as e:
			print(e)
			messages.warning(request, f"Something went wrong.Please try again.{e}")
			return redirect('/admin-dashboard')
		
from userapi.models import *
from django.db.models import Q


class UserListing(TemplateView):
	template_name = 'users_list.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self,request):
		# admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		data_obj = AppUser.objects.filter(end_date__isnull = True).order_by('-id')
		search_post = request.GET.get('search')
		if search_post:
			data_obj = AppUser.objects.filter(Q(full_name__icontains=search_post)|Q(email__icontains = search_post)|Q(phone_number__icontains = search_post),end_date__isnull = True).order_by('-id')

		paginator = Paginator(data_obj, 10)
		page_number = request.GET.get('page')
		doc_obj = paginator.get_page(page_number)
		return render(request,self.template_name,locals())
	

class UserDetails(TemplateView):
	template_name = 'user_details.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request,id):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()

		doc_obj  = AppUser.objects.get(id = id )

		return render(request,self.template_name,locals())
	
class editUserDetails(TemplateView):
	template_name = 'edit_user_details.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request,id):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		doc_obj  = AppUser.objects.get(id = id )
		country_code = doc_obj.country_code
		phone_number = doc_obj.phone_number

		return render(request,self.template_name,locals())


	def post(self, request,id):
		form = forms.EditDoctor(request.POST)
		if form.is_valid():
			name = form.cleaned_data.get('name')
			email = form.cleaned_data.get('email')
			gender = form.cleaned_data.get('gender')
			phone_number = form.cleaned_data.get('phone_number')
			status = form.cleaned_data.get('status')
			address = form.cleaned_data.get('address')
			dob = form.cleaned_data.get('dob')  # ✅ Make sure to get DOB
			print('dob',dob)
			doc_obj  = AppUser.objects.filter(end_date__isnull=True,id = id ).first()
			if doc_obj:
				doc_obj.full_name=name
				doc_obj.email=email
				doc_obj.gender=gender
				doc_obj.phone_number=phone_number
				doc_obj.status=status
				doc_obj.address=address
				doc_obj.dob=dob
				doc_obj.save()

			if request.FILES.get('image'):
				print('here in if ')
				fileUrl=uploadTheImages(request.FILES.get('image'))
				fileUrl=settings.BASE_URL+'/'+fileUrl
				print(fileUrl)
				AppUser.objects.filter(end_date__isnull=True,id = id).update(image = fileUrl)


			messages.success(request, "Updated Succesfully")
			return redirect('user-listing')
		else:
			print(form.errors)
			messages.warning(request, "Something went wrong")
			return redirect('user-listing')
		
from datetime import datetime

class TravelListing(TemplateView):
	template_name = 'travel_list.html'

	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request):
		data_obj = AddTravel.objects.all().order_by('-id')
		search_post = request.GET.get('search')
		start_date = request.GET.get('start_date')
		end_date = request.GET.get('end_date')

		if search_post:
			data_obj = data_obj.filter(
				Q(name__icontains=search_post) |
				Q(country_code__icontains=search_post) |
				Q(phone_number__icontains=search_post)
			)

		if start_date:
			try:
				start_date_obj = datetime.datetime.strptime(start_date, '%Y-%m-%d')

				data_obj = data_obj.filter(departure_date__gte=start_date_obj,end_date__isnull=True).exclude(
				total_capacity=0)
			except ValueError:
				pass

		if end_date:
			try:
				end_date_obj =datetime.datetime.strptime(end_date, '%Y-%m-%d')

				data_obj = data_obj.filter(departure_date__lte=end_date_obj,end_date__isnull=True).exclude(
				total_capacity=0)
			except ValueError:
				pass

		paginator = Paginator(data_obj, 10)
		page_number = request.GET.get('page')
		doc_obj = paginator.get_page(page_number)

		return render(request, self.template_name, {
			'doc_obj': doc_obj,
			'search_post': search_post,
			'start_date': start_date,
			'end_date': end_date,
		})


class RouteListing(TemplateView):
	template_name = 'route_list.html'

	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request):
		search_post = request.GET.get('search')
		data_obj = MyRoute.objects.filter().order_by('-id')

		if search_post:
			data_obj = data_obj.filter(
				Q(requests__sender__full_name__icontains=search_post) |
				Q(requests__traveller__full_name__icontains=search_post) |
				Q(requests__traveller__phone_number__icontains=search_post)
			)

		paginator = Paginator(data_obj, 10)
		page_number = request.GET.get('page')
		route_obj = paginator.get_page(page_number)

		return render(request, self.template_name, {
			'route_obj': route_obj,
			'search_post': search_post
		})


import datetime


class deleteUser(View):
	def get(self,request,id):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		AppUser.objects.filter(end_date__isnull=True,id=id).update(end_date=datetime.datetime.now())
		messages.success(request, 'User Deleted Successfully')
		return redirect('user-listing')
	


class FaqListing(TemplateView):
	template_name = 'faq_listing.html'
	@method_decorator(login_required(login_url='/'))
	def get(self,request):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		data_obj = Faq.objects.filter(end_date__isnull = True).order_by('-id')
		paginator = Paginator(data_obj, 10)
		page_number = request.GET.get('page')
		faq_obj = paginator.get_page(page_number)
		return render(request,self.template_name,locals())

class EditFaq(TemplateView):
	template_name = 'edit_faq.html'
	@method_decorator(login_required(login_url='/'))
	def get(self,request,id):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		faq_obj = Faq.objects.filter(id=id,end_date__isnull = True).first()
		return render(request,self.template_name,locals())
	

	def post(self,request,id):
		form = forms.addfaqform(request.POST)
		if form.is_valid():
			title = form.cleaned_data.get('title')
			content = form.cleaned_data.get('content')
			# type = form.cleaned_data.get('type')
			Faq.objects.filter(id=id).update(title=title,content=content)
			messages.success(request, 'Updated Successfully')
			return redirect('/faq-listing')
		else:
			return render(request,self.template_name)

class AddFaq(TemplateView):
	template_name = 'add_faq.html'
	@method_decorator(login_required(login_url='/'))
	def post(self,request):
		form = forms.addfaqform(request.POST)
		if form.is_valid():
			title = form.cleaned_data.get('title')
			content = form.cleaned_data.get('content')
			type = form.cleaned_data.get('type')
			Faq.objects.create(title=title,content=content,type=type)
			messages.success(request, 'Created Successfully')
			return redirect('/faq-listing')
		else:
			return render(request,'add_faq.html')


class AdminDashboard(TemplateView):
	template_name = 'dashboard.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self,request):
		total_users = AppUser.objects.filter(end_date__isnull = True).count()
		total_travellers =  AppUser.objects.filter(addtravel__isnull=False).distinct().count()
		total_routes = MyRoute.objects.filter(end_date__isnull = True).count()
		users_obj =  AppUser.objects.filter(end_date__isnull = True).order_by('-id')[:5]
		traveller_obj = AppUser.objects.filter(end_date__isnull=True).order_by('id')[:5]
		route_obj = MyRoute.objects.filter(end_date__isnull = True).order_by('-id')[:5]
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
  
	
		return render(request,self.template_name,locals())


class privacyPolicy(View):
	template_name = 'privacy_policy.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self,request):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		if admin_obj.is_subadmin == False:
			get_permission = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
		else:
			get_permission = RolesPermission.objects.filter(role=admin_obj.role)
		has_permission = False
		for i in get_permission:
			if admin_obj.is_subadmin == False:
				user_var = 13
			else:
				user_var = int(i.permission.id)
			if user_var == 13:
				has_permission = True
				break
		if has_permission:
			cont_obj = ContentPages.objects.filter(page_type='privacy_policy',user_type = "User").last()
			return render(request, self.template_name, locals())
		else:
			messages.error(request, "You do not have access for this.")
			return redirect('/admin-dashboard')     
	

 
 
	def post(self,request):
		form = forms.content_page_form(request.POST)
		if form.is_valid():
			title = form.cleaned_data.get('title')
			content = form.cleaned_data.get('content')
			data = ContentPages.objects.filter(page_type='privacy_policy',user_type = 'User').first()
			if data:
				ContentPages.objects.filter(id=data.id).update(title=title,content=content,page_type='privacy_policy',user_type = 'User')
			else:
				ContentPages.objects.create(title=title,content=content,page_type='privacy_policy',user_type = 'User')
			messages.success(request, 'Updated Successfully')
			return redirect('/privacy-policy')
		else:
			return render(request,self.template_name,locals())

class termsAndConditions(View):
	template_name = 'terms.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		if admin_obj.is_subadmin == False:
			get_permission = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
		else:
			get_permission = RolesPermission.objects.filter(role=admin_obj.role)
		has_permission = False
		for i in get_permission:
			if admin_obj.is_subadmin == False:
				user_var = 13
			else:
				user_var = int(i.permission.id)
			if user_var == 13:
				has_permission = True
				break
		if has_permission:
			cont_obj = ContentPages.objects.filter(page_type='Terms').first()
			return render(request, self.template_name, locals())
		else:
			messages.error(request, "You do not have access for this.")
			return redirect('/admin-dashboard')

	
	def post(self,request):
		form = forms.content_page_form(request.POST)
		if form.is_valid():
			title = form.cleaned_data.get('title')
			content = form.cleaned_data.get('content')
			data = ContentPages.objects.filter(page_type='Terms',user_type = 'User').first()
			if data:
				ContentPages.objects.filter(id=data.id).update(title=title,content=content,page_type='Terms',user_type = 'User')
			else:
				ContentPages.objects.create(title=title,content=content,page_type='Terms',user_type = 'User')
			messages.success(request, 'Updated Successfully')
			return redirect('/terms-and-conditions')
		else:
			return render(request,self.template_name,locals())
		

class adminNotifications(TemplateView):
	template_name = 'admin_notifications.html'

	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		if admin_obj.is_subadmin == False:
			get_permission = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
		else:
			get_permission = RolesPermission.objects.filter(role=admin_obj.role)

		has_permission = False
		for i in get_permission:
			user_var = 8 if not admin_obj.is_subadmin else int(i.permission.id)
			if user_var == 8:
				has_permission = True
				break

		if has_permission:
			notifications = AdminNotifications.objects.all().order_by('-id')
			page = request.GET.get("page", 1)
			paginator = Paginator(notifications, 10)  # 10 per page
			notify_obj = paginator.get_page(page)
			return render(request, self.template_name, locals())
		else:
			messages.error(request, "You do not have access for this.")
			return redirect('/admin-dashboard')

	
class deleteAdminNotifications(View):
	def get(self,request):
		try:
			if request.method == 'GET':
				ids = request.GET.get('delete_id')
				if ids:
					int_id_list = [int(id) for id in ids.split(',')]
					AdminNotifications.objects.filter(pk__in=int_id_list).delete()
					messages.success(request,"Deleted Sucessfully")
				else:
					messages.error(request,"At least One notification must be selected")
				return redirect('/admin-notifications')

			else:
				return redirect('/admin-notifications')
		except Exception as e:
			messages.warning(request, "Something went wrong.Please try again.")
			return redirect('admin-dashboard')  
		


class helpAndSupportList(TemplateView):
	template_name = 'help_support_list.html'
	@method_decorator(login_required(login_url='/admin-login'))
 
	def get(self,request):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		if admin_obj.is_subadmin == False:
			get_permission = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
		else:
			get_permission = RolesPermission.objects.filter(role=admin_obj.role)
		has_permission = False
		for i in get_permission:
			if admin_obj.is_subadmin == False:
				user_var = 12
			else:
				user_var = int(i.permission.id)
			if user_var == 12:
				has_permission = True
				break	
		if has_permission:
			total = HelpSupportUser.objects.all().count()
			resolved = HelpSupportUser.objects.filter(status = True).count()
			pending = HelpSupportUser.objects.filter(status = False).count()
			help_obj = HelpSupportUser.objects.all().order_by('-id')
			paginator = Paginator(help_obj, 10)
			page_number = request.GET.get('page')
			sup_obj = paginator.get_page(page_number)
			return render(request,self.template_name,locals())
		else:
			messages.error(request, "You do not have access for this.")
			return redirect('/admin-dashboard')


class viewHelpAndSupport(TemplateView):
	template_name = 'help_support_view.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self,request,id):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		sup_obj = HelpSupportUser.objects.filter(id=id).first()
		return render(request,self.template_name,locals())
	


class sendReplyHelpSupport(TemplateView):
	template_name = 'help_support_reply.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self,request,id):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()
		help =  HelpSupportUser.objects.filter(id=id).first()
		return render(request,self.template_name,locals())
	
	def post(self,request,id):
		form = forms.sendsupportform(request.POST)
		if form.is_valid():
			email =  form.cleaned_data.get('email')
			subject = form.cleaned_data.get('subject')
			reply = form.cleaned_data.get('reply')
			html_message = render_to_string('support_email.html', {'reply_text': reply,'email':email,'subject':subject})
			plain_message = html_message
			from_email = settings.EMAIL_HOST_USER
			to = email
			mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
			HelpSupportUser.objects.filter(id=id).update(reply=reply,
			reply_date = datetime.datetime.now(),status=True)
			messages.success(request, "send successfully")
			return redirect('/help-and-support-list')
		else:
			return render(request,self.template_name,locals())

from django.db.models import Max, Subquery, OuterRef

class UsersDocuments(TemplateView):
	template_name = 'users_documents.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request):
			search_post = request.GET.get('search')

			# Get latest document id for each user
			latest_doc_ids = (
				UserDocument.objects
				.values('user_id')
				.annotate(latest_id=Max('id'))
				.values_list('latest_id', flat=True)
			)

			data_obj = UserDocument.objects.filter(id__in=latest_doc_ids).select_related('user').order_by('-id')

			if search_post:
				data_obj = data_obj.filter(
					Q(user__full_name__icontains=search_post) |
					Q(user__phone_number__icontains=search_post)
				).order_by('-id')

			paginator = Paginator(data_obj, 10)
			page_number = request.GET.get('page')
			doc_obj = paginator.get_page(page_number)

			return render(request, self.template_name, {
				'doc_obj': doc_obj,
				'search_post': search_post
			})

	
	
	def post(self, request):
		# For approvals
		for key, value in request.POST.items():
			if key.startswith("status_") and value:
				try:
					doc_id = int(key.split('_')[1])
					document = UserDocument.objects.filter(id=doc_id).first()
					if document:
						document.user.document_status = value
						document.user.rejection_reason = ''  # clear previous reason
						document.user.save()

						try:
							user = document.user
							if user.fcm_token:
								if user.device_type == 'ios':
									send_push_notification(
										user.fcm_token,
										"Identity proof Approved",
										"Your identity proof has been approved.",
										str(document.id)
									)
								else:
									send_push_notification(
										user.fcm_token,
										"",
										"",
										str(document.id),
										"Your identity proof has been approved.",
										"Identity proof Approved"
									)
						except Exception as e:
							print(f"Error sending approval notification: {e}")
				except (ValueError, UserDocument.DoesNotExist):
					continue

		# For rejections
		rejected_id = request.POST.get('rejected_doc_id')
		reason = request.POST.get('rejection_reason')
		if rejected_id and reason:
			document = UserDocument.objects.filter(id=rejected_id).first()
			if document:
				user = document.user
				user.document_status = 'Rejected'
				user.save()
				document.rejection_reason = reason
				document.save()

				# 🔔 Send push notification for rejection
				try:
					if user.fcm_token:
						if user.device_type == 'ios':
							send_push_notification(
								user.fcm_token,
								"Identity proof Rejected",
								f"Your identity proof has been rejected. Reason: {reason}",
								str(document.id)
							)
						else:
							send_push_notification(
								user.fcm_token,
								"",
								"",
								str(document.id),
								f"Your Identity proof has been rejected. Reason: {reason}",
								"Identity proof Rejected"
							)
				except Exception as e:
					print(f"Error sending rejection notification: {e}")
		messages.success(request, "Status updated successfully.")
		return redirect('identity-proof')

class UsersWalletRequests(TemplateView):
	template_name = 'users_money_requests.html'

	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request):
		search_post = request.GET.get('search')
		print(f"Search term: {search_post}")

		# Get all data
		data_obj = RequestedMoney.objects.all().order_by('-id')
		print(f"Total RequestedMoney objects: {data_obj.count()}")

		if search_post:
			data_obj = data_obj.filter(
				Q(user__full_name__icontains=search_post) |
				Q(user__phone_number__icontains=search_post)
			).order_by('-id')
			print(f"Filtered RequestedMoney count after search: {data_obj.count()}")

		paginator = Paginator(data_obj, 10)
		page_number = request.GET.get('page')
		print(f"Current page number: {page_number}")
		doc_obj = paginator.get_page(page_number)

		return render(request, self.template_name, {
			'doc_obj': doc_obj,
			'search_post': search_post
		})

	def post(self, request):
		print("POST request received.")
		# For approvals
		for key, value in request.POST.items():
			if key.startswith("status_") and value:
				print(f"Processing approval: {key} = {value}")
				try:
					doc_id = int(key.split('_')[1])
					print(f"Extracted doc ID: {doc_id}")
					request_obj = RequestedMoney.objects.filter(id=doc_id).first()
					if request_obj:
						print(f"Found RequestedMoney object: {request_obj}")
						request_obj.transaction_status = value
						request_obj.rejection_reason = ''  # clear previous reason
						request_obj.save()
						document = request.FILES.get(f'document_{doc_id}')
						if document:
							user_document = UserDocument.objects.create(
								user=request_obj.user,
								document=document
							)

							# Send document via email
							email = EmailMessage(
								subject="Wallet Request Approved",
								body=f"Dear {request_obj.user.full_name},\n\nYour wallet request has been approved. Please find the attached document.",
								to=[request_obj.user.email]
							)

							document.seek(0)  # Important line to reset file pointer
							email.attach(document.name, document.read(), document.content_type)
							email.send(fail_silently=False)

					else:
						print("RequestedMoney object not found.")
				except (ValueError, RequestedMoney.DoesNotExist) as e:
					print(f"Error processing status update: {e}")
					continue

		# For rejections
		rejected_id = request.POST.get('rejected_doc_id')
		reason = request.POST.get('rejection_reason')
		print(f"Rejected ID: {rejected_id}, Reason: {reason}")
		if rejected_id and reason:
			request_obj = RequestedMoney.objects.filter(id=rejected_id).first()
			if request_obj:
				print(f"Updating rejection reason for ID: {rejected_id}")
				request_obj.rejection_reason = reason
				request_obj.available_balance = int(request_obj.available_balance)+int(request_obj.requested_money)
				request_obj.user.wallet_money = int(request_obj.available_balance)+int(request_obj.requested_money)
				request_obj.save()
				print("Rejection reason saved.")
			else:
				print("RequestedMoney object for rejection not found.")

		messages.success(request, "Status updated successfully.")
		return redirect('user-wallet-requests')


class TravelDetails(TemplateView):
	template_name = 'travel_details.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request,id):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()

		doc_obj  = AddTravel.objects.get(id = id )

		return render(request,self.template_name,locals())
	

class BookingsDetails(TemplateView):
	template_name = 'bookings_details.html'
	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request,id):
		admin_obj = SuperAdmin.objects.filter(user=request.user.id).first()

		doc_obj  = MyRoute.objects.select_related('requests').get(id=id)


		return render(request,self.template_name,locals())	


class Setcommisionpercentage(TemplateView):
	template_name = 'set_commision.html'

	@method_decorator(login_required(login_url='/'))
	def get(self, request):
		latest_commission = SetCommision.objects.filter().last()
		form = forms.addExercisetimerform()
		return render(request, self.template_name, {
			'form': form,
			'latest_commission': latest_commission
		})

	@method_decorator(login_required(login_url='/'))
	def post(self, request):
		form = forms.addExercisetimerform(request.POST)
		if form.is_valid():
			commission = form.cleaned_data.get('commision')  # ✅ Correct key

			print(commission)
			SetCommision.objects.create(commision=commission)
			messages.success(request, "Created Successfully")
			return redirect('set-commision-percentage')
		else:
			latest_commission = SetCommision.objects.filter().last()
			return render(request, self.template_name, {
				'form': form,
				'latest_commission': latest_commission
			})

class UsersHelpSupport(TemplateView):
	template_name = 'users_help_support.html'

	@method_decorator(login_required(login_url='/admin-login'))
	def get(self, request):
		search_post = request.GET.get('search')

		# Get latest ticket for each user (if needed)
		latest_ticket_ids = (
			HelpSupportUser.objects
			.values('user_id')
			.annotate(latest_id=Max('id'))
			.values_list('latest_id', flat=True)
		)

		data_obj = HelpSupportUser.objects.filter(id__in=latest_ticket_ids).select_related('user').order_by('-id')

		if search_post:
			data_obj = data_obj.filter(
				Q(user__full_name__icontains=search_post) |
				Q(user__phone_number__icontains=search_post) |
				Q(ticket_id__icontains=search_post)
			).order_by('-id')

		paginator = Paginator(data_obj, 10)
		page_number = request.GET.get('page')
		ticket_obj = paginator.get_page(page_number)

		return render(request, self.template_name, {
			'ticket_obj': ticket_obj,
			'search_post': search_post
		})

	def post(self, request):
    # ✅ Approve tickets (status_<id>: 'Accepted')
		for key, value in request.POST.items():
			if key.startswith("status_") and value:
				try:
					ticket_id = int(key.split('_')[1])
					ticket = HelpSupportUser.objects.filter(id=ticket_id).first()
					if ticket:
						ticket.status = value  # Should be 'Accepted'
						ticket.rejection_reason = ''  # Clear any previous rejection
						ticket.save()

						# ✅ Optional push notification for approval
						user = ticket.user
						if user.fcm_token:
							if user.device_type == 'ios':
								send_push_notification(
									user.fcm_token,
									"Your help and support ticket is approved",
									"Thank you for reaching out.",
									str(ticket.id)
								)
							else:
								send_push_notification(
									user.fcm_token,
									"",
									"",
									str(ticket.id),
									"Thank you for reaching out.",
									"Your help and support ticket is approved"
								)
				except Exception as e:
					print("Error approving ticket:", e)
					continue

		# ✅ Reject ticket with reason (via modal form)
		rejected_id = request.POST.get('rejected_ticket_id')
		reason = request.POST.get('rejection_reason')
		if rejected_id and reason:
			ticket = HelpSupportUser.objects.filter(id=rejected_id).first()
			if ticket:
				ticket.status = 'Rejected'
				ticket.rejection_reason = reason
				ticket.save()

				user = ticket.user
				if user.fcm_token:
					if user.device_type == 'ios':
						send_push_notification(
							user.fcm_token,
							"Your help and support ticket is rejected",
							f"Reason: {reason}",
							str(ticket.id)
						)
					else:
						send_push_notification(
							user.fcm_token,
							"",
							"",
							str(ticket.id),
							f"Reason: {reason}",
							"Your help and support ticket is rejected"
						)

		messages.success(request, "Support ticket updated successfully.")
		return redirect('users-help-support')

