# from email import message
# from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from userapi.models import *
# from datetime import datetime, timedelta, date
from django.conf import settings
# from .authentication import authenticated
# from django.contrib.auth.models import User
# from .models import User
from rest_framework_simplejwt.tokens import RefreshToken
from passlib.hash import django_pbkdf2_sha256 as handler
from django.template.loader import render_to_string
from django.core import mail
import math, random, pytz, string
from django.conf import settings
import stripe
from userapi.authentication import *
from datetime import datetime
from firebase_admin import messaging
from adminapi.models import *

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

class AddTraveller(APIView):
	def post(self, request):
		lang = request.headers.get('Accept-Language', 'fr')
		
		def msg(en, fr):
			return en if lang == 'en' else fr

		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e), 'statusCode': status.HTTP_401_UNAUTHORIZED}, status=status.HTTP_401_UNAUTHORIZED)
			
			app_user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not app_user_obj:
				return Response({'message': msg('User not found', 'Utilisateur non trouvé'), 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)
			
			data = request.data
			name = data.get('name')
			image_url = data.get('image_url')
			country_code = data.get('country_code')
			if country_code and not country_code.startswith('+'):
				country_code = f'+{country_code}'
			country_name_code = data.get('country_name_code')

			phone_number = data.get('phone_number')
			travelling_from = data.get('travelling_from')
			travelling_to = data.get('travelling_to')
			departure_date = data.get('departure_date')
			departure_time = data.get('departure_time')
			arrival_date = data.get('arrival_date')
			arrival_time = data.get('arrival_time')
			transport_mode = data.get('transport_mode')
			price_per_kg = data.get('price_per_kg')
			description = data.get('description')
			city = data.get('city')
			country = data.get('country')
			latitude = data.get('latitude')
			longitude = data.get('longitude')
			total_capacity = data.get('total_capacity')
			sender_country = data.get('sender_country')
			sender_city = data.get('sender_city')

			# Validation with language-based messages
			if not name:
				return Response({"message": msg("Name is required", "Le nom est requis"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not country_code:
				return Response({"message": msg("Country code is required", "Le code du pays est requis"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not phone_number:
				return Response({"message": msg("Phone number is required", "Le numéro de téléphone est requis"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not travelling_from:
				return Response({"message": msg("Travelling from is required", "Le lieu de départ est requis"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not travelling_to:
				return Response({"message": msg("Travelling to is required", "La destination est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not departure_date:
				return Response({"message": msg("Departure date is required", "La date de départ est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not departure_time:
				return Response({"message": msg("Departure time is required", "L'heure de départ est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not arrival_date:
				return Response({"message": msg("Arrival date is required", "La date d'arrivée est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not arrival_time:
				return Response({"message": msg("Arrival time is required", "L'heure d'arrivée est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not transport_mode:
				return Response({"message": msg("Transport mode is required", "Le mode de transport est requis"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not price_per_kg:
				return Response({"message": msg("Price per kg is required", "Veuillez entrer le prix par kg"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not description:
				return Response({"message": msg("Description is required", "La description est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not image_url:
				return Response({"message": msg("Image is required", "L'image est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not city:
				return Response({"message": msg("City is required", "La ville est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not country:
				return Response({"message": msg("Country is required", "Le pays est requis"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not latitude:
				return Response({"message": msg("Latitude is required", "La latitude est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not longitude:
				return Response({"message": msg("Longitude is required", "La longitude est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			if not total_capacity:
				return Response({"message": msg("Total capacity is required", "La capacité totale est requise"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

			check_travel = AddTravel.objects.filter(
				user=app_user_obj,
				travelling_from=travelling_from,
				travelling_to=travelling_to,
				departure_date=departure_date,
				departure_time=departure_time,
				arrival_date=arrival_date,
				arrival_time=arrival_time,
				latitude=latitude,
				longitude=longitude,
				total_capacity=total_capacity,
				country_name_code=country_name_code
			)

			if check_travel.exists():
				return Response({"message": msg("This travel route already exists", "Cet itinéraire de voyage existe déjà"), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
			
			AddTravel.objects.create(
				user=app_user_obj,
				name=name,
				country_code=country_code,
				phone_number=phone_number,
				travelling_from=travelling_from,
				travelling_to=travelling_to,
				departure_date=departure_date,
				departure_time=departure_time,
				arrival_date=arrival_date,
				arrival_time=arrival_time,
				transport_mode=transport_mode,
				price_per_kg=price_per_kg,
				description=description,
				image_url=image_url,
				city=city,
				country=country,
				travel_status="active",
				latitude=latitude,
				longitude=longitude,
				total_capacity=total_capacity,
				country_name_code=country_name_code,
				sender_country=sender_country,
				sender_city=sender_city
			)

			return Response({"message": msg("Traveler added successfully", "Voyageur ajouté avec succès"), 'statusCode': status.HTTP_200_OK}, status=status.HTTP_200_OK)
		
		except Exception as e:
			return Response({"message": str(e), 'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class UserTravellerListing(APIView):
    def get(self, request):
        lang = request.headers.get('Accept-Language', 'fr')

        try:
            # Authenticate user
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({
                    'message': str(e) if lang == 'en' else 'Non autorisé',
                    'statusCode': status.HTTP_401_UNAUTHORIZED
                }, status=status.HTTP_401_UNAUTHORIZED)

            travel_status = request.GET.get('status')
            if not travel_status:
                return Response({
                    'message': 'Status parameter is required' if lang == 'en' else 'Le paramètre "status" est requis',
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            app_user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
            if not app_user_obj:
                return Response({
                    'message': 'AppUser not found' if lang == 'en' else "L'utilisateur n'a pas été trouvé",
                    'statusCode': status.HTTP_404_NOT_FOUND
                }, status=status.HTTP_404_NOT_FOUND)

            filter_queryset = AddTravel.objects.filter(
                user=app_user_obj,
                travel_status=travel_status,
                end_date__isnull=True
            ).order_by('-departure_date')

            all_data = list(filter_queryset.values())

            try:
                page = int(request.GET.get('page', 1))
                page_size = int(request.GET.get('page_size', 10))
            except ValueError:
                return Response({
                    'message': 'Invalid page or page_size' if lang == 'en' else 'Paramètre de page ou taille de page invalide',
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            total_count = len(all_data)
            start = (page - 1) * page_size
            end = start + page_size
            paginated_data = all_data[start:end]

            return Response({
                'message': 'Success' if lang == 'en' else 'Succès',
                'total_count': total_count,
                'page': page,
                'page_size': page_size,
                'all_data': paginated_data,
                'statusCode': status.HTTP_200_OK
            }, status=status.HTTP_200_OK)

        except Exception as e:
            return Response({
                'message': str(e) if lang == 'en' else 'Erreur du serveur interne',
                'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class TravellerDetails(APIView):
    def get(self, request):
        lang = request.headers.get('Accept-Language', 'fr')

        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({
                    'message': str(e) if lang == 'en' else 'Non autorisé',
                    'statusCode': status.HTTP_401_UNAUTHORIZED
                }, status=status.HTTP_401_UNAUTHORIZED)

            travel_id = request.GET.get('travel_id')
            if not travel_id:
                return Response({
                    'message': 'travel_id not found' if lang == 'en' else 'travel_id introuvable',
                    'statusCode': status.HTTP_404_NOT_FOUND
                }, status=status.HTTP_404_NOT_FOUND)

            app_user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
            if not app_user_obj:
                return Response({
                    'message': 'User not found' if lang == 'en' else "L'utilisateur n'a pas été trouvé",
                    'statusCode': status.HTTP_404_NOT_FOUND
                }, status=status.HTTP_404_NOT_FOUND)

            filter_obj = AddTravel.objects.filter(
                id=travel_id, end_date__isnull=True
            ).values()

            return Response({
                'message': 'Success' if lang == 'en' else 'Succès',
                'all_data': filter_obj[0] if filter_obj else {},
                'statusCode': status.HTTP_200_OK
            }, status=status.HTTP_200_OK)

        except Exception as e:
            return Response({
                'message': str(e) if lang == 'en' else 'Erreur du serveur interne',
                'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class TravellerUpdate(APIView):
    def post(self, request):
        lang = request.headers.get('Accept-Language', 'fr')

        try:
            uid = authenticated(request)
        except Exception as e:
            message = str(e) if lang == 'en' else 'Non autorisé'
            return Response({'message': message, 'statusCode': status.HTTP_401_UNAUTHORIZED}, status=status.HTTP_401_UNAUTHORIZED)

        app_user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
        if not app_user_obj:
            message = 'User not found' if lang == 'en' else "L'utilisateur n'a pas été trouvé"
            return Response({'message': message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

        travel_id = request.data.get('travel_id')
        if not travel_id:
            message = 'travel_id not found' if lang == 'en' else 'travel_id introuvable'
            return Response({'message': message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

        filter_obj = AddTravel.objects.filter(id=travel_id, end_date__isnull=True).first()
        if not filter_obj:
            message = 'Travel record not found' if lang == 'en' else 'Enregistrement de voyage introuvable'
            return Response({'message': message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

        data = request.data

        country_code = data.get('country_code')
        if country_code and not country_code.startswith('+'):
            country_code = f'+{country_code}'

        check_request = TravellerRequests.objects.filter(route=filter_obj, req_status__in=['pending', 'accepted'])
        if check_request.exists():
            message = 'This travel route of yours already exists' if lang == 'en' else 'Cet itinéraire de voyage existe déjà'
            return Response({'message': message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

        # Update fields if present
        if data.get('name') is not None:
            filter_obj.name = data.get('name')
        if data.get('image_url') is not None:
            filter_obj.image_url = data.get('image_url')
        if country_code is not None:
            filter_obj.country_code = country_code
        if data.get('phone_number') is not None:
            filter_obj.phone_number = data.get('phone_number')
        if data.get('travelling_from') is not None:
            filter_obj.travelling_from = data.get('travelling_from')
        if data.get('travelling_to') is not None:
            filter_obj.travelling_to = data.get('travelling_to')
        if data.get('departure_date') is not None:
            filter_obj.departure_date = data.get('departure_date')
        if data.get('departure_time') is not None:
            filter_obj.departure_time = data.get('departure_time')
        if data.get('arrival_date') is not None:
            filter_obj.arrival_date = data.get('arrival_date')
        if data.get('arrival_time') is not None:
            filter_obj.arrival_time = data.get('arrival_time')
        if data.get('transport_mode') is not None:
            filter_obj.transport_mode = data.get('transport_mode')
        if data.get('price_per_kg') is not None:
            filter_obj.price_per_kg = data.get('price_per_kg')
        if data.get('description') is not None:
            filter_obj.description = data.get('description')
        if data.get('city') is not None:
            filter_obj.city = data.get('city')
        if data.get('country') is not None:
            filter_obj.country = data.get('country')
        if data.get('country_name_code') is not None:
            filter_obj.country_name_code = data.get('country_name_code')
        if data.get('total_capacity') is not None:
            filter_obj.total_capacity = data.get('total_capacity')
        if data.get('latitude') is not None:
            filter_obj.latitude = data.get('latitude')
        if data.get('longitude') is not None:
            filter_obj.longitude = data.get('longitude')

        try:
            filter_obj.save()
        except Exception as e:
            message = f"Update failed: {str(e)}" if lang == 'en' else f"Échec de la mise à jour: {str(e)}"
            return Response({'message': message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

        message = 'Traveler details updated successfully' if lang == 'en' else 'Détails du voyageur mis à jour avec succès'
        return Response({'message': message, 'statusCode': status.HTTP_200_OK}, status=status.HTTP_200_OK)

		

class TravellerDelete(APIView):
    def post(self, request):
        lang = request.headers.get('Accept-Language', 'fr')

        try:
            uid = authenticated(request)
        except Exception as e:
            message = str(e) if lang == 'en' else 'Non autorisé'
            return Response({'message': message, 'statusCode': status.HTTP_401_UNAUTHORIZED}, status=status.HTTP_401_UNAUTHORIZED)

        app_user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
        if not app_user_obj:
            message = 'User not found' if lang == 'en' else "L'utilisateur n'a pas été trouvé"
            return Response({'message': message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

        travel_id = request.data.get('travel_id')
        if not travel_id:
            message = 'Travel ID not found' if lang == 'en' else "Identifiant de voyage non trouvé"
            return Response({'message': message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

        filter_obj = AddTravel.objects.filter(id=travel_id).first()

        if filter_obj:
            filter_obj.end_date = datetime.now()
            filter_obj.save()

        message = 'Deleted successfully' if lang == 'en' else 'Supprimé avec succès'
        return Response({'message': message, 'statusCode': status.HTTP_200_OK}, status=status.HTTP_200_OK)


import humanize
from django.utils import timezone

	
import humanize
from django.utils import timezone
import arrow


class TravellerRequestListings(APIView):
    def get(self, request):
        lang = request.headers.get('Accept-Language', 'fr')

        # Helper function for messages
        def msg(en_text, fr_text):
            return en_text if lang == 'en' else fr_text

        try:
            uid = authenticated(request)
        except Exception:
            return Response({'message': msg('Unauthorized', 'Non autorisé'), 'statusCode': status.HTTP_401_UNAUTHORIZED}, status=status.HTTP_401_UNAUTHORIZED)

        app_user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
        if not app_user_obj:
            return Response({'message': msg('User not found', "L'utilisateur n'a pas été trouvé"), 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

        order_status = request.GET.get('status')
        # if not order_status:
        #     return Response({'message': msg('Status not found', 'Statut non trouvé'), 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

        if order_status == 'completed':
            queryset = TravellerRequests.objects.filter(
                traveller=app_user_obj,
                req_status__in=['completed', 'rejected']
            ).select_related('sender', 'route', 'traveller')
        else:
            queryset = TravellerRequests.objects.filter(
                traveller=app_user_obj,
                req_status__in=['pending', 'accepted', 'Picked']
            ).select_related('sender', 'route', 'traveller')

        all_data = []
        now = timezone.now()
        for data in queryset:
            all_data.append({
                'id': data.id,
                'sender_id': data.sender.id,
                'sender_image': data.sender.image,
                'sender_full_name': data.sender.full_name,
                'sender_email': data.sender.email,
                'traveller_id': data.traveller.id,
                'traveller_full_name': data.traveller.full_name,
                'traveller_email': data.traveller.email,
                'route_id': data.route.id,
                'name': data.route.name,
                'image_url': data.route.image_url,
                'departure_date': data.route.departure_date,
                'departure_time': data.route.departure_time,
                'price_per_kg': data.route.price_per_kg,
                'arrival_date': data.route.arrival_date,
                'arrival_time': data.route.arrival_time,
                'travelling_from': data.route.travelling_from,
                'travelling_to': data.route.travelling_to,
                'sender_phone_number': data.sender.phone_number,
                'sender_country_code': data.sender.country_code,
                'parcel_drop_off_address': data.parcel_drop_off_address,
                'receipient_country': data.country,
                'receipient_city': data.city,
                'req_status': data.req_status,
                'request_time': arrow.get(data.created_at).humanize(locale='fr' if 'fr' in request.headers.get('Accept-Language', '').lower() else 'en'),

                'recepient_email': data.recepient_email,
                'recepient_name': data.recepient_name,
                'recepient_phone_number': data.recepient_phone_number,
                'sender_country': data.sender_country,
                'sender_city': data.sender_city,
                'weight_parcel': data.weight_parcel,
                'parcel_description': data.parcel_description,
                'payment_status': data.payment_status,
                'recepient_country_code': data.recepient_country_code,
            })

        # Pagination params
        try:
            page = int(request.query_params.get('page', 1))
            page_size = int(request.query_params.get('page_size', 10))
        except ValueError:
            return Response({'message': msg('Invalid page or page_size', 'Page ou taille de page invalide'), 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

        total_count = len(all_data)
        start = (page - 1) * page_size
        end = start + page_size
        paginated_data = all_data[start:end]

        return Response({
            'message': msg('Success', 'Succès'),
            'total_count': total_count,
            'page': page,
            'page_size': page_size,
            'all_data': paginated_data,
            'statusCode': status.HTTP_200_OK
        }, status=status.HTTP_200_OK)

		

class AcceptRejectRequests(APIView):
	def post(self, request):
		try:
			lang = request.headers.get('Accept-Language', 'en')

			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({
					'message': 'Unauthorized' if lang == 'en' else 'Non autorisé',
					'statusCode': status.HTTP_401_UNAUTHORIZED
				}, status=status.HTTP_401_UNAUTHORIZED)

			app_user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not app_user_obj:
				return Response({
					'message': 'User not found' if lang == 'en' else "L'utilisateur n'a pas été trouvé",
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

			data = request.data
			request_id = data.get('request_id')
			req_status = data.get('status')

			filter_data = TravellerRequests.objects.filter(id=request_id).first()
			if filter_data:
				filter_data.req_status = req_status
				filter_data.save()

			if req_status == 'rejected':
				filter_data.route.editable = True
				filter_data.route.save()

			# if req_status == 'accepted':
			# 	route = MyRoute.objects.filter(requests=filter_data).first()
			# 	if route:
			# 		route.order_status = req_status
			# 		route.requests.route.total_capacity = int(route.requests.route.total_capacity) - int(route.requests.weight_parcel)
			# 		route.save()

			try:
				if app_user_obj.fcm_token:
					send_push_notification(
						filter_data.sender.fcm_token,
						f"Request {req_status}",
						f"Your request has been {req_status}."
					)
			except Exception as e:
				print(f"Notification failed: {e}")

			UserNotifications.objects.create(
				user=filter_data.sender,
				message=(
					f'Your travel request has been {req_status} by {filter_data.traveller.full_name}'
					if lang == 'en'
					else f'Votre demande de voyage a été {req_status} par {filter_data.traveller.full_name}'
				)
			)

			return Response({
				"message": (
					f"Request {req_status} successfully"
					if lang == 'en'
					else f"Requête {req_status} avec succès"
				),
				'statusCode': status.HTTP_200_OK
			}, status=status.HTTP_200_OK)

		except Exception as e:
			return Response({
				"message": "Internal Server Error" if lang == 'en' else 'Erreur du serveur interne',
				'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

		


class DeleteRoute(APIView):
	def post(self, request):
		try:
			lang = request.headers.get('Accept-Language', 'en')

			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({
					'message': 'Unauthorized' if lang == 'en' else 'Non autorisé',
					'statusCode': status.HTTP_401_UNAUTHORIZED
				}, status=status.HTTP_401_UNAUTHORIZED)

			user = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not user:
				return Response({
					'message': 'User not found' if lang == 'en' else "L'utilisateur n'a pas été trouvé",
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

			data = request.data
			route_id = data.get('route_id')
			if not route_id:
				return Response({
					"message": 'route_id is required' if lang == 'en' else "L'identifiant de l'itinéraire est requis",
					'statusCode': status.HTTP_400_BAD_REQUEST
				}, status=status.HTTP_400_BAD_REQUEST)

			check_route = MyRoute.objects.filter(id=route_id).first()
			if not check_route:
				return Response({
					'message': 'Route not found' if lang == 'en' else "Itinéraire non trouvé",
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

			check_route.end_date = datetime.now()
			print(check_route.requests)
			check_route.save()

			filter_data = TravellerRequests.objects.filter(id=check_route.requests.id).first()
			if filter_data:
				filter_data.req_status = 'pending'
				filter_data.save()

			return Response({
				"message": "Route deleted successfully" if lang == 'en' else "Itinéraire supprimé avec succès",
				'statusCode': status.HTTP_200_OK
			}, status=status.HTTP_200_OK)

		except Exception as e:
			return Response({
				"message": "Internal Server Error" if lang == 'en' else "Erreur du serveur interne",
				'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


		

class RouteStatus(APIView):
	def post(self, request):
		lang = request.headers.get('Accept-Language', 'en')

		try:
			uid = authenticated(request)
		except Exception as e:
			return Response({
				'message': 'Unauthorized' if lang == 'en' else 'Non autorisé'
			}, status=status.HTTP_401_UNAUTHORIZED)

		user = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
		if not user:
			return Response({
				'message': 'User not found' if lang == 'en' else "Utilisateur non trouvé",
				'statusCode': status.HTTP_404_NOT_FOUND
			}, status=status.HTTP_404_NOT_FOUND)

		request_id = request.data.get('request_id')
		get_status = request.data.get('status')
		pickup_image = request.data.get('image_url')

		if not request_id:
			return Response({
				"message": "request_id is required" if lang == 'en' else "L'identifiant de la demande est requis",
				'statusCode': status.HTTP_400_BAD_REQUEST
			}, status=status.HTTP_400_BAD_REQUEST)

		if not get_status:
			return Response({
				"message": "status is required" if lang == 'en' else "Le statut est requis",
				'statusCode': status.HTTP_400_BAD_REQUEST
			}, status=status.HTTP_400_BAD_REQUEST)

		filter_data = TravellerRequests.objects.filter(id=request_id).first()
		if not filter_data:
			return Response({
				'message': 'Traveller request not found' if lang == 'en' else "Demande de voyageur introuvable",
				'statusCode': status.HTTP_404_NOT_FOUND
			}, status=status.HTTP_404_NOT_FOUND)

		filter_data.req_status = get_status
		filter_data.pickup_image = pickup_image
		filter_data.save()

		route = MyRoute.objects.filter(requests=filter_data).first()
		if route:
			route.order_status = get_status
			route.pickup_image = pickup_image
			route.requests.route.total_capacity = int(route.requests.route.total_capacity) - int(route.requests.weight_parcel)
			route.save()

		if get_status == "Picked":
			the_otp = random.randrange(1000, 9999, 5)
			filter_data.otp = the_otp
			filter_data.save()

			subject = "Account Verification" if lang == 'en' else "Vérification du compte"
			html_message = render_to_string('email_verification.html', {'otp': the_otp})
			plain_message = html_message
			from_email = settings.EMAIL_HOST_USER
			to = filter_data.recepient_email

			try:
				mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
			except Exception as email_error:
				print(email_error)
				return Response({
					"message": "Failed to send the verification email. Please try again later." if lang == 'en'
					else "Échec de l'envoi de l'e-mail de vérification. Veuillez réessayer plus tard.",
					'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
				}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

		return Response({
			"message": "Parcel picked up successfully" if lang == 'en' else "Colis récupéré avec succès",
			'statusCode': status.HTTP_200_OK
		}, status=status.HTTP_200_OK)

import logging

logger = logging.getLogger(__name__)

class RouteOtpVerification(APIView):
	def post(self, request):
		lang = request.headers.get('Accept-Language', 'en')

		try:
			data = request.data
			request_id = data.get('request_id')
			otp = data.get('otp')
			dropoff_image = data.get('image_url')

			if not request_id:
				return Response(
					{
						"message": "request_id is required" if lang == 'en' else "L'identifiant de la demande est requis",
						"statusCode": status.HTTP_400_BAD_REQUEST
					},
					status=status.HTTP_400_BAD_REQUEST
				)

			if not otp:
				return Response(
					{
						"message": "OTP is required" if lang == 'en' else "Le code OTP est requis",
						"statusCode": status.HTTP_400_BAD_REQUEST
					},
					status=status.HTTP_400_BAD_REQUEST
				)

			request_obj = TravellerRequests.objects.filter(id=request_id, otp=otp).first()
			if request_obj:
				request_obj.req_status = "completed"
				request_obj.dropoff_image = dropoff_image
				request_obj.save()
				request_obj.route.editable = False
				request_obj.route.save()

				# --- Update traveller's completed percentage and route count ---
				traveller = request_obj.traveller
				if traveller:
					total_requests = TravellerRequests.objects.filter(traveller=traveller).count()
					completed_requests = TravellerRequests.objects.filter(
						traveller=traveller, req_status='completed'
					).count()

					completed_percentage = (completed_requests / total_requests) * 100 if total_requests > 0 else 0.0

					traveller.completed_routes = completed_requests
					traveller.is_route_percentage = round(completed_percentage, 2)
					traveller.save()

				try:
					user_to_notify = request_obj.sender
					if user_to_notify and user_to_notify.fcm_token:
						send_push_notification(
							user_to_notify.fcm_token,
							"Delivery Completed" if lang == 'en' else "Livraison terminée",
							f"Your route request has been completed by {traveller.full_name}." if lang == 'en'
							else f"Votre demande de trajet a été complétée par {traveller.full_name}."
						)

					UserNotifications.objects.create(
						user=user_to_notify,
						message=(
							f"Your route request has been completed by {traveller.full_name}"
							if lang == 'en'
							else f"Votre demande de trajet a été complétée par {traveller.full_name}"
						)
					)
				except Exception as e:
					print(f"Notification failed: {e}")

				return Response(
					{
						"message": "Parcel verified successfully" if lang == 'en' else "Colis vérifié avec succès",
						"statusCode": status.HTTP_200_OK
					},
					status=status.HTTP_200_OK
				)
			else:
				return Response(
					{
						"message": "Invalid OTP" if lang == 'en' else "Code OTP invalide",
						"statusCode": status.HTTP_400_BAD_REQUEST
					},
					status=status.HTTP_400_BAD_REQUEST
				)

		except Exception as e:
			logger.exception("Unexpected error in RouteOtpVerification")
			return Response(
				{
					"message": "Internal server error" if lang == 'en' else "Erreur interne du serveur",
					"details": str(e),
					"statusCode": status.HTTP_500_INTERNAL_SERVER_ERROR
				},
				status=status.HTTP_500_INTERNAL_SERVER_ERROR
			)





class AddBankDetails(APIView):
	def get(self, request):
		lang = request.headers.get('Accept-Language', 'en')

		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not user:
				return Response({
					'message': "User not found" if lang == 'en' else "Utilisateur non trouvé",
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

			data = {
				'bank_account_name': user.bank_account_name,
				'bank_account_number': user.bank_account_number,
				'bank_name': user.bank_name,
				'bank_ifsc_code': user.bank_ifsc_code,
			}

			return Response({
				'message': "Bank details fetched successfully" if lang == 'en' else "Détails bancaires récupérés avec succès",
				'statusCode': status.HTTP_200_OK,
				'all_data': data
			}, status=status.HTTP_200_OK)

		except Exception as e:
			return Response({
				"message": "Internal server error" if lang == 'en' else "Erreur interne du serveur",
				"details": str(e),
				"statusCode": status.HTTP_500_INTERNAL_SERVER_ERROR
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

	def post(self, request):
		lang = request.headers.get('Accept-Language', 'en')

		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not user:
				return Response({
					'message': "User not found" if lang == 'en' else "Utilisateur non trouvé",
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

			bank_account_name = request.data.get('bank_account_name')
			bank_account_number = request.data.get('bank_account_number')
			bank_name = request.data.get('bank_name')
			bank_ifsc_code = request.data.get('bank_ifsc_code')

			if not bank_account_name:
				return Response({
					"message": "Account holder name is required" if lang == 'en' else "Le nom du titulaire du compte est requis",
					"statusCode": status.HTTP_400_BAD_REQUEST
				}, status=status.HTTP_400_BAD_REQUEST)

			if not bank_account_number:
				return Response({
					"message": "Bank account number is required" if lang == 'en' else "Le numéro de compte bancaire est requis",
					"statusCode": status.HTTP_400_BAD_REQUEST
				}, status=status.HTTP_400_BAD_REQUEST)

			if not bank_name:
				return Response({
					"message": "Bank name is required" if lang == 'en' else "Le nom de la banque est requis",
					"statusCode": status.HTTP_400_BAD_REQUEST
				}, status=status.HTTP_400_BAD_REQUEST)

			if not bank_ifsc_code:
				return Response({
					"message": "IFSC code is required" if lang == 'en' else "Le code IFSC est requis",
					"statusCode": status.HTTP_400_BAD_REQUEST
				}, status=status.HTTP_400_BAD_REQUEST)

			user.bank_account_name = bank_account_name
			user.bank_account_number = bank_account_number
			user.bank_name = bank_name
			user.bank_ifsc_code = bank_ifsc_code
			user.save()

			return Response({
				'message': "Bank details added successfully" if lang == 'en' else "Détails bancaires ajoutés avec succès",
				'statusCode': status.HTTP_200_OK
			}, status=status.HTTP_200_OK)

		except Exception as e:
			return Response({
				"message": "Internal server error" if lang == 'en' else "Erreur interne du serveur",
				"details": str(e),
				"statusCode": status.HTTP_500_INTERNAL_SERVER_ERROR
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class RequestedMoneyView(APIView):
	def get(self, request):
		lang = request.headers.get('Accept-Language', 'en')

		try:
			uid = authenticated(request)
			user = AppUser.objects.filter(id=uid, end_date__isnull=True).first()
			if not user:
				return Response({
					'message': "User not found" if lang == 'en' else 'Utilisateur non trouvé',
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

			requested_money = RequestedMoney.objects.filter(user=user, end_date__isnull=True).order_by('-created_at')

			data = [{
				'id': record.id,
				'requested_money': record.requested_money if lang == 'en' else record.requested_money,
				'available_balance': record.available_balance if lang == 'en' else record.available_balance,
				'total_balance': record.total_balance if lang == 'en' else record.total_balance,
				'created_at': record.created_at,
				'updated_at': record.updated_at,
				'transaction_status': record.transaction_status if lang == 'en' else record.transaction_status
			} for record in requested_money]

			response_data = {
				'message': "Requested money fetched successfully" if lang == 'en' else 'Argent demandé récupéré avec succès',
				'total_earning': user.total_earning if lang == 'en' else user.total_earning,
				'total_withdrawal': user.total_withdrawl if lang == 'en' else user.total_withdrawl,
				'all_data': data if lang == 'en' else data,
				'statusCode': status.HTTP_200_OK
			}

			return Response(response_data, status=status.HTTP_200_OK)

		except Exception as e:
			return Response({
				'message': "Internal server error" if lang == 'en' else 'Erreur interne du serveur',
				'details': str(e),
				'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


	def post(self, request):
		lang = request.headers.get('Accept-Language', 'en')

		try:
			uid = authenticated(request)
			user = AppUser.objects.filter(id=uid, end_date__isnull=True).first()
			if not user:
				return Response({
					'message': "User not found" if lang == 'en' else 'Utilisateur non trouvé',
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

			requested_money = request.data.get('requested_money')
			if not requested_money:
				return Response({
					'message': "Requested amount is required" if lang == 'en' else "Le montant demandé est requis",
					'statusCode': status.HTTP_400_BAD_REQUEST
				}, status=status.HTTP_400_BAD_REQUEST)

			solde_disponible = user.wallet_money
			if int(requested_money) > solde_disponible:
				return Response({
					'message': "You do not have this amount available in your wallet" if lang == 'en' else "Vous n'avez pas ce montant disponible dans votre portefeuille",
					'statusCode': status.HTTP_400_BAD_REQUEST
				}, status=status.HTTP_400_BAD_REQUEST)

			requested_obj = RequestedMoney.objects.create(
				user=user,
				requested_money=int(requested_money),
				available_balance=solde_disponible - int(requested_money),
				total_balance=solde_disponible,
				transaction_status='pending' if lang == 'en' else 'en attente'
			)

			user.wallet_money = solde_disponible - int(requested_money)
			user.total_withdrawl = user.total_withdrawl + int(requested_money)
			user.save()

			AdminNotifications.objects.create(
				message=f"{user.full_name} requested a wallet payout" if lang == 'en' else f"{user.full_name} a demandé un paiement depuis son portefeuille"
			)

			return Response({
				'message': "Money request submitted successfully" if lang == 'en' else "Demande d'argent effectuée avec succès",
				'statusCode': status.HTTP_200_OK
			}, status=status.HTTP_200_OK)

		except Exception as e:
			return Response({
				'message': "Internal server error" if lang == 'en' else "Erreur interne du serveur",
				'details': str(e),
				'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)





