# 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 .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 adminapi.functions import *

from adminapi.models import *
from userapi.models import *
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
# from django.core.mail import EmailMultiAlternatives
import math, random, pytz, string
from userapi.authentication import *

from django.conf import settings

import stripe
from django.db.models import Q
from twilio.jwt.access_token.grants import (
	SyncGrant,
	ChatGrant,
	VideoGrant
)
from twilio.rest import Client
from twilio.jwt.access_token import AccessToken
from django.utils.timesince import timesince
# from adminapi.models import *
from firebase_admin import messaging

account_sid= settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
chat_service_sid = settings.TWILIO_CHAT_SID
sync_service_sid = settings.TWILIO_SYNC_SID
api_sid = settings.TWILIO_API_SID
api_secret= settings.TWILIO_API_SECRET
client = Client(account_sid, auth_token)

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 Register(APIView):
    def post(self, request):
        data = request.data
        lang = request.headers.get('Accept-Language', 'en')[:2]

        full_name = data.get('full_name')
        email = data.get('email')
        if email:
            email = email.lower()

        password = data.get('password')
        phoneNumber = data.get('phoneNumber')
        countryCode_raw = data.get('countryCode', '')
        countryCode = countryCode_raw.strip()
        if not countryCode.startswith('+'):
            countryCode = f'+{countryCode}'

        country = data.get('country')
        country_name_code = data.get('country_name_code')
        fcm_token = data.get('fcm_token')
        device_type = data.get('device_type')

        # Input validation
        if not email or not full_name or not password:
            return Response({
                "message": {
                    "en": "All required fields must be provided.",
                    "fr": "Tous les champs requis doivent être remplis."
                }[lang],
                "statusCode": status.HTTP_400_BAD_REQUEST
            }, status=status.HTTP_400_BAD_REQUEST)

        if AppUser.objects.filter(email=email, end_date__isnull=True).exists():
            return Response({
                "message": {
                    "en": "This email is already registered.",
                    "fr": "Cet e-mail est déjà enregistré."
                }[lang],
                "statusCode": status.HTTP_409_CONFLICT
            }, status=status.HTTP_409_CONFLICT)

        if AppUser.objects.filter(country_code=countryCode, phone_number=phoneNumber, end_date__isnull=True).exists():
            return Response({
                "message": {
                    "en": "This phone number is already registered.",
                    "fr": "Ce numéro de téléphone est déjà enregistré."
                }[lang],
                "statusCode": status.HTTP_409_CONFLICT
            }, status=status.HTTP_409_CONFLICT)

        new_password = handler.hash(password)

        # Check again (optional duplicate logic)
        app_user_obj = AppUser.objects.filter(email=email, end_date__isnull=True).first()
        if app_user_obj:
            return Response({
                "message": {
                    "en": "This email is already registered.",
                    "fr": "Cet e-mail est déjà enregistré."
                }[lang],
                "statusCode": status.HTTP_409_CONFLICT
            }, status=status.HTTP_409_CONFLICT)

        user_stripe_id = generate_strip_id()
        the_otp = random.randrange(1000, 9999, 5)

        app_user_obj = AppUser.objects.create(
            full_name=full_name,
            email=email,
            password=new_password,
            otp=the_otp,
            country_code=countryCode,
            phone_number=phoneNumber,
            country=country,
            country_name_code=country_name_code,
            user_stripe_id=user_stripe_id,
            document_status='pending',
            fcm_token=fcm_token,
            device_type=device_type
        )

        subject = {
            "en": "Verify Account",
            "fr": "Vérifier le compte"
        }[lang]

        html_message = render_to_string('register_verification.html', {'otp': the_otp})
        mail.send_mail(subject, html_message, settings.EMAIL_HOST_USER, [email], html_message=html_message)

        AdminNotifications.objects.create(message={
            "en": f'{full_name} has been successfully registered.',
            "fr": f'{full_name} a été enregistré avec succès.'
        }[lang])

        return Response({
            "message": {
                "en": "You have been successfully registered. Please verify your email.",
                "fr": "Vous vous êtes inscrit avec succès. Veuillez vérifier votre adresse e-mail."
            }[lang],
            "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 SocialLogin(APIView):
    def post(self, request):
        try:
            lang = request.headers.get('Accept-Language', 'en')[:2]  # Get language: 'en' or 'fr'
            data = request.data

            provider_id = data.get('provider_id')
            email = data.get('email')
            full_name = data.get('full_name')
            social_id = data.get('social_id')
            device_type = data.get('device_type')
            fcm_token = data.get('fcm_token')

            if not provider_id or not social_id:
                return Response({
                    'message': {
                        'en': 'Provider and social_id are required.',
                        'fr': 'Le fournisseur et l’identifiant social sont requis.'
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            if not full_name:
                return Response({
                    'message': {
                        'en': 'Full name is required.',
                        'fr': 'Le nom complet est requis.'
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            if not email:
                return Response({
                    'message': {
                        'en': 'Email address is required.',
                        'fr': 'L’adresse e-mail est requise.'
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            if not social_id:
                return Response({
                    'message': {
                        'en': 'Social ID is required.',
                        'fr': 'L’identifiant social est requis.'
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            if not device_type:
                return Response({
                    'message': {
                        'en': 'Device type is required.',
                        'fr': 'Le type d’appareil est requis.'
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            if not fcm_token:
                return Response({
                    'message': {
                        'en': 'FCM token is required.',
                        'fr': 'Le jeton FCM est requis.'
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            # Check if user exists
            app_user_obj = AppUser.objects.filter(social_id=social_id, end_date__isnull=True).first()
            if not app_user_obj:
                app_user_obj = AppUser.objects.create(
                    full_name=full_name,
                    social_id=social_id,
                    provider_id=provider_id,
                    email=email,
                    device_type=device_type,
                    fcm_token=fcm_token
                )

            # Generate tokens
            refresh_token = RefreshToken.for_user(app_user_obj)

            allData = {
                'id': app_user_obj.id,
                'full_name': app_user_obj.full_name,
                'email': app_user_obj.email,
                'is_profile_completed': app_user_obj.is_profile_completed,
                'refresh': str(refresh_token),
                'access': str(refresh_token.access_token),
            }

            return Response({
                'message': {
                    'en': 'Success',
                    'fr': 'Succès'
                }[lang],
                'all_data': allData,
                '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)



from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework_simplejwt.tokens import RefreshToken
from .models import AppUser

class OtpVerification(APIView):
    def post(self, request):
        try:
            lang = request.headers.get('Accept-Language', 'en')[:2]  # 'en' or 'fr'
            data = request.data

            email = data.get('email')
            otp = data.get('otp')

            if not email:
                return Response({
                    "message": {
                        "en": "Email is required.",
                        "fr": "L'e-mail est requis."
                    }[lang],
                    "statusCode": status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

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

            try:
                app_user_obj = AppUser.objects.get(email=email, otp=otp, end_date__isnull=True)
            except Exception:
                return Response({
                    "message": {
                        "en": "Invalid OTP code.",
                        "fr": "Code OTP invalide."
                    }[lang],
                    "all_data": {},
                    "statusCode": status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            app_user_obj.email_verified = True
            app_user_obj.is_verified = True
            app_user_obj.save()

            refresh_token = RefreshToken.for_user(app_user_obj)

            allData = {
                'id': app_user_obj.id,
                'full_name': app_user_obj.full_name,
                'email': app_user_obj.email,
                'is_profile_completed': app_user_obj.is_profile_completed,
                'refresh': str(refresh_token),
                'access': str(refresh_token.access_token),
            }

            return Response({
                "message": {
                    "en": "Success",
                    "fr": "Succès"
                }[lang],
                "all_data": allData,
                "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 registerResendOTP(APIView):
    def post(self, request):
        try:
            lang = request.headers.get('Accept-Language', 'en')[:2]  # 'en' or 'fr'
            data = request.data
            email = data.get('email')
            if email:
                email = email.lower()

            # Check if the email exists
            app_user_obj = AppUser.objects.filter(email=email, end_date__isnull=True).first()
            if not app_user_obj:
                return Response({
                    "message": {
                        "en": "This email does not exist in the database.",
                        "fr": "Cet e-mail n'existe pas dans la base de données."
                    }[lang],
                    "statusCode": status.HTTP_409_CONFLICT
                }, status=status.HTTP_409_CONFLICT)

            # Generate new OTP
            the_otp = random.randrange(1000, 9999, 5)
            app_user_obj.otp = the_otp
            app_user_obj.save()

            subject = {
                "en": "Verify your account",
                "fr": "Vérifiez votre compte"
            }[lang]

            html_message = render_to_string('register_verification.html', {'otp': the_otp})
            plain_message = html_message
            from_email = settings.EMAIL_HOST_USER
            to = email

            try:
                mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            except Exception:
                return Response({
                    "message": {
                        "en": "We encountered a problem sending the verification email. Please contact support for help.",
                        "fr": "Nous avons rencontré un problème lors de l’envoi de l’e-mail de vérification. Veuillez contacter le support pour obtenir de l’aide."
                    }[lang],
                    'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
                }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

            return Response({
                "message": {
                    "en": "OTP sent successfully. Please check your email address.",
                    "fr": "OTP envoyé avec succès. Veuillez vérifier votre adresse e-mail."
                }[lang],
                '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 LoginUser(APIView):
    def post(self, request):
        try:
            lang = request.headers.get('Accept-Language', 'en')[:2]  # 'en' or 'fr'
            data = request.data
            email = data.get('email')
            email = email.lower() if email else ''
            password = data.get('password')
            fcm_token = data.get('fcm_token')
            device_type = data.get('device_type')

            if not email:
                return Response({
                    "message": {
                        "en": "Email address is required",
                        "fr": "L'adresse e-mail est requise"
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            if not password:
                return Response({
                    "message": {
                        "en": "Password is required",
                        "fr": "Le mot de passe est requis"
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            user_count = AppUser.objects.filter(email=email, end_date__isnull=True).count()
            if user_count == 0:
                return Response({
                    "message": {
                        "en": "This email does not exist in our database, please register",
                        "fr": "Cet e-mail n'existe pas dans notre base de données, veuillez vous inscrire"
                    }[lang],
                    'statusCode': status.HTTP_404_NOT_FOUND
                }, status=status.HTTP_404_NOT_FOUND)

            app_user_obj = AppUser.objects.filter(email=email, status=True, end_date__isnull=True).first()
            if not app_user_obj:
                return Response({
                    "message": {
                        "en": "Your account has been deactivated by the administrator.",
                        "fr": "Votre compte a été désactivé par l’administrateur."
                    }[lang],
                    'statusCode': status.HTTP_404_NOT_FOUND
                }, status=status.HTTP_404_NOT_FOUND)

            check_password = app_user_obj.password
            check = handler.verify(password, check_password)

            if check:
                if not app_user_obj.email_verified:
                    the_otp = random.randrange(1000, 9999, 5)
                    app_user_obj.otp = the_otp
                    app_user_obj.fcm_token = fcm_token
                    app_user_obj.device_type = device_type
                    app_user_obj.save()

                    subject = {
                        "en": "Verify Account",
                        "fr": "Vérifiez votre compte"
                    }[lang]
                    html_message = render_to_string('register_verification.html', {'otp': the_otp})
                    plain_message = html_message
                    from_email = settings.EMAIL_HOST_USER
                    to = email

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

                    return Response({
                        "message": {
                            "en": "Your email address is not verified. We have sent the verification code to your email, please check.",
                            "fr": "Votre adresse e-mail n’est pas vérifiée. Nous avons envoyé le code de vérification sur votre e-mail, veuillez le vérifier."
                        }[lang],
                        'statusCode': status.HTTP_200_OK
                    }, status=status.HTTP_200_OK)
                else:
                    app_user_obj.fcm_token = fcm_token
                    app_user_obj.device_type = device_type
                    app_user_obj.save()
                    refresh_token = RefreshToken.for_user(app_user_obj)
                    allData = {
                        'id': app_user_obj.id,
                        'full_name': app_user_obj.full_name,
                        'email': app_user_obj.email,
                        'is_profile_completed': app_user_obj.is_profile_completed,
                        'refresh': str(refresh_token),
                        'access': str(refresh_token.access_token),
                    }
                    return Response({
                        "message": {
                            "en": "Login successful",
                            "fr": "Connexion réussie"
                        }[lang],
                        "all_data": allData,
                        "statusCode": status.HTTP_200_OK
                    }, status=status.HTTP_200_OK)
            else:
                return Response({
                    "message": {
                        "en": "Invalid login credentials",
                        "fr": "Identifiants de connexion invalides"
                    }[lang],
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

        except Exception as e:
            return Response({
                "message": str(e),
                'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



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

			if not email:
				return Response({
					"message": "L'adresse e-mail est requise" if lang == 'fr' else "Email is required",
					'statusCode': status.HTTP_400_BAD_REQUEST
				}, status=status.HTTP_400_BAD_REQUEST)

			user_count = AppUser.objects.filter(email=email, end_date__isnull=True).count()
			if user_count == 0:
				return Response({
					"message": "Cet e-mail n'existe pas dans notre base de données, veuillez saisir une adresse e-mail valide."
					if lang == 'fr' else
					"This email does not exist in our database, please enter a valid email.",
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

			app_user_obj = AppUser.objects.filter(email=email, end_date__isnull=True).first()
			if app_user_obj:
				the_otp = random.randrange(1000, 9999, 5)
				app_user_obj.otp = the_otp
				app_user_obj.save()

				subject = 'Mot de passe oublié' if lang == 'fr' else 'Forgot Password'
				html_message = render_to_string('forget_password_email.html', {'otp': the_otp})
				plain_message = html_message
				from_email = settings.EMAIL_HOST_USER
				to = email

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

				return Response({
					"message": "Le code OTP pour réinitialiser le mot de passe a été envoyé à votre adresse e-mail."
					if lang == 'fr' else
					"Reset password OTP has been sent to your email address.",
					'statusCode': status.HTTP_200_OK
				}, status=status.HTTP_200_OK)

			else:
				return Response({
					"message": "L’e-mail n’existe pas" if lang == 'fr' else "Email does not exist",
					'statusCode': status.HTTP_404_NOT_FOUND
				}, status=status.HTTP_404_NOT_FOUND)

		except Exception as e:
			return Response({
				"message": str(e),
				'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)




class ForgetPasswordVerification(APIView):
    def post(self, request):
        try:
            lang = request.headers.get('Accept-Language', 'en').lower()
            data = request.data
            email = data.get('email')
            otp = data.get('otp')

            if not email:
                return Response({
                    "message": "L'adresse e-mail est requise" if lang == 'fr' else "Email is required",
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

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

            app_user_obj = AppUser.objects.filter(email=email, otp=otp, end_date__isnull=True).first()
            if not app_user_obj:
                return Response({
                    "message": "OTP invalide" if lang == 'fr' else "Invalid OTP",
                    'all_data': {},
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            return Response({
                "message": "Succès" if lang == 'fr' else "Success",
                '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 SetForgetPassword(APIView):
    def post(self, request):
        try:
            lang = request.headers.get('Accept-Language', 'en').lower()
            data = request.data
            email = data.get('email')
            new_password = data.get('new_password')
            otp = data.get('otp')

            if not new_password:
                return Response({
                    "message": "Le nouveau mot de passe est requis" if lang == 'fr' else "New password is required",
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            if not email:
                return Response({
                    "message": "L'adresse e-mail est requise" if lang == 'fr' else "Email is required",
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

            app_user_obj = AppUser.objects.filter(email=email, end_date__isnull=True).first()
            encrypt_password = handler.hash(new_password)

            if app_user_obj:
                app_user_obj.password = encrypt_password
                app_user_obj.otp = None
                app_user_obj.save()

                return Response({
                    "message": "Succès" if lang == 'fr' else "Success",
                    'statusCode': status.HTTP_200_OK
                }, status=status.HTTP_200_OK)
            else:
                return Response({
                    "message": "Une erreur s'est produite" if lang == 'fr' else "Something went wrong",
                    'statusCode': status.HTTP_400_BAD_REQUEST
                }, status=status.HTTP_400_BAD_REQUEST)

        except Exception as e:
            return Response({
                "message": str(e),
                'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


from datetime import datetime

from datetime import datetime
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from math import radians, cos, sin, asin, sqrt



def haversine(lat1, lon1, lat2, lon2):
	# convert decimal degrees to radians
	lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2])
	# haversine formula
	dlat = lat2 - lat1
	dlon = lon2 - lon1
	a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
	c = 2 * asin(sqrt(a))
	km = 6371 * c
	return km

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

        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(id=uid, end_date__isnull=True).first()
        if not app_user_obj:
            return Response({
                'message': "Utilisateur non trouvé" if lang == 'fr' else "User not found",
                'statusCode': status.HTTP_404_NOT_FOUND
            }, status=status.HTTP_404_NOT_FOUND)

        departure_date = request.GET.get('date')
        departure_time = request.GET.get('time')
        lat = request.GET.get('latitude')
        lng = request.GET.get('longitude')

        if not departure_date:
            return Response({
                "message": "La date est requise" if lang == 'fr' else "Date is required",
                "statusCode": status.HTTP_400_BAD_REQUEST
            }, status=status.HTTP_400_BAD_REQUEST)
        if not departure_time:
            return Response({
                "message": "L’heure est requise" if lang == 'fr' else "Time is required",
                "statusCode": status.HTTP_400_BAD_REQUEST
            }, status=status.HTTP_400_BAD_REQUEST)

        try:
            user_lat = float(lat)
            user_lng = float(lng)
        except ValueError:
            return Response({
                'message': "Latitude ou longitude invalide" if lang == 'fr' else "Invalid latitude or longitude",
                'statusCode': status.HTTP_400_BAD_REQUEST
            }, status=status.HTTP_400_BAD_REQUEST)

        input_date = datetime.strptime(departure_date, "%Y-%m-%d").date()
        all_data = []

        filter_queryset = AddTravel.objects.filter(
            departure_date__gte=input_date,
            end_date__isnull=True
        ).exclude(user=app_user_obj)

        for travel in filter_queryset:
            if travel.latitude and travel.longitude:
                distance_km = haversine(user_lat, user_lng, float(travel.latitude), float(travel.longitude))
                if distance_km <= 10:
                    if not TravellerRequests.objects.filter(sender=app_user_obj, route=travel.id).exists() or int(travel.total_capacity) == 0:
                        all_data.append({
                            'id': travel.id,
                            'user_id': travel.user.id,
                            'travelling_from': travel.travelling_from,
                            'travelling_to': travel.travelling_to,
                            'departure_date': travel.departure_date,
                            'departure_time': travel.departure_time,
                            'arrival_date': travel.arrival_date,
                            'arrival_time': travel.arrival_time,
                            'price_per_kg': travel.price_per_kg,
                            'total_capacity': travel.total_capacity,
                            'image_url': travel.image_url,
                            'name': travel.name,
                            'country': travel.country,
                            'city': travel.city,
                            'traveller_average_rating': travel.user.average_rating,
                            'traveller_is_route_percentage': travel.user.is_route_percentage,
                        })

        try:
            page = int(request.query_params.get('page', 1))
            page_size = int(request.query_params.get('page_size', 10))
        except ValueError:
            return Response({
                'message': "Page ou taille de page invalide" if lang == 'fr' else "Invalid page or page_size",
                '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": "Succès" if lang == 'fr' else "Success",
            "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 HomePageTravellerListing(APIView):
    def get(self, request):
        try:
            lang = request.headers.get('Accept-Language', 'en')

            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)

            app_user_obj = AppUser.objects.filter(id=uid, end_date__isnull=True).only('id').first()
            if not app_user_obj:
                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)

            today = datetime.today().date()

            existing_requests = TravellerRequests.objects.filter(sender=app_user_obj).values_list('route_id', flat=True)

            filter_queryset = AddTravel.objects.filter(
                end_date__isnull=True,
                departure_date__gte=today,
            ).exclude(
                user=app_user_obj
            ).exclude(
                id__in=existing_requests
            ).exclude(
                total_capacity=0
            ).values(
                'id',
                'user_id',
                'travelling_from',
                'travelling_to',
                'departure_date',
                'departure_time',
                'arrival_date',
                'arrival_time',
                'price_per_kg',
                'total_capacity',
                'image_url',
                'name',
                'country',
                'city',
                'sender_country',
                'sender_city'
            )

            user_ids = [item['user_id'] for item in filter_queryset]
            user_info = AppUser.objects.filter(id__in=user_ids).values('id', 'average_rating', 'is_route_percentage')
            user_info_map = {u['id']: u for u in user_info}

            all_data = []
            for travel in filter_queryset:
                user_meta = user_info_map.get(travel['user_id'], {})
                travel['traveller_average_rating'] = user_meta.get('average_rating', 0)
                travel['traveller_is_route_percentage'] = user_meta.get('is_route_percentage', False)
                all_data.append(travel)

            try:
                page = int(request.query_params.get('page', 1))
                page_size = int(request.query_params.get('page_size', 10))
            except ValueError:
                return Response({
                    'message': "Invalid page or page_size" if lang == 'en' else "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 interne du serveur",
                'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class SendRequest(APIView):
    def post(self, request):
        try:
            lang = request.headers.get('Accept-Language', 'en')
            try:
                uid = authenticated(request)
            except Exception as e:
                message = "Unauthorized access" if lang == 'en' else "Accès non autorisé"
                return Response({'message': message, 'statusCode': status.HTTP_401_UNAUTHORIZED}, status=status.HTTP_401_UNAUTHORIZED)

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

            data = request.data
            traveller_id = data.get('traveller_id')
            route_id = data.get('route_id')
            req_status = data.get('status')
            parcel_drop_off_address = data.get('parcel_drop_off_address')
            receipient_country = data.get('receipient_country')
            receipient_city = data.get('receipient_city')
            sender_country = data.get('sender_country')
            sender_city = data.get('sender_city')
            weight_parcel = data.get('weight_parcel')
            parcel_description = data.get('parcel_description')
            recepient_email = data.get('recepient_email')
            recepient_phone_number = data.get('recepient_phone_number')
            recepient_country_code = data.get('recepient_country_code')
            if recepient_country_code and not recepient_country_code.startswith('+'):
                recepient_country_code = f'+{recepient_country_code}'
            recepient_name = data.get('recepient_name')

            if not traveller_id:
                message = "traveller_id is required" if lang == 'en' else "L'identifiant du voyageur est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not route_id:
                message = "route_id is required" if lang == 'en' else "L'identifiant de l'itinéraire est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not req_status:
                message = "Request status is required" if lang == 'en' else "Le statut de la demande est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not parcel_drop_off_address:
                message = "Parcel drop-off address is required" if lang == 'en' else "L'adresse de dépôt du colis est requise"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not receipient_country:
                message = "Recipient country is required" if lang == 'en' else "Le pays du destinataire est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not receipient_city:
                message = "Recipient city is required" if lang == 'en' else "La ville du destinataire est requise"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not sender_country:
                message = "Sender country is required" if lang == 'en' else "Le pays de l'expéditeur est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not sender_city:
                message = "Sender city is required" if lang == 'en' else "La ville de l'expéditeur est requise"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not weight_parcel:
                message = "Parcel weight is required" if lang == 'en' else "Le poids du colis est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not parcel_description:
                message = "Parcel description is required" if lang == 'en' else "La description du colis est requise"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not recepient_email:
                message = "Recipient email is required" if lang == 'en' else "L'e-mail du destinataire est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not recepient_phone_number:
                message = "Recipient phone number is required" if lang == 'en' else "Le numéro de téléphone du destinataire est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
            if not recepient_name:
                message = "Recipient name is required" if lang == 'en' else "Le nom du destinataire est requis"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

            get_traveller_obj = AppUser.objects.filter(id=traveller_id, end_date__isnull=True).first()
            if not get_traveller_obj:
                message = "Traveler with this ID not found" if lang == 'en' else "Voyageur avec cet identifiant introuvable"
                return Response({"message": message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

            get_route_obj = AddTravel.objects.filter(id=route_id).first()
            if not get_route_obj:
                message = "Route with this ID not found" if lang == 'en' else "Itinéraire avec cet identifiant introuvable"
                return Response({"message": message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

            if not int(get_route_obj.total_capacity) >= int(weight_parcel):
                message = f"Traveler cannot carry more than {get_route_obj.total_capacity} kg" if lang == 'en' else f"Le voyageur ne peut pas transporter plus de {get_route_obj.total_capacity} kg"
                return Response({"message": message, 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

            find_request = TravellerRequests.objects.filter(
                sender=app_user_obj,
                traveller=get_traveller_obj,
                route=get_route_obj
            ).exists()

            if not find_request:
                TravellerRequests.objects.create(
                    sender=app_user_obj,
                    traveller=get_traveller_obj,
                    route=get_route_obj,
                    req_status=req_status,
                    parcel_drop_off_address=parcel_drop_off_address,
                    country=receipient_country,
                    city=receipient_city,
                    sender_country=sender_country,
                    sender_city=sender_city,
                    weight_parcel=weight_parcel,
                    recepient_email=recepient_email,
                    recepient_phone_number=recepient_phone_number,
                    recepient_name=recepient_name,
                    parcel_description=parcel_description,
                    recepient_country_code=recepient_country_code
                )
                try:
                    if get_traveller_obj.fcm_token:
                        send_push_notification(
                            get_traveller_obj.fcm_token,
                            "New parcel request" if lang == 'en' else "Nouvelle demande de colis",
                            f"{app_user_obj.full_name} has sent you a delivery request." if lang == 'en' else f"{app_user_obj.full_name} vous a envoyé une demande de livraison."
                        )
                    UserNotifications.objects.create(
                        user=get_traveller_obj,
                        message=f"{app_user_obj.full_name} has sent you a delivery request." if lang == 'en' else f"{app_user_obj.full_name} vous a envoyé une demande de livraison."
                    )
                except Exception as e:
                    print(f"Notification sending failed: {e}")

            get_route_obj.editable = False
            get_route_obj.save()

            message = "Payment Request Sent Successfully" if lang == 'en' else "Demande de paiement envoyée avec succès"
            return Response({"message": message, '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)


		
from .utils import *

class UploadImages(APIView):
    def post(self, request):
        # try:
        lang = request.headers.get('Accept-Language', 'en')
        try:
            uid = authenticated(request)
        except Exception as e:
            message = "Unauthorized access" if lang == 'en' else "Accès non autorisé"
            return Response({'message': message}, status=status.HTTP_401_UNAUTHORIZED)

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

        data = request.data
        images = data.getlist('images')
        if not any(f for f in images):
            message = "No images found" if lang == 'en' else "Images non trouvées"
            return Response({'message': message}, status=status.HTTP_404_NOT_FOUND)

        image_urls = []

        for image in images:
            image_path = uploadTheProfile(image)
            image_url = settings.BASE_URL + image_path
            image_urls.append(image_url)

        message = "Success" if lang == 'en' else "Succès"
        return Response({'message': message, 'url': image_urls[0]})
        # except Exception as e:
        #     return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



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

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

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

			user_document = UserDocument.objects.filter(user_id=uid).last()
			if user_document:
				document_url = request.build_absolute_uri(user_document.document)
				user['document_url'] = document_url

			message = "Success" if lang == 'en' else "Succès"
			return Response({"message": message, "user": user, "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)

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

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

			user = AppUser.objects.filter(id=uid,end_date__isnull=True).first()
			if not user:
				message = "User not found" if lang == 'en' else "Utilisateur non trouvé"
				return Response({'message': message, 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)
			
			data = request.data
			full_name = data.get('full_name')
			email = data.get('email')
			gender = data.get('gender')
			age = data.get('age')
			image = data.get('image')
			dob = data.get('dob')
			country = data.get('country')
			country_name_code = data.get('country_name_code')
			address = data.get('address')

			if full_name:
				user.full_name = full_name
			if email:
				user.email = email
			if gender:
				user.gender = gender
			if age:
				user.age = age
			if image:
				user.image = image
			if dob:
				user.dob = dob
			if country:
				user.country = country
			if address:
				user.address = address
			if country_name_code:
				user.country_name_code = country_name_code

			try:
				user.save()
			except Exception as e:
				return Response({"message": str(e), 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

			message = "User updated successfully" if lang == 'en' else "Utilisateur mis à jour avec succès"
			return Response({"message": message, '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 AcceptedRequestsCreateRoute(APIView):
	def get(self, request):
		try:
			lang = request.headers.get('Accept-Language', 'fr')

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

			user = AppUser.objects.filter(end_date__isnull=True, id=uid).values().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)

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

			if order_status == 'completed':
				queryset = TravellerRequests.objects.filter(sender=user['id'], req_status__in=['completed', 'rejected'])
			else:
				queryset = TravellerRequests.objects.filter(sender=user['id'], req_status__in=['pending', 'accepted', 'Picked'])

			total_count = queryset.count()
			try:
				page = int(request.query_params.get('page', 1))
				page_size = int(request.query_params.get('page_size', 10))
			except ValueError:
				return Response({'message': 'Invalid page or page size' if lang == 'en' else 'Page ou taille de page invalide', 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

			start = (page - 1) * page_size
			end = start + page_size

			paginated_queryset = queryset[start:end]

			data_list = []
			for data in paginated_queryset:
				data_list.append({
					'id': data.id,
					'sender_id': data.sender.id,
					'sender_full_name': data.sender.full_name,
					'traveller_id': data.traveller.id,
					'traveller_full_name': data.traveller.full_name,
					'traveller_phone_number': data.traveller.phone_number,
					'traveller_country_code': data.traveller.country_code,
					'traveller_average_rating': data.traveller.average_rating,
					'traveller_is_route_percentage': data.traveller.is_route_percentage,
					'route_id': data.route.id,
					'name': data.route.name,
					'image_url': data.route.image_url,
					'price_per_kg': data.route.price_per_kg,
					'weight_of_parcel': data.weight_parcel,
					'departure_date': data.route.departure_date,
					'departure_time': data.route.departure_time,
					'arrival_date': data.route.arrival_date,
					'arrival_time': data.route.arrival_time,
					'travelling_from': data.route.travelling_from,
					'travelling_to': data.route.travelling_to,
					'phone_number': data.phone_number,
					'parcel_drop_off_address': data.parcel_drop_off_address,
					'country': data.country,
					'city': data.city,
					'req_status': data.req_status,
					'is_rating': True if data.rating else False,
					'payment_status': data.payment_status
				})

			return Response({
				'message': 'Success' if lang == 'en' else 'Succès',
				'total_count': total_count,
				'page': page,
				'page_size': page_size,
				'all_data': data_list,
				'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)

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

			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e), '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 'Utilisateur non trouvé', 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

			data = request.data
			request_id = data.get('request_id')
			if not request_id:
				return Response({"message": 'request_id is required' if lang == 'en' else 'request_id est requis', 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

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

			payment_status = data.get('payment_status')
			if not payment_status:
				return Response({"message": 'Payment status is required' if lang == 'en' else 'Le paiement est requis', 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

			create_route = MyRoute.objects.create(requests=filter_data, payment_status=payment_status)
			filter_data.payment_status = payment_status
			filter_data.route.total_capacity = int(filter_data.route.total_capacity) - int(filter_data.weight_parcel)
			filter_data.save()
			create_route.requests.route.total_capacity = int(create_route.requests.route.total_capacity) - int(create_route.requests.weight_parcel)
			create_route.save()

			try:
				receiver = filter_data.traveller
				sender_name = filter_data.sender.full_name

				if receiver.fcm_token:
					send_push_notification(
						receiver.fcm_token,
						"Route confirmed" if lang == 'en' else "Trajet confirmé",
						f"{sender_name} has completed the booking for your route." if lang == 'en' else f"{sender_name} a complété la réservation pour votre trajet."
					)

				UserNotifications.objects.create(
					user=receiver,
					message=f"{sender_name} has completed the booking for your route." if lang == 'en' else f"{sender_name} a complété la réservation pour votre trajet."
				)
			except Exception as e:
				print(f"Notification sending failed: {e}")

			return Response({"message": 'Route created successfully' if lang == 'en' else 'Trajet créé 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)

	

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.conf import settings
import stripe
		

from decimal import Decimal
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.conf import settings
import stripe

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

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

		user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
		request_id = request.data.get('request_id')
		price = request.data.get('price')
		payment_token = request.data.get('payment_token')
		card_id = request.data.get('card_id')
		card_type = request.data.get('card_type')

		if not card_id:
			return Response({'message': 'card_id is required' if lang == 'en' else 'Identifiant de carte requis'}, status=status.HTTP_400_BAD_REQUEST)
		if not card_type:
			return Response({'message': 'card_type is required' if lang == 'en' else 'Type de carte requis'}, status=status.HTTP_400_BAD_REQUEST)
		if not request_id:
			return Response({"message": 'request_id is required' if lang == 'en' else "Identifiant de demande requis", 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)
		if not price:
			return Response({"message": 'price is required' if lang == 'en' else "Montant requis", 'statusCode': status.HTTP_400_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST)

		filter_data = TravellerRequests.objects.filter(id=request_id, req_status='accepted').first()

		stripe.api_key = settings.STRIPE_SECRET_KEY
		if not filter_data:
			return Response({'message': 'TravellerRequests not found' if lang == 'en' else 'Demande de voyageur introuvable', 'statusCode': status.HTTP_404_NOT_FOUND}, status=status.HTTP_404_NOT_FOUND)

		if not user_obj.user_stripe_id:
			user_obj.user_stripe_id = generate_strip_id()
			user_obj.save()

		user_id = user_obj.user_stripe_id
		cardObj = UserCards.objects.filter(user=user_obj, card_id=card_id).first()
		if not cardObj:
			createCard = stripe.Customer.create_source(user_id, source=card_id)
			cardObj = UserCards.objects.create(
				user=user_obj,
				card_type=card_type,
				card_id=createCard['id'],
				exp_month=createCard['exp_month'],
				exp_year=createCard['exp_year'],
				the_user_stripe=createCard['customer'],
				last_digits=createCard['last4']
			)

		thePaymentObj = paymentWithExistingCard(cardObj.the_user_stripe, cardObj.card_id, price)

		if thePaymentObj['status'] is True:
			route = MyRoute.objects.filter(requests=filter_data).first()

			payment_amount = Decimal(price)
			commission = payment_amount * Decimal('0.10')  # 10%
			deducted_amount = payment_amount - commission

			super_admin = SuperAdmin.objects.first()
			if super_admin:
				super_admin.earnings = (super_admin.earnings or Decimal('0.00')) + commission
				super_admin.save()

			if route:
				route.payment_status = "completed"
				route.requests.route.total_capacity = int(route.requests.route.total_capacity) - int(route.requests.weight_parcel)
				route.requests.route.save()
			else:
				route = MyRoute.objects.create(requests=filter_data, payment_status="completed", payment=price)
				route.requests.route.total_capacity = int(route.requests.route.total_capacity) - int(route.requests.weight_parcel)
				route.requests.route.save()

			route.requests.route.user.wallet_money += deducted_amount
			route.requests.route.user.total_earning += deducted_amount
			route.requests.route.user.save()

			filter_data.payment_status = "completed"
			filter_data.save()

			try:
				traveller = route.requests.traveller
				sender = route.requests.sender

				if traveller.fcm_token:
					send_push_notification(
						traveller.fcm_token,
						"Payment Received" if lang == 'en' else "Paiement reçu",
						f"{sender.full_name} has completed payment for the parcel delivery." if lang == 'en' else f"{sender.full_name} a effectué le paiement pour votre itinéraire de colis."
					)

				UserNotifications.objects.create(
					user=traveller,
					message=f"{sender.full_name} has completed payment for the parcel delivery." if lang == 'en' else f"{sender.full_name} a effectué le paiement pour votre itinéraire de colis."
				)
			except Exception as e:
				print(f"Notification error: {e}")

			return Response({"message": 'payment created successfully' if lang == 'en' else 'Paiement effectué avec succès', 'statusCode': status.HTTP_200_OK}, status=status.HTTP_200_OK)

		else:
			return Response({"message": 'Something went wrong' if lang == 'en' else 'Une erreur est survenue', 'statusCode': status.HTTP_200_OK}, status=status.HTTP_200_OK)

		

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

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

			user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

			card_id = request.data.get('card_id')
			if not card_id:
				return Response({'message': 'card_id is required' if lang == 'en' else 'Identifiant de carte requis'}, status=status.HTTP_400_BAD_REQUEST)

			card_type = request.data.get('card_type')
			if not card_type:
				return Response({'message': 'card_type is required' if lang == 'en' else 'Type de carte requis'}, status=status.HTTP_400_BAD_REQUEST)

			if not user_obj.user_stripe_id:
				user_obj.user_stripe_id = generate_strip_id()
				user_obj.save()

			alldata = {}
			if user_obj.user_stripe_id:
				user_id = user_obj.user_stripe_id
				stripe.api_key = settings.STRIPE_SECRET_KEY
				createCard = stripe.Customer.create_source(user_id, source=card_id)
				if createCard:
					cardObj = UserCards.objects.create(
						user=user_obj,
						card_type=card_type,
						card_id=createCard['id'],
						exp_month=createCard['exp_month'],
						exp_year=createCard['exp_year'],
						the_user_stripe=createCard['customer'],
						last_digits=createCard['last4']
					)
					alldata = {
						'id': cardObj.id,
						'user_id': cardObj.user_id,
						'card_id': cardObj.card_id,
						'exp_month': cardObj.exp_month,
						'exp_year': cardObj.exp_year,
						'the_user_stripe': cardObj.the_user_stripe,
						'last_digits': cardObj.last_digits,
						'is_default': cardObj.is_default,
						'card_type': cardObj.card_type,
					}
			return Response({'status_code': status.HTTP_200_OK, 'message': 'Success' if lang == 'en' else 'Succès', 'data': alldata})
		except Exception as e:
			return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

		

class getUserCard(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)}, status=status.HTTP_401_UNAUTHORIZED)

			user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

			card_obj = UserCards.objects.filter(user=user_obj)
			all_Data = []
			for card in card_obj:
				all_data = {
					'id': card.id,
					'user_id': card.user_id,
					'card_id': card.card_id,
					'exp_month': card.exp_month,
					'exp_year': card.exp_year,
					'the_user_stripe': card.the_user_stripe,
					'last_digits': card.last_digits,
					'is_default': card.is_default,
					'card_type': card.card_type,
				}
				all_Data.append(all_data)

			return Response({
				'statusCode': status.HTTP_200_OK,
				'message': 'Success' if lang == 'en' else 'Succès',
				'all_data': all_Data
			})
		except Exception as e:
			return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


		

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

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

			user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

			card_id = request.data.get('card_id')
			if not card_id:
				return Response({'message': 'card_id is required' if lang == 'en' else 'card_id est requis'}, status=status.HTTP_400_BAD_REQUEST)

			card_obj = UserCards.objects.filter(id=card_id).first()
			if not card_obj:
				return Response({'message': 'No card found' if lang == 'en' else 'Aucune carte trouvée'}, status=status.HTTP_400_BAD_REQUEST)

			stripe.api_key = settings.STRIPE_SECRET_KEY
			stripe.Customer.delete_source(
				card_obj.the_user_stripe,
				card_obj.card_id
			)
			card_obj.delete()

			return Response({'status_code': status.HTTP_200_OK, 'message': 'Success' if lang == 'en' else 'Succès'})
		except Exception as e:
			return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

		


import json

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

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

		userObj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
		if not userObj:
			return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

		chat_user = request.data.get('chat_user')
		if not chat_user:
			return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'chat_user is required.' if lang == 'en' else 'chat_user est requis.'}, status=status.HTTP_400_BAD_REQUEST)

		chat_userObj_obj = AppUser.objects.filter(end_date__isnull=True, id=chat_user).first()
		if not chat_userObj_obj:
			return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'No user found' if lang == 'en' else 'Aucun utilisateur trouvé'}, status=status.HTTP_400_BAD_REQUEST)

		existing_conversation = ConversationUsers.objects.filter(user_two=chat_userObj_obj, user_one=userObj).first()
		if existing_conversation:
			twilio_channel_sid = existing_conversation.twilio_channel_sid
		else:
			concatinate_names = str(chat_userObj_obj.full_name) + str(userObj.full_name) + str(chat_userObj_obj.id) + str(userObj.id)
			suffle_string = list(concatinate_names)
			random.shuffle(suffle_string)
			conversation_name = ''.join(suffle_string)

			conversation = client.conversations \
				.v1 \
				.conversations \
				.create(friendly_name=conversation_name)

			conversation_obj = ConversationUsers.objects.filter(
				Q(user_one=userObj, user_two=chat_userObj_obj) | Q(user_one=chat_userObj_obj, user_two=userObj)
			).first()
			if not conversation_obj:
				conversation_obj = ConversationUsers.objects.create(user_one=userObj, user_two=chat_userObj_obj)
				conversation_obj.twilio_channel_sid = conversation.sid
			conversation_obj.last_message = datetime.now()
			conversation_obj.save()

			user_attributes = {
				"id": str(userObj.id),
				"name": str(userObj.full_name),
				"image": str(userObj.image)
			}
			user_json_attributes = json.dumps(user_attributes)

			chat_user_participant = client.conversations \
				.v1 \
				.conversations(conversation.sid) \
				.participants \
				.create(identity=str(userObj.id), attributes=user_json_attributes)

			user_two_attributes = {
				"id": str(chat_userObj_obj.id),
				"name": str(chat_userObj_obj.full_name),
				"image": str(chat_userObj_obj.image)
			}
			user_two_attributes_json_attributes = json.dumps(user_two_attributes)

			user_two_attributes_participant = client.conversations \
				.v1 \
				.conversations(conversation.sid) \
				.participants \
				.create(identity=str(chat_userObj_obj.id), attributes=user_two_attributes_json_attributes)

			conversation_obj.user_one_twilio_id = chat_user_participant.sid
			conversation_obj.user_two_twilio_id = user_two_attributes_participant.sid
			conversation_obj.save()

			twilio_channel_sid = conversation_obj.twilio_channel_sid

		return Response({
			'status_code': status.HTTP_200_OK,
			'message': 'Conversation added successfully' if lang == 'en' else 'Conversation ajoutée avec succès',
			'twilio_channel_sid': twilio_channel_sid
		}, status=status.HTTP_200_OK)




import jwt

		
class createToken(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)}, status=status.HTTP_401_UNAUTHORIZED)

			userObj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not userObj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

			identity = userObj.id
			token = AccessToken(account_sid, api_sid, api_secret, identity=identity)

			if chat_service_sid:
				chat_grant = ChatGrant(service_sid=chat_service_sid)
				token.add_grant(chat_grant)

			notification = client.conversations \
				.v1 \
				.services(chat_service_sid) \
				.configuration \
				.notifications() \
				.update(
					new_message_enabled=True,
					new_message_sound='default',
					new_message_template="You have a new message in ${CONVERSATION}: ${MESSAGE}"
				)

			alldata = {
				'identity': identity,
				'token': token.to_jwt(),
			}
			return Response({
				'status_code': status.HTTP_200_OK,
				'message': 'Token added successfully' if lang == 'en' else 'Jeton ajouté avec succès',
				'data': alldata
			}, status=status.HTTP_200_OK)

		except Exception as e:
			return Response({
				'status': status.HTTP_500_INTERNAL_SERVER_ERROR,
				'message': str(e)
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)





# class userConversationListing(APIView):
# 	def get(self, request):
# 		try:
# 			try:
# 				uid = authenticated(request)
# 			except Exception as e:
# 				return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
			
# 			userObj = AppUser.objects.filter(end_date__isnull=True,id=uid).first()
# 			if not userObj:
# 				return Response({'message': 'user not found'}, status=status.HTTP_404_NOT_FOUND)

# 			conversations = ConversationUsers.objects.filter(
# 				Q(user_one=userObj.id) | Q(user_two=userObj.id)
# 			).exclude(
# 				user_deleted=userObj  # M2M field handles this correctly
# 			).order_by('-id')

# 			print(conversations)
# 			conversation_list = []
# 			for conversation in conversations:
# 				messages = client.conversations \
# 					.v1 \
# 					.conversations(conversation.twilio_channel_sid) \
# 					.messages \
# 					.list(order='desc', limit=1)

# 				print('messages:-')
# 				print(messages)

# 				last_message = ''
# 				time = ''
# 				message_date = ''
# 				for record in messages:
# 					print('record:-')
# 					print('record:-', record.body)
# 					print('record:-', record.media)
# 					if record.body:
# 						print('record.body')
# 						print(record.body)
# 						last_message = record.body
# 						print(last_message)
# 						last_message = json.loads(last_message)
# 						# Access the 'message' value
# 						last_message = last_message['message']

# 						time = timesince(record.date_created) + ' ago'
# 						message_date = record.date_created

# 					elif not record.media:
# 						print('record.media')
# 						print(record.media)

# 						last_message = 'Media file'
# 						time = timesince(record.date_created) + ' ago'
# 						message_date = record.date_created

# 				print(conversation)
# 				conversation_data = {
# 					"id": conversation.id,
# 					"twilio_channel_sid": conversation.twilio_channel_sid,
# 					"user_one_name": conversation.user_one.full_name,
# 					"user_one_image": conversation.user_one.image,
# 					"user_one_id": conversation.user_one.id,
# 					"user_one_phone_number": conversation.user_one.phoneNumber,
# 					"user_two_name": conversation.user_two.full_name,
# 					"user_two_image": conversation.user_two.image,
# 					"user_two_id": conversation.user_two.id,
# 					"user_two_phone_number": conversation.user_two.phoneNumber,
# 					"last_message": last_message,
# 					"time": time,
# 					"message_date": message_date,
# 				}
# 				conversation_list.append(conversation_data)

# 			return Response({'status_code': status.HTTP_200_OK, 'message': 'success', 'data': conversation_list},
# 							status=status.HTTP_200_OK)

# 		except Exception as e:
# 			return Response({'status': status.HTTP_500_INTERNAL_SERVER_ERROR, 'message': str(e)},
# 							status=status.HTTP_500_INTERNAL_SERVER_ERROR)
		
class userConversationListing(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)}, status=status.HTTP_401_UNAUTHORIZED)

			userObj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not userObj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

			conversations = ConversationUsers.objects.filter(
				Q(user_one=userObj.id) | Q(user_two=userObj.id)
			).exclude(
				user_deleted=userObj
			).order_by('-id')

			conversation_list = []
			for conversation in conversations:
				messages = client.conversations \
					.v1 \
					.conversations(conversation.twilio_channel_sid) \
					.messages \
					.list(order='desc', limit=1)

				last_message = ''
				time = ''
				message_date = ''
				for record in messages:
					if record.body:
						last_message = record.body
						last_message = json.loads(last_message)
						last_message = last_message['message']
						time = timesince(record.date_created) + ' ago'
						message_date = record.date_created

					elif not record.media:
						last_message = 'Media file' if lang == 'en' else 'Fichier média'
						time = timesince(record.date_created) + ' ago'
						message_date = record.date_created

				conversation_data = {
					"id": conversation.id,
					"twilio_channel_sid": conversation.twilio_channel_sid,
					"user_one_name": conversation.user_one.full_name,
					"user_one_image": conversation.user_one.image,
					"user_one_id": conversation.user_one.id,
					"user_one_phone_number": conversation.user_one.phoneNumber,
					"user_two_name": conversation.user_two.full_name,
					"user_two_image": conversation.user_two.image,
					"user_two_id": conversation.user_two.id,
					"user_two_phone_number": conversation.user_two.phoneNumber,
					"last_message": last_message,
					"time": time,
					"message_date": message_date,
				}
				conversation_list.append(conversation_data)

			return Response({
				'status_code': status.HTTP_200_OK,
				'message': 'Success' if lang == 'en' else 'Succès',
				'data': conversation_list
			}, status=status.HTTP_200_OK)

		except Exception as e:
			return Response({
				'status': status.HTTP_500_INTERNAL_SERVER_ERROR,
				'message': str(e)
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class RatngReview(APIView):							
	def post(self, request):
		lang = request.headers.get('Accept-Language', 'fr')
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

			request_id = request.data.get('request_id')			
			rating = request.data.get('rating')
			review = request.data.get('review')

			if not request_id:
				return Response({'message': 'request_id is required' if lang == 'en' else 'Identifiant de la demande requis'}, status=status.HTTP_400_BAD_REQUEST)
			if not rating:
				return Response({'message': 'rating is required' if lang == 'en' else 'Évaluation requise'}, status=status.HTTP_400_BAD_REQUEST)
			if not review:
				return Response({'message': 'review is required' if lang == 'en' else 'Avis requis'}, status=status.HTTP_400_BAD_REQUEST)

			getRequest = TravellerRequests.objects.filter(id=request_id, req_status='completed').first()
			if not getRequest:
				return Response({'message': 'This request does not exist' if lang == 'en' else 'Cette demande n\'existe pas'}, status=status.HTTP_400_BAD_REQUEST)

			getRequest.rating = rating
			getRequest.review = review
			getRequest.save()

			traveller = getRequest.traveller
			if traveller:
				rated_completed_requests = TravellerRequests.objects.filter(
					traveller=traveller,
					req_status='completed',
					rating__isnull=False
				)

				total_rating = 0
				count = 0
				for r in rated_completed_requests:
					try:
						total_rating += float(r.rating)
						count += 1
					except ValueError:
						pass

				if count > 0:
					traveller.average_rating = round(total_rating / count, 2)
					traveller.save()

					try:
						if traveller.fcm_token:
							send_push_notification(
								traveller.fcm_token,
								"New rating received" if lang == 'en' else "Nouvelle évaluation reçue",
								f"{user_obj.full_name} rated your delivery: {rating}⭐" if lang == 'en' else f"{user_obj.full_name} a évalué votre livraison : {rating}⭐"
						 )

						UserNotifications.objects.create(
							user=traveller,
							message=f"{user_obj.full_name} rated your delivery: {rating}⭐ — \"{review}\"" if lang == 'en' else f"{user_obj.full_name} a évalué votre livraison : {rating}⭐ — \"{review}\""
						)
					except Exception as e:
						print(f"Rating notification failed: {e}")

			return Response({'status_code': status.HTTP_200_OK, 'message': 'Success' if lang == 'en' else 'Succès'})

		except Exception as e:
			return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



		





class UserDocumentUploadView(APIView):
	def post(self, request):
		lang = request.headers.get('Accept-Language', 'fr')
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user_obj = AppUser.objects.filter(end_date__isnull=True, id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

			uploaded_file = request.data.get('document')

			if not uploaded_file:
				return Response({'message': 'File not found' if lang == 'en' else 'Fichier introuvable'}, status=status.HTTP_400_BAD_REQUEST)

			UserDocument.objects.create(
				user=user_obj,
				document=uploaded_file
			)
			user_obj.document_status = 'uploaded'
			user_obj.save()

			UserNotifications.objects.create(
				user=user_obj,
				message='Your document has been successfully uploaded for admin.' if lang == 'en' else 'Votre document a été téléchargé avec succès pour l\'administrateur.'
			)

			AdminNotifications.objects.create(
				message=f'{user_obj.full_name} has uploaded their documents.' if lang == 'en' else f'{user_obj.full_name} a téléchargé ses documents.'
			)

			return Response({
				'message': 'Identity Proof uploaded successfully' if lang == 'en' else 'Justificatif d\'identité téléchargé avec succès',
				'path': uploaded_file
			}, status=status.HTTP_201_CREATED)

		except Exception as e:
			return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


		




from django.views.generic import TemplateView
from django.shortcuts import render

class getPrivacyPolicy(TemplateView):
	template_name = 'user_privacy_policy.html'
	def get(self,request):
		data_obj = ContentPages.objects.filter(page_type='privacy_policy',user_type = "User").first()
		return render(request,self.template_name,locals())	

class getTermsConditions(TemplateView):
	template_name = 'user_terms.html'
	def get(self,request):
		data_obj = ContentPages.objects.filter(page_type='Terms',user_type = "User").first()
		return render(request,self.template_name,locals())	
	
def generate_ticket_id(length=8):
	characters = string.ascii_letters + string.digits  # Generate alphanumeric characters
	ticket_id = ''.join(random.choice(characters) for _ in range(length))
	return ticket_id

# class HelpSupportUserView(APIView):
# 	def post(self,request):
# 		try:
# 			try:
# 				uid = authenticated(request)
# 			except Exception as e:
# 				return Response({'message':str(e)},status=status.HTTP_401_UNAUTHORIZED)
# 			user_obj = AppUser.objects.filter(id=uid).first()
# 			if not user_obj:
# 				return Response({'message': 'user not found'}, status=status.HTTP_404_NOT_FOUND)
# 			admin_obj  =  SuperAdmin.objects.all().first()
# 			if user_obj.status ==  False:
# 				return Response({"message":'Your account has been Inactive, Please contact to admin.',"email":admin_obj.email},status=status.HTTP_406_NOT_ACCEPTABLE)			
# 			title = request.data.get('title')
# 			if not title:
# 				return Response({'statusCode':status.HTTP_400_BAD_REQUEST,'message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
# 			description = request.data.get('description')
# 			if not description:
# 				return Response({'statusCode':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
# 			ticket_id  = generate_ticket_id()
			
# 			HelpSupportUser.objects.create(title=title,description=description,user_id=user_obj.id,ticket_id=ticket_id)
# 			AdminNotifications.objects.create(message='A new ticket has been raised by the user',type='tickets')
# 			return Response({'statusCode':status.HTTP_200_OK,'message':'Help & Support Send Successfully'})
# 		except Exception as e:
# 			return Response({'statusCode':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class HelpSupportUserView(APIView):
	def post(self, request):
		lang = request.headers.get('Accept-Language', 'fr')
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user_obj = AppUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur introuvable'}, status=status.HTTP_404_NOT_FOUND)

			admin_obj = SuperAdmin.objects.all().first()
			if user_obj.status == False:
				return Response({
					"message": "Your account has been Inactive. Please contact the admin." if lang == 'en' else "Votre compte est inactif. Veuillez contacter l'administrateur.",
					"email": admin_obj.email
				}, status=status.HTTP_406_NOT_ACCEPTABLE)

			title = request.data.get('title')
			if not title:
				return Response({
					'statusCode': status.HTTP_400_BAD_REQUEST,
					'message': 'Title is required' if lang == 'en' else 'Le titre est requis'
				}, status=status.HTTP_400_BAD_REQUEST)

			description = request.data.get('description')
			if not description:
				return Response({
					'statusCode': status.HTTP_400_BAD_REQUEST,
					'message': 'Description is required' if lang == 'en' else 'La description est requise'
				}, status=status.HTTP_400_BAD_REQUEST)

			ticket_id = generate_ticket_id()

			HelpSupportUser.objects.create(
				title=title,
				description=description,
				user_id=user_obj.id,
				ticket_id=ticket_id
			)

			AdminNotifications.objects.create(
				message='A new support ticket has been raised by user' if lang == 'en' else 'Un nouvel appel a été lancé par l\'utilisateur',
				type='tickets'
			)

			return Response({
				'statusCode': status.HTTP_200_OK,
				'message': 'Help & Support sent successfully' if lang == 'en' else 'Demande d\'aide et de support envoyée avec succès'
			})

		except Exception as e:
			return Response({
				'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR,
				'message': str(e)
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


		




class faqListing(APIView):
	def get(self, request):
		lang = request.headers.get('Accept-Language', 'fr')
		try:
			faq_obj = Faq.objects.filter(end_date__isnull=True).order_by('-id')
			all_Data = []
			for faq in faq_obj:
				all_data = {
					'id': faq.id,
					'title': faq.title,
					'content': faq.content
				}
				all_Data.append(all_data)
			
			return Response({
				'statusCode': status.HTTP_200_OK,
				'message': 'Success' if lang == 'en' else 'Succès',
				'all_data': all_Data
			})
		except Exception as e:
			print(e)
			return Response({
				'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR,
				'message': str(e)
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


		
import arrow


class getUserNotifications(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)}, status=status.HTTP_401_UNAUTHORIZED)
			
			user_obj = AppUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur non trouvé'}, status=status.HTTP_404_NOT_FOUND)
			
			admin_obj = SuperAdmin.objects.all().first()
			if user_obj.status == False:
				return Response({
					"message": 'Your account has been inactive. Please contact the admin.' if lang == 'en' else 'Votre compte est inactif, veuillez contacter l\'administrateur.',
					"email": admin_obj.email
				}, status=status.HTTP_406_NOT_ACCEPTABLE)
			
			notify_obj = UserNotifications.objects.filter(user_id=user_obj.id)
			all_Data = []
			for notify in notify_obj:
				all_data = {
					'id': notify.id,
					'message': notify.message,
					'is_read': notify.is_read,
					'type': notify.type,
					'start_date': timesince(notify.start_date) + ' ago',
					'start_date': arrow.get(notify.start_date).humanize(locale='fr' if 'fr' in request.headers.get('Accept-Language', '').lower() else 'en')

				}
				all_Data.append(all_data)

			return Response({
				'statusCode': status.HTTP_200_OK,
				'message': 'Fetched successfully' if lang == 'en' else 'Récupération réussie',
				'all_data': all_Data
			})
		except Exception as e:
			return Response({
				'statusCode': status.HTTP_500_INTERNAL_SERVER_ERROR,
				'message': str(e)
			}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class deleteUserNotifications(APIView):
	def post(self, request):
		lang = request.headers.get('Accept-Language', 'fr')
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
			
			user_obj = AppUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur non trouvé'}, status=status.HTTP_404_NOT_FOUND)
			
			admin_obj = SuperAdmin.objects.all().first()
			if user_obj.status == False:
				return Response({
					"message": 'Your account has been inactive, please contact the admin.' if lang == 'en' else "Votre compte est inactif, veuillez contacter l'administrateur.",
					"email": admin_obj.email
				}, status=status.HTTP_406_NOT_ACCEPTABLE)
			
			notification_id = request.data.get('notification_id')
			if not notification_id:
				return Response({'message': 'notification_id is required' if lang == 'en' else "L'identifiant de notification est requis"}, status=status.HTTP_404_NOT_FOUND)

			not_obj = UserNotifications.objects.filter(id=notification_id).first()
			if not not_obj:
				return Response({'message': 'Notification not found' if lang == 'en' else 'Notification introuvable'}, status=status.HTTP_404_NOT_FOUND)

			not_obj.delete()
			
			return Response({'status_code': status.HTTP_200_OK, 'status_message': 'Deleted successfully' if lang == 'en' else 'Supprimé avec succès'})
		except Exception as e:
			return Response({'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR, 'status_message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)





class SendPaymentNotification(APIView):
	def post(self, request):
		lang = request.headers.get('Accept-Language', 'fr')
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
			
			user_obj = AppUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'message': 'User not found' if lang == 'en' else 'Utilisateur non trouvé'}, status=status.HTTP_404_NOT_FOUND)

			user_id = request.data.get('sender_id')
			if not user_id:
				return Response({'message': 'sender_id is required' if lang == 'en' else "L'identifiant de l'expéditeur est requis"}, status=status.HTTP_404_NOT_FOUND)

			get_user = AppUser.objects.filter(id=user_id).first()
			if not get_user:
				return Response({'message': 'Sender user not found' if lang == 'en' else "Utilisateur expéditeur introuvable"}, status=status.HTTP_404_NOT_FOUND)

			create_notification = UserNotifications.objects.create(
				user=get_user,
				message=f'{user_obj.full_name} has sent a payment request for your booking.' if lang == 'en' else f'{user_obj.full_name} a envoyé une demande de paiement pour votre réservation.'
			)

			return Response({'status_code': status.HTTP_200_OK, 'message': 'Request sent successfully' if lang == 'en' else 'Demande envoyée avec succès'})
		
		except Exception as e:
			return Response({'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR, 'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


		
class MyRatings(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)}, status=status.HTTP_401_UNAUTHORIZED)

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

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

			get_request = TravellerRequests.objects.filter(id=request_id).first()
			if not get_request:
				return Response({'message': 'Request not found' if lang == 'en' else 'Demande introuvable'}, status=status.HTTP_404_NOT_FOUND)

			alldata = {
				'rating': get_request.rating,
				'review': get_request.review
			}

			return Response({
				'status_code': status.HTTP_200_OK,
				'message': 'Rating and review fetched successfully' if lang == 'en' else 'Évaluation et avis récupérés avec succès',
				'all_data': alldata
			})
		except Exception as e:
			return Response({'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR, 'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

