from urllib.parse import parse_qsl
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import *
import random
from datetime import datetime,timedelta
from django.conf import settings
from passlib.hash import django_pbkdf2_sha256 as handler
from admin_api.functions import *
from django.contrib.auth import authenticate
import math, random, pytz, string
from django.template.loader import render_to_string
from django.core import mail
from django.core.mail import EmailMultiAlternatives
from django.contrib.auth.models import User
from rest_framework_simplejwt.tokens import RefreshToken
from .authentication import authenticated
from .functions import *
from .serializers import *
import re
from admin_api.models import Categories
from admin_api.models import *
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
import os
from panel_api.models import *
import requests
import better_profanity
from datetime import date
from subscription_api.models import *
from django.db.models import Q
import json
import ast
from django.db.models import Avg
from rest_framework.authentication import get_authorization_header
import jwt
from agency_panel.models import *
from lawyer_panel.models import *
from django.db.models import Sum

from math import radians, sin, cos, sqrt, atan2
from django.utils.html import strip_tags
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
import json
import stripe
from django.utils import timezone
from django.utils.timezone import now
from collections import Counter





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 get_time_ago(start_date):
    now = timezone.now()
    diff = now - start_date
    seconds = int(diff.total_seconds())

    if seconds < 5:
        return "just now"
    elif seconds < 60:
        return f"{seconds} seconds ago"
    elif seconds < 3600:
        return f"{seconds // 60} minutes ago"
    elif seconds < 86400:
        return f"{seconds // 3600} hours ago"
    else:
        return f"{seconds // 86400} days ago"

def haversine(lat1, lon1, lat2, lon2):
    R = 6371.0  # Radius of the Earth in kilometers

    lat1_rad = radians(lat1)
    lon1_rad = radians(lon1)
    lat2_rad = radians(lat2)
    lon2_rad = radians(lon2)

    dlon = lon2_rad - lon1_rad
    dlat = lat2_rad - lat1_rad

    a = sin(dlat / 2)**2 + cos(lat1_rad) * cos(lat2_rad) * sin(dlon / 2)**2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))

    distance = R * c  # Distance in kilometers
    return distance

def contains_vulgarity(data):
    """
    Returns True if any value in data contains vulgarity, False otherwise.
    """
    for value in data.values():
        if isinstance(value, str) and better_profanity.profanity.contains_profanity(value):
            return True
    return False

class register(APIView):
    def post(self,request):
        try:
            data = request.data
            first_name = data.get('first_name')
            last_name = data.get('last_name')
            email = data.get('email')
            password = data.get('password')
            # dob = data.get('dob')
            company_name = data.get('companyName')
            loginUserType = data.get('loginUserType')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            address = data.get('address')
            house_number = data.get('house_number')
            street_name = data.get('street_name')
            region = data.get('region')
            city = data.get('city')
            zipcode = data.get('zipcode')
            country = data.get('country')
            address = data.get('address')
            state = data.get('state')

            regex = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$'
            if not first_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'first_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not last_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'last_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'password is required'},status=status.HTTP_400_BAD_REQUEST)
            if not address:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'address is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not state:
            #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'state is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not house_number:
            #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'house_number is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not region:
            #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'region is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not street_name:
            #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'street_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not city:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'city is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not zipcode:
            #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'zipcode is required'},status=status.HTTP_400_BAD_REQUEST)
            if not country:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'country is required'},status=status.HTTP_400_BAD_REQUEST)
            if not address:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'address is required'},status=status.HTTP_400_BAD_REQUEST)
            
            if not (re.search(regex,email)):
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Invalid Email'},status=status.HTTP_400_BAD_REQUEST)
            userObj = User.objects.filter(username=email).first()
            if userObj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,"message":"The email is already registered"},status=status.HTTP_400_BAD_REQUEST)
            else:
                userObj = User.objects.create_user(username = email, password = password)
                customerObj = Customer.objects.create(user=userObj,firstName=first_name.strip(),lastName=last_name.strip(),email=email,loginUserType=loginUserType,agency_company=company_name,latitude=latitude,longitude=longitude,address=address,house_number=house_number,street_name=street_name,city=city,zipcode=zipcode,country=country)
                if loginUserType == 'lawyer':
                    AdminNotifications.objects.create(message= first_name.strip()+''+last_name.strip()+' lawyer has been successfully registered with us.',is_read=True,notification_type='new_lawyer_registered')
                else:
                    AdminNotifications.objects.create(message= first_name.strip()+''+last_name.strip()+'  customer has been successfully registered with us.',is_read=True,notification_type='new_registered')


                OTP=GernateOTP()
                customerObj.otp=OTP
                customerObj.save()
                message = "\nThis is the email verification OTP to verify the email:\n" + OTP
                context = {}
                # context['message'] = message
                # context['email'] = email
                # email_data = render_to_string('forgot-link.html',context)
                to_emails = customerObj.email
                subject = "Email Verification:"
                message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                # message.attach_alternative(email_data, "text/html")
                message.send(fail_silently=False)
                refresh_token = RefreshToken.for_user(userObj)
                if loginUserType == 'lawyer':
                    sub_data = LawyerSubscriptions.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()
                else:
                    sub_data = CustomersFeatureAdsHistory.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()

                if sub_data:
                    plan_id = sub_data.plan_id
                else:
                    plan_id = ""
                userData = {
                    'customer_id':customerObj.id,
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'email':customerObj.email,
                    'dob':customerObj.dob,
                    'otp':customerObj.otp,
                    'email_verified':customerObj.emailVerified,
                    'customer_id':customerObj.id,
                    'has_subscription':customerObj.has_subscription,
                    'subscription_id':plan_id,
                    'profileImage':customerObj.profileImage,
                    'phoneNumber':customerObj.phoneNumber,
                    
     
     
                }
                allData={
                    'refresh': str(refresh_token),
                    'access': str(refresh_token.access_token),
                    'user': userData
                    }

                return Response({'status_code':status.HTTP_200_OK,"message":"You are registered successfully",'data':allData},status=status.HTTP_200_OK)
        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 SocialLogin(APIView):
    def post(self, request):
        try:
            data = request.data
            provider = data.get('provider')
            social_id = data.get('social_id')
            first_name = data.get('first_name')
            last_name = data.get('last_name')
            dob = data.get('dob')
            email = data.get('email')

            

            if not provider or not social_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message': 'Provider and social_id are required.'}, status=status.HTTP_400_BAD_REQUEST)

            if not first_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message': 'first_name is required'}, status=status.HTTP_400_BAD_REQUEST)
            if not last_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message': 'last_name is required'}, status=status.HTTP_400_BAD_REQUEST)
            if not dob:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message': 'dob is required'}, status=status.HTTP_400_BAD_REQUEST)

            # Check if social account already exists in the database
            try:
                customerObj = Customer.objects.get(socialId=social_id)
                customerObj.email=email
                customerObj.save()
            except Customer.DoesNotExist:
                # If social account not found, create a new one
                userObj = User.objects.create_user(username=email)
                customerObj = Customer.objects.create(user=userObj, firstName=first_name, lastName=last_name, socialId=social_id, dob=dob,email=email)
                # Additional logic for generating and sending OTP via email
                # OTP = GenerateOTP()
                # customerObj.otp = OTP
                # customerObj.save()
                # message = "\nOTP has been sent on you registered email successfully:\n" + OTP
                # context = {}
                # context['message'] = message
                # context['email'] = email
                # email_data = render_to_string('forgot-link.html', context)
                # to_emails = customerObj.email
                # subject = "Verify OTP:"
                # message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails], body=message)
                # message.attach_alternative(email_data, "text/html")
                # message.send(fail_silently=False)

            # Issue tokens (refresh token and access token) for the authenticated user
            refresh_token = RefreshToken.for_user(customerObj.user)


            userData = {
                'customer_id':customerObj.id,
                'first_name':customerObj.firstName,
                'last_name':customerObj.lastName,
                'email':customerObj.email,
                'dob':customerObj.dob,
                'otp':customerObj.otp,
                'email_verified':customerObj.emailVerified,
                'customer_id':customerObj.id,
                'has_subscription':customerObj.has_subscription,
                'profileImage':customerObj.profileImage,
                'phoneNumber':customerObj.phoneNumber,
            }

            allData = {
                'refresh': str(refresh_token),
                'access': str(refresh_token.access_token),
                'user': userData,
            }
            return Response({'status_code':status.HTTP_200_OK,"message":"Login successfully",'data':allData},status=status.HTTP_200_OK)

        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 emailVerifyOtp(APIView):
    def post(self, request):
        try:
            # try:
            # 	uid = authenticated(request)
            
            # except Exception as e:
            # 	return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            # customerObj=Customer.objects.filter(user=uid).first()
            data=request.data
            email = data.get('email')
            otp = data.get('otp')
            customerObj=Customer.objects.filter(email=email).first()
            userObj = User.objects.filter(username=email).first()
            if not otp:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'otp is required'},status=status.HTTP_400_BAD_REQUEST)
            if customerObj.otp != otp:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Invalid Otp'},status=status.HTTP_400_BAD_REQUEST)
            customerObj.emailVerified = True
            customerObj.save()
            refresh_token = RefreshToken.for_user(userObj)
            
            sub_data = CustomersFeatureAdsHistory.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()
            if sub_data:
                plan_id = sub_data.plan_id
            else:
                plan_id = ""
            
            # conversation_ids = [
            # 	'CH7ec13f4d5b8048ba8a1838a24200e1e8',
            # 	'CH1234567890abcdef1234567890abcdef',
            # 	'CHabcdef1234567890abcdef1234567890'
            # ]



            identity = customerObj.id
            python_obj= {"name":str(customerObj.firstName),
            "avatar":str(customerObj.profileImage)}
            j_data = json.dumps(0)

            # # Add participant to each conversation
            # for conversation_id in conversation_ids:
            # 	participant = client.conversations \
            # 		.v1 \
            # 		.conversations(conversation_id) \
            # 		.participants \
            # 		.create(identity=identity, attributes=j_data)

            # 	print(f"Participant added to conversation {conversation_id}")
            
            userData = {
                    'customer_id':customerObj.id,
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'username':customerObj.username,
                    'phone_number':customerObj.phoneNumber,
                    'gender':customerObj.gender,
                    'dob':customerObj.dob,
                    'phone_number_two':customerObj.phoneNumberTwo,
                    'email':customerObj.email,
                    'facebook_url':customerObj.facebook_url,
                    'instagram_url': customerObj.instagram_url,
                    'blog':customerObj.blog,
                    'address':customerObj.address,
                    'latitude':customerObj.latitude,
                    'longitude':customerObj.longitude,
                    'loginUserType':customerObj.loginUserType,
                    'house_number':customerObj.house_number,
                    'street_name':customerObj.street_name,
                    'region':customerObj.region,
                    'city':customerObj.city,
                    'zipcode':customerObj.zipcode,
                    'country':customerObj.country,
                    'plan_id':plan_id,
                    'profile_image':customerObj.profileImage,
                    'has_subscription':customerObj.has_subscription,
                    'subscription_id':plan_id,

                }

            allData={
                    'refresh': str(refresh_token),
                    'access': str(refresh_token.access_token),
                    'user': userData
                    }
            return Response({'status_code':status.HTTP_200_OK,"message":"OTP verified successfully",'data':allData},status=status.HTTP_200_OK)
        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 registerResendOtp(APIView):
    def post(self, request):
        try:
            data=request.data
            email = data.get('email')
            customerObj=Customer.objects.filter(email=email).first()
            OTP=GernateOTP()
            customerObj.otp=OTP
            customerObj.save()
            message = "\nOTP has been sent on you registered email successfully:\n" + OTP
            context = {}
            to_emails = email
            subject = "Verify OTP:"
            message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
            message.send(fail_silently=False)
            return Response({'status_code':status.HTTP_200_OK,'message':'Thank you for registering with us! To complete your sign-up process and verify your account, please use the One-Time Password (OTP) below:\n\nYour OTP is:',"otp":OTP},status=status.HTTP_200_OK)
        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 login(APIView):
    def post(self,request):
        try:
            data = request.data
            email = data.get('email')
            password = data.get('password')
            loginUserType = data.get('loginUserType')

            

            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'password is required'},status=status.HTTP_400_BAD_REQUEST)
                
            userObj = authenticate(username = email, password = password)
            if not userObj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Login credentials are invalid'},status=status.HTTP_400_BAD_REQUEST)
            customerObj = Customer.objects.filter(user=userObj,loginUserType=loginUserType).first()
            if not customerObj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Invalid Credentials'},status=status.HTTP_400_BAD_REQUEST)
            if customerObj.emailVerified == 0:
                OTP=GernateOTP()
                customerObj.otp=OTP
                customerObj.save()
                message = "\nOTP has been sent on you registered email successfully:\n" + OTP
                context = {}
                # context['message'] = message
                # context['email'] = email
                # email_data = render_to_string('forgot-link.html',context)
                to_emails = customerObj.email
                subject = "Verify OTP:"
                message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                # message.attach_alternative(email_data, "text/html")
                message.send(fail_silently=False)

            refresh_token = RefreshToken.for_user(userObj)
            

            if customerObj.loginUserType == "lawyer":
                sub_data = LawyerSubscriptions.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()
            else:
                sub_data = CustomersFeatureAdsHistory.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()

            if sub_data:
                plan_id = sub_data.plan_id
            else:
                plan_id = ""

            userData = {
                    'customer_id':customerObj.id,
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'username':customerObj.username,
                    'phone_number':customerObj.phoneNumber,
                    'gender':customerObj.gender,
                    'dob':customerObj.dob,
                    'phone_number_two':customerObj.phoneNumberTwo,
                    'email':customerObj.email,
                    'facebook_url':customerObj.facebook_url,
                    'instagram_url': customerObj.instagram_url,
                    'blog':customerObj.blog,
                    'address':customerObj.address,
                    'latitude':customerObj.latitude,
                    'longitude':customerObj.longitude,
                    'loginUserType':customerObj.loginUserType,
                    'house_number':customerObj.house_number,
                    'street_name':customerObj.street_name,
                    'region':customerObj.region,
                    'city':customerObj.city,
                    'zipcode':customerObj.zipcode,
                    'country':customerObj.country,
                    'plan_id':plan_id,
                    'profile_image':customerObj.profileImage,
                    'has_subscription':customerObj.has_subscription,
                    'subscription_id':plan_id,
                    'loginUserType':customerObj.loginUserType,
                    'email_verified':customerObj.emailVerified,
                    'role':customerObj.loginUserType,
                     'isProfileCompleted': customerObj.isProfileCompleted,

                }
            
            allData={
                    'refresh': str(refresh_token),
                    'access': str(refresh_token.access_token),
                    'user': userData
                    }
            return Response({'status_code':status.HTTP_200_OK,"message":"Login successfully",'data':allData},status=status.HTTP_200_OK)

        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 forgotPassword(APIView):
    def post(self,request):
        try:
            data = request.data
            email = data.get('email')
            base_url = data.get('base_url')

            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not base_url:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'base_url is required'},status=status.HTTP_400_BAD_REQUEST)
            customerObj = Customer.objects.filter(email=email).first()
            if not customerObj:return Response({'status_code':status.HTTP_400_BAD_REQUEST,"message":'Invalid Email'},status=status.HTTP_400_BAD_REQUEST)
            forgot_token = RefreshToken.for_user(customerObj)
            token = forgot_token.access_token
            # random_number = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(12)])
            forgot_link = '/auth/reset-password?token=' + str(token)
            # forgot_link = 'customer-api/reset-password/' + str(customerObj.email) + '/'+ random_number
            complete_link = base_url+forgot_link
            customerObj.forgotPasswordLink = token
            customerObj.save()
            message = "\nForgot your Password click following link:\n" + complete_link
            context = {}
            # context['message'] = message
            # context['email'] = email
            # email_data = render_to_string('forgot-link.html',context)
            to_emails = email
            subject = "Forgot Password Link:"
            message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
            # message.attach_alternative(email_data, "text/html")
            message.send(fail_silently=False)
            return Response({'status_code':status.HTTP_200_OK,"message":"Link sent successfully"},status=status.HTTP_200_OK)


        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 ForgetPasswordVerification(APIView):
    def post(self,request):
        try:
            data = request.data
            new_password = data.get('new_password')
            token = data.get('token')
            if not token:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'token Password is required'},status=status.HTTP_400_BAD_REQUEST)
            if not new_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'New Password is required'},status=status.HTTP_400_BAD_REQUEST)
            # link = str(self.request.build_absolute_uri())
            # print('link',link)
            # customer_email = link.split('/')[-2]
            customer_Obj = Customer.objects.filter(forgotPasswordLink = token).first()
            user=User.objects.filter(id=customer_Obj.user.id).first()
            if user.check_password(new_password):
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'New password cannot be the same as the old password'}, status=status.HTTP_400_BAD_REQUEST)

            user.set_password(new_password)
            user.save()
            return Response({'status_code':status.HTTP_200_OK,"message":"Verification done successfully"},status=status.HTTP_200_OK)
        except  Exception as e:
            print(str(e))
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,"message":'The link you are using is invalid, generate new link'},status=status.HTTP_400_BAD_REQUEST)



class appForgetPassword(APIView):
    def post(self,request):
        data = request.data
        email = data.get('email')
        if not email:
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)

        user  = Customer.objects.filter(email=email).count()
        if user == 0:
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,"message":'This email does not exist in our database, please enter the valid email address.'},status=status.HTTP_400_BAD_REQUEST)
        user_obj  = Customer.objects.filter(email=email).first()
        if user_obj:
            theotp=random.randrange(1000, 9999, 5)
            user_obj.forgotPasswordOTP=theotp
            user_obj.save()
            to_email = user_obj.email
            subject = "Forget Password OTP"
            html_message = render_to_string('forget_password_otp.html', {'otp': theotp})
            plain_message = html_message
            from_email = settings.EMAIL_HOST_USER
            mail.send_mail(subject, plain_message, from_email, [to_email], html_message=html_message)
            return Response({'status_code':status.HTTP_200_OK,"message":"OTP send successfully","otp":theotp},status=status.HTTP_200_OK)
        else:
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,"message":'Email not exist'},status=status.HTTP_400_BAD_REQUEST)


class verifyForgetPasswordOTP(APIView):
    def post(self,request):
        try:
            email = request.data.get('email')
            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)
            otp = request.data.get('otp')
            if not otp:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Otp is required'},status=status.HTTP_400_BAD_REQUEST)
            check_email = Customer.objects.filter(email=email).first()
            if not check_email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Email not exist'},status=status.HTTP_400_BAD_REQUEST)

            user_obj = Customer.objects.filter(email=email,forgotPasswordOTP = otp).last()
            if user_obj:
                return Response({'status_code':status.HTTP_200_OK,'message':'Successfully Verified'},status=status.HTTP_200_OK)
            else:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Invalid otp'},status=status.HTTP_400_BAD_REQUEST)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class changeForgetPassword(APIView):
    def post(self,request):
        try:
            email = request.data.get('email')
            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message': 'email is required'}, status=status.HTTP_404_NOT_FOUND)
            user_obj = Customer.objects.filter(email=email).first()
            if not user_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message': 'user not found'}, status=status.HTTP_404_NOT_FOUND)
            new_password = request.data.get('new_password')
            if not new_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'new password is required'},status=status.HTTP_400_BAD_REQUEST)
            confirm_password = request.data.get('confirm_password')
            if not confirm_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'confirm password is required'},status=status.HTTP_400_BAD_REQUEST)
            if new_password != confirm_password:
                return Response({'status_code':status.HTTP_403_FORBIDDEN,'message':'Password and confirm password are not same.'},status=status.HTTP_403_FORBIDDEN)
            user = user_obj.user
            user.set_password(confirm_password)  # Properly hash and set the password
            user.save() 
            return Response({'status_code':status.HTTP_200_OK,'message':'Password changed successfully'},status=status.HTTP_200_OK)
        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 completeProfile(APIView):
    def get(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response(
                    {'status_code': status.HTTP_401_UNAUTHORIZED, 'message': str(e)},
                    status=status.HTTP_401_UNAUTHORIZED
                )

            allData = {}

            customerObj = Customer.objects.filter(user=uid).first()
            admin_obj = SuperAdmin.objects.filter(user_id=uid).first()

            lawyer_sub_data = None
            customer_sub_data = None
            plan_id = None
            property_count = None

            if customerObj:
                if customerObj.loginUserType == "lawyer":
                    lawyer_sub_data = LawyerSubscriptions.objects.filter(
                        customer=customerObj, is_active=True
                    ).order_by('-id').first()
                    if lawyer_sub_data:
                        plan_id = lawyer_sub_data.plan_id
                else:
                    customer_sub_data = CustomersFeatureAdsHistory.objects.filter(
                        customer=customerObj, is_active=True
                    ).order_by('-id').first()
                    if customer_sub_data:
                        plan_id = customer_sub_data.plan_id
                        property_count = (
                            customer_sub_data.plan.property_count if customer_sub_data.plan else None
                        )

            if admin_obj:
                allData.update({
                    'email': admin_obj.email,
                    'phone_number': admin_obj.phoneNumber,
                    'avatar': admin_obj.avatar,
                    'first_name': admin_obj.firstName,
                    'last_name': admin_obj.lastName,
                    'role': admin_obj.loginUserType,
                })

            if customerObj:
                counts = [
                    SaleProperty.objects.filter(customerId=customerObj.id).count(),
                    RentProperty.objects.filter(customerId=customerObj.id).count(),
                    BussinessForSale.objects.filter(customerId=customerObj.id).count(),
                    HouseWantedForRent.objects.filter(customerId=customerObj.id).count(),
                    InvestmentMyProject.objects.filter(customerId=customerObj.id).count(),
                    InvestmentMyCompany.objects.filter(customerId=customerObj.id).count(),
                    PropertyProject.objects.filter(customerId=customerObj.id).count(),
                ]
                total_property_upload = sum(counts)

                allData.update({
                    'customer_id': customerObj.id,
                    'first_name': customerObj.firstName,
                    'last_name': customerObj.lastName,
                    'email': customerObj.email,
                    'dob': customerObj.dob,
                    'is_active': customerObj.is_active,
                    'profile_image': customerObj.profileImage,
                    'role': customerObj.loginUserType,
                    'isProfileCompleted': customerObj.isProfileCompleted,
                    'phoneVerified': customerObj.phoneVerified,
                    'has_subscription': customerObj.has_subscription,
                    'subscription_id': plan_id,
                    'property_count': property_count or "",
                    'phone_number': customerObj.phoneNumber,
                    'nationality': customerObj.nationality,
                    'total_property_upload': total_property_upload,
                })

            return Response(
                {'status_code': status.HTTP_200_OK, 'message': 'Profile fetched successfully', 'data': allData},
                status=status.HTTP_200_OK
            )

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



    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            user_type = data.get('user_type')
            gender = data.get('gender')
            address = data.get('address')
            nationality = data.get('country')
            your_self = data.get('your_self')
            past_experience = data.get('past_experience')
            first_name = data.get('first_name')
            last_name = data.get('last_name')
            email = data.get('email')
            dob = data.get('dob')
            user_level = data.get('user_level')
            profile_image = data.get('profile_image')
            customerObj.userType = user_type
            customerObj.gender = gender
            customerObj.address = address
            customerObj.nationality = nationality
            customerObj.bio = your_self
            customerObj.pastExperience = past_experience
            customerObj.firstName = first_name
            customerObj.lastName = 	last_name
            customerObj.email = email
            customerObj.dob = dob
            customerObj.profileImage = profile_image
            customerObj.isProfileCompleted = True
            if user_level == "company":
                company_name = data.get('company_name')
                company_url = data.get('company_url')
                company_slogan = data.get('company_slogan')
                company_category = data.get('company_category')
                company_email = data.get('company_email')
                company_telephone = data.get('company_telephone')
                company_detail = data.get('company_detail')
                facebook_link = data.get('facebook_link')
                twitter_link = data.get('twitter_link')
                youtube_link = data.get('youtube_link')
                linkedin_link = data.get('linkedin_link')
                Company.objects.create(customerId=customerObj,companyName=company_name,companyUrl=company_url,companySlogan=company_slogan,companyCategory=company_category,
                    companyEmail=company_email,companyTelephone=company_telephone,companyDetail=company_detail,facebookLink=facebook_link,twitterLink=twitter_link,youtubeLink=youtube_link,linkedinLink=linkedin_link)
            # allData={'firstname':customerObj.firstName,
            # 		'lastname':customerObj.lastName,
            # 		'email':customerObj.email,
            # 		'dob':customerObj.dob,
            # 		'is_active':customerObj.is_active,}
            customerObj.save()
            AdminNotifications.objects.create(message= customerObj.firstName+''+customerObj.lastName+' has completed their profile',is_read=True,notification_type='complete_profile')
            userData = {
                    'customer_id':customerObj.id,
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'email':customerObj.email,
                    'dob':customerObj.dob,
                    'profile_image':customerObj.profileImage,
                    'isProfileCompleted':customerObj.isProfileCompleted,
                    'phoneVerified':customerObj.phoneVerified,
                    'email_verified':customerObj.emailVerified,
                    'customer_id':customerObj.id,
                    'phoneNumber':customerObj.phoneNumber,
                    'has_subscription':customerObj.has_subscription,
                    'loginUserType':customerObj.loginUserType,
                    'role':customerObj.loginUserType,
                }

            allData={
                    'access': request.headers.get('Authorization'),
                    'user': userData
                    }
            return Response({'status_code':status.HTTP_200_OK,'message':'Profile Added successfully','all_data':allData},status=status.HTTP_200_OK)
        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 uploadImage(APIView):
    def post(self,request):
        try:
            data = request.data
            profile_image = data.get('file')
            if profile_image:
                from django.conf import settings
                fileUrl=uploadTheProfile(profile_image)
                fileUrl=str(settings.BASE_URL)+fileUrl
                # customerObj.profileImage=str(fileUrl)
            return Response({'status_code':status.HTTP_200_OK,'message':'uploaded successfully','url':str(fileUrl)},status=status.HTTP_200_OK)
        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 uploadBase64Image(APIView):
    def post(self, request):
        try:
            data = request.data
            profile_image = data.get('image')
            if not profile_image:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST,'message': 'Something went wrong'}, status=status.HTTP_400_BAD_REQUEST)
            if isinstance(profile_image, str) and profile_image.startswith("data:image"):
                # This is a base64 encoded image
                base64_data = profile_image.split(',')[1]

                # Add padding if needed
                padding = len(base64_data) % 4
                if padding != 0:
                    base64_data += '=' * (4 - padding)
                
                fileUrl = save_base64_image(base64_data, "thumbnail")
            else:
                # This is a regular image
                fileUrl = uploadTheProfile(profile_image)
            
            fileUrl = str(settings.BASE_URL) + fileUrl
            return Response({
                'status_code': status.HTTP_200_OK,
                'message': 'Uploaded successfully',
                'url': str(fileUrl)
            }, status=status.HTTP_200_OK)
        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 uploadImagePropertyProject(APIView):
    def post(self,request):
        try:
            data = request.data
            image_one = data.get('image_one')
            image_two = data.get('image_two')
            image_three = data.get('image_three')
            image_four = data.get('image_four')
            image_five = data.get('image_five')

            if image_one:
                from django.conf import settings
                fileUrl=uploadTheProfile(image_one)
                fileUrl=str(settings.BASE_URL)+fileUrl
                # customerObj.profileImage=str(fileUrl)
            if image_two:
                from django.conf import settings
                fileUrl=uploadTheProfile(image_two)
                fileUrl=str(settings.BASE_URL)+fileUrl
                # customerObj.profileImage=str(fileUrl)
            if image_three:
                from django.conf import settings
                fileUrl=uploadTheProfile(image_three)
                fileUrl=str(settings.BASE_URL)+fileUrl
                # customerObj.profileImage=str(fileUrl)			
            if image_four:
                from django.conf import settings
                fileUrl=uploadTheProfile(image_four)
                fileUrl=str(settings.BASE_URL)+fileUrl
                # customerObj.profileImage=str(fileUrl)			
            if image_five:
                from django.conf import settings
                fileUrl=uploadTheProfile(image_five)
                fileUrl=str(settings.BASE_URL)+fileUrl
                # customerObj.profileImage=str(fileUrl)
            return Response({'status_code':status.HTTP_200_OK,'message':'uploaded successfully','url':str(fileUrl)},status=status.HTTP_200_OK)			
        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 mobileVerified(APIView):
    def post(self, request):
        try:
            # Authenticate user
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code': status.HTTP_401_UNAUTHORIZED, 'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

            data = request.data
            customerObj = Customer.objects.filter(user=uid).first()

            # Check phone number
            phone_number = data.get('phone_number')
            if not phone_number:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'phone_number is required'}, status=status.HTTP_400_BAD_REQUEST)

            # Generate OTP
            OTP = GernateOTP()
            customerObj.otp = OTP
            customerObj.phoneNumber = phone_number
            customerObj.save()

            # Send OTP via Twilio
            try:
                client = Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
                message = client.messages.create(
                    body=f"Your OTP is: {OTP}",
                    from_=settings.TWILIO_PHONE_NUMBER,
                    to=phone_number
                )
            except Exception as twilio_error:
                return Response({'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR, 'message': f'Twilio error: {str(twilio_error)}'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

            return Response({'status_code': status.HTTP_200_OK, 'message': 'OTP has been sent on your mobile number successfully'}, status=status.HTTP_200_OK)

        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 resendOtp(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data=request.data
            customerObj=Customer.objects.filter(user=uid).first()
            OTP=GernateOTP()
            customerObj.otp=OTP
            customerObj.save()
            message = "\nOTP has been sent on you registered email successfully:\n" + OTP
            context = {}
            # context['message'] = message
            # context['email'] = email
            # email_data = render_to_string('forgot-link.html',context)
            to_emails = customerObj.email
            subject = "Verify OTP:"
            message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
            # message.attach_alternative(email_data, "text/html")
            message.send(fail_silently=False)
            return Response({'status_code':status.HTTP_200_OK,'message':'OTP has been sent on you registered email successfully','otp':OTP},status=status.HTTP_200_OK)			
        
        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 mobileVerifyOtp(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data=request.data
            otp = data.get('otp')
            if not otp:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'otp is required'},status=status.HTTP_400_BAD_REQUEST)
            if customerObj.otp != otp:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Invalid Otp'},status=status.HTTP_400_BAD_REQUEST)
            customerObj.phoneVerified = True
            customerObj.save()
            return Response({'status_code':status.HTTP_200_OK,'message':'OTP has been verified'},status=status.HTTP_200_OK)			
            
        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 ContactUs(APIView):
#     def post(self,request):
#         try:
#             data = request.data
#             full_name = data.get('full_name')
#             email = data.get('email')
#             phone = data.get('phone')
#             interset_in = data.get('interset_in')
#             message = data.get('message')
#             if not full_name:
#                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'full_name is required'},status=status.HTTP_400_BAD_REQUEST)
#             if not email:
#                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
#             if not phone:
#                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'phone is required'},status=status.HTTP_400_BAD_REQUEST)
#             # if not interset_in:
#             #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'interset_in is required'},status=status.HTTP_400_BAD_REQUEST)
#             if not message:
#                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'message is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
#             # context = {}
#             # context['full_name'] = full_name
#             # context['email'] = email
#             # context['phone'] = phone
#             # context['interset_in'] = interset_in
#             # context['message'] = message
#             to_emails = email
#             subject = "Contact Us:"
#             message_send = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=f"hello {full_name}, your message is {message}")
#             message_send.send(fail_silently=False)
#             AdminNotifications.objects.create(message= full_name+' try to contact you.',is_read=True,notification_type='contact_us')
#             return Response({'status_code':status.HTTP_200_OK,'message':'Contact us form submit successfully'},status=status.HTTP_200_OK)	
#         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 ContactUs(APIView):
    def post(self, request):
        try:
            data = request.data
            full_name = data.get('full_name')
            email = data.get('email')
            phone = data.get('phone')
            interset_in = data.get('interset_in')
            query = data.get('message') 

            if not full_name:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'full_name is required'}, status=status.HTTP_400_BAD_REQUEST)
            if not email:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'email is required'}, status=status.HTTP_400_BAD_REQUEST)
            if not phone:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'phone is required'}, status=status.HTTP_400_BAD_REQUEST)
            if not query:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'query is required'}, status=status.HTTP_400_BAD_REQUEST)

            HelpAndSupportQuery.objects.create(
                full_name=full_name,
                email=email,
                phone=phone,
                interset_in=interset_in,
                query=query,
                status="pending"
            )


            subject = "Contact Us:"
            message_send = EmailMultiAlternatives(
                subject=subject,
                from_email=settings.EMAIL_HOST_USER,
                to=[email],
                body=(
                    f"Hello {full_name},\n\n"
                    f"Your query: {query}\n\n"
                    "We will get back to you shortly."
                )
            )
            message_send.send(fail_silently=False)

            AdminNotifications.objects.create(
                message=f"New Query Raised by {full_name}. Please review.",
                notification_type="Query Raised",
                is_read=False,
                # is_read=True,
                start_date=now(),
                end_date=None
            )

            return Response({'status_code': status.HTTP_200_OK, 'message': 'Contact us form & query submitted successfully'}, status=status.HTTP_200_OK)

        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 ChangePassword(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            old_password = data.get('old_password')
            new_password = data.get('new_password')
            if not old_password:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'old_password is required'},status=status.HTTP_400_BAD_REQUEST)
            if not new_password:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'new_password is required'},status=status.HTTP_400_BAD_REQUEST)
            user=User.objects.filter(id=uid).first()
            if old_password==new_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':"Your old password is same as new password"},status=status.HTTP_400_BAD_REQUEST)
            elif user.check_password(old_password) == False:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':"Doesn't match with old password"},status=status.HTTP_400_BAD_REQUEST)
            user.set_password(new_password)
            user.save()
            return Response({'status_code':status.HTTP_200_OK,'message':'Password changed successfully'},status=status.HTTP_200_OK)	

        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 createCompany(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            allData = []
            customerObj=Customer.objects.get(user=uid)
            companyObj = Company.objects.filter(customerId=customerObj).first()
            if companyObj:
                allData={'companyId':companyObj.id,
                        'companyName':companyObj.companyName,
                        'companyUrl':companyObj.companyUrl,
                        'companySlogan':companyObj.companySlogan,
                        'companyCategory':companyObj.companyCategory,
                        'companyEmail':companyObj.companyEmail,
                        'companyTelephone':companyObj.companyTelephone,
                        'companyDetail':companyObj.companyDetail,
                        'facebookLink':companyObj.facebookLink,
                        'youtubeLink':companyObj.youtubeLink,
                        'linkedinLink':companyObj.linkedinLink,
                        'twitterLink':companyObj.twitterLink,
                        'companyVision':companyObj.companyVision,
                        'company_address':companyObj.company_address,
                        'latitude':companyObj.latitude,
                        'longitude':companyObj.longitude,

                        }
            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched successfully','data':allData},status=status.HTTP_200_OK)	
    
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            companyObj = Company.objects.filter(customerId=customerObj).first()
            company_name = data.get('company_name')
            company_url = data.get('company_url')
            company_slogan = data.get('company_slogan')
            company_category = data.get('company_category')
            company_email = data.get('company_email')
            company_telephone = data.get('company_telephone')
            company_detail = data.get('company_detail')
            companyVision = data.get('companyVision')
            facebookLink = data.get('facebookLink')
            youtubeLink = data.get('youtubeLink')
            linkedinLink = data.get('linkedinLink')
            twitterLink = data.get('twitterLink')
            company_address = data.get('company_address')

            if not company_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_url:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_url is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_slogan:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_slogan is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_email:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_telephone:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_telephone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_detail:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_detail is required'},status=status.HTTP_400_BAD_REQUEST)
            if not facebookLink:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'facebookLink is required'},status=status.HTTP_400_BAD_REQUEST)
            if not youtubeLink:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'youtubeLink is required'},status=status.HTTP_400_BAD_REQUEST)
            if not linkedinLink:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'linkedinLink is required'},status=status.HTTP_400_BAD_REQUEST)
            if not twitterLink:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'twitterLink is required'},status=status.HTTP_400_BAD_REQUEST)
            if not companyVision:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'companyVision is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_address:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_address is required'},status=status.HTTP_400_BAD_REQUEST)



            if companyObj:
                companyObj.companyName = company_name
                companyObj.companyUrl=company_url
                companyObj.companySlogan=company_slogan
                companyObj.companyCategory=company_category
                companyObj.companyEmail=company_email
                companyObj.companyTelephone=company_telephone
                companyObj.companyDetail=company_detail
                companyObj.facebookLink=facebookLink
                companyObj.youtubeLink=youtubeLink
                companyObj.linkedinLink=linkedinLink
                companyObj.twitterLink=twitterLink
                companyObj.companyVision=companyVision
                companyObj.company_address=company_address
                companyObj.save()

            else:
                Company.objects.create(customerId=customerObj,companyName=company_name,companyUrl=company_url,companySlogan=company_slogan,companyCategory=company_category,
                    companyEmail=company_email,companyTelephone=company_telephone,companyDetail=company_detail,facebookLink=facebookLink,youtubeLink=youtubeLink,linkedinLink=linkedinLink,twitterLink=twitterLink,companyVision=companyVision,company_address=company_address)
            AdminNotifications.objects.create(message= 'A new '+company_name+' company is successfully registered with us.',is_read=True,notification_type='company_registered')
            return Response({'status_code':status.HTTP_200_OK,'message':'Company Added successfully'},status=status.HTTP_200_OK)	

        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 updateProfile(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            if customerObj.loginUserType == "lawyer":
                sub_data = LawyerSubscriptions.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()
            else:
                sub_data = CustomersFeatureAdsHistory.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()

            if sub_data:
                plan_id = sub_data.plan_id
            else:
                plan_id = ""
            allData={
                    'customer_id':customerObj.id,
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'phone_number':customerObj.phoneNumber,
                    'gender':customerObj.gender,
                    'dob':customerObj.dob,
                    'phone_number_two':customerObj.phoneNumberTwo,
                    'email':customerObj.email,
                    'facebook_url':customerObj.facebook_url,
                    'instagram_url': customerObj.instagram_url,
                    'blog':customerObj.blog,
                    'address':customerObj.address,
                    'latitude':customerObj.latitude,                    
                    'blog':customerObj.blog,
                    'longitude':customerObj.longitude,
                    'loginUserType':customerObj.loginUserType,
                    'house_number':customerObj.house_number,
                    'street_name':customerObj.street_name,
                    'region':customerObj.region,
                    'city':customerObj.city,
                    'zipcode':customerObj.zipcode,
                    'country':customerObj.country,
                    'created_at':customerObj.created_at,
                    'plan_id':plan_id,
                    'profile_image':customerObj.profileImage,
                    'has_subscription':customerObj.has_subscription,
                    'subscription_id':plan_id,
                    'loginUserType':customerObj.loginUserType,
                    'email_verified':customerObj.emailVerified,
                    'role':customerObj.loginUserType,
                    'address':customerObj.address,
                    'isProfileCompleted':True
     
     }
            return Response({'status_code':status.HTTP_200_OK,'message':'Profile fetched successfully','data':allData},status=status.HTTP_200_OK)	
            
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
            
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            first_name = data.get('first_name')
            last_name = data.get('last_name')
            email  = data.get('email')
            profile_image = data.get('profile_image')
            phone_number = data.get('phone_number')
            phoneNumberTwo = data.get('phoneNumberTwo')
            dob = data.get('dob')
            gender = data.get('gender')
            blog = data.get('blog')
            facebook_url = data.get('facebook_url')
            instagram_url = data.get('instagram_url')
            address = data.get('address')
            house_number = data.get('house_number')
            street_name = data.get('street_name')
            region = data.get('region')
            city = data.get('city')
            zipcode = data.get('zipcode')
            country = data.get('country')
            latitude = data.get('latitude')
            longitude = data.get('longitude')

            

            check_username = Customer.objects.filter(email=email).exclude(user=uid).count()
            if check_username > 0:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'This email is already registered.'},status=status.HTTP_400_BAD_REQUEST)

            customerObj.firstName = first_name
            customerObj.lastName = last_name
            customerObj.email = email
            customerObj.phoneNumber = phone_number
            customerObj.gender = gender
            customerObj.address = address
            customerObj.latitude = latitude
            customerObj.longitude = longitude
            customerObj.facebook_url = facebook_url
            customerObj.phoneNumberTwo = phoneNumberTwo
            customerObj.instagram_url = instagram_url
            customerObj.profileImage = profile_image
            customerObj.house_number = house_number
            customerObj.street_name = street_name
            customerObj.region = region
            customerObj.city = city
            customerObj.dob = dob
            customerObj.zipcode = zipcode
            customerObj.country = country
            customerObj.blog = blog
            customerObj.isProfileCompleted = True
            customerObj.save()
            # AdminNotifications.objects.create(message= customerObj.firstName+''+customerObj.lastName+' has updated their profile',is_read=True,notification_type='complete_profile')
            customerObj=Customer.objects.filter(user=uid).first()
            if customerObj.loginUserType == "lawyer":
                sub_data = LawyerSubscriptions.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()
            else:
                sub_data = CustomersFeatureAdsHistory.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()

            if sub_data:
                plan_id = sub_data.plan_id
            else:
                plan_id = ""
            userData = {
                    'customer_id':customerObj.id,
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'phone_number':customerObj.phoneNumber,
                    'gender':customerObj.gender,
                    'dob':customerObj.dob,
                    'phone_number_two':customerObj.phoneNumberTwo,
                    'email':customerObj.email,
                    'facebook_url':customerObj.facebook_url,
                    'instagram_url': customerObj.instagram_url,
                    'blog':customerObj.blog,
                    'address':customerObj.address,
                    'latitude':customerObj.latitude,
                    'longitude':customerObj.longitude,
                    'loginUserType':customerObj.loginUserType,
                    'house_number':customerObj.house_number,
                    'street_name':customerObj.street_name,
                    'region':customerObj.region,
                    'city':customerObj.city,
                    'zipcode':customerObj.zipcode,
                    'country':customerObj.country,
                    'plan_id':plan_id,
                    'profile_image':customerObj.profileImage,
                    'has_subscription':customerObj.has_subscription,
                    'subscription_id':plan_id,
                    'loginUserType':customerObj.loginUserType,
                    'email_verified':customerObj.emailVerified,
                    'role':customerObj.loginUserType,
                }

            allData={
                    'access': request.headers.get('Authorization'),
                    'user': userData
                    }

            return Response({'status_code':status.HTTP_200_OK,'message':'Profile updated successfully','data':allData},status=status.HTTP_200_OK)	
            
        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 addPropertyRent(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan_id
                if subscription_tyre is None:
                    subscription_tyre =  1
            else:
                subscription_tyre =  1

                                    
            if subscription_tyre == 1:
                now = timezone.localtime(timezone.now())
                three_months_ago = now - timedelta(days=90)
                property_count = SaleProperty.objects.filter(
                    customerId=customerObj,
                    created_at__gte=three_months_ago
                ).count()

                if property_count >= 1:
                    return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'You can only add one property every 3 months on the Basic plan.'}, status=status.HTTP_400_BAD_REQUEST)

            # if subscription_tyre != 3:
            #     if customerObj.can_add_property_count==0:
            #         return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)
    
            title = data.get('title')
            category = data.get('category')
            sub_category = data.get('sub_category')
            image = data.get('image_data')
            video = data.get('video')
            videos_thumbnail = data.get('videos_thumbnail')
   
            floor = data.get('floor')
            rooms = data.get('rooms')
            bedrooms = data.get('bedrooms')
            size = data.get('size')
            facilites = data.get('facilities')
            deposit = data.get('deposit')
            benefits = data.get('benefits')
   
            rental_period = data.get('rental_period')
            avaiable_from_date = data.get('available_from_date')
            monthly_rent = data.get('monthly_rent')
            monthly_rent_includes = data.get('monthly_rent_includes')
            security = data.get('security')
            security_amount = data.get('security_amount')
            heading = data.get('heading')
            description = data.get('description')
            display_information = data.get('display_information')
            name_of_ad = data.get('name_of_ad')
            visibilty =  data.get('visibilty')
   
            country =  data.get('country')
            state =  data.get('state')
            city =  data.get('city')
            postal_code =  data.get('postal_code')
            landmark =  data.get('landmark')
            house_number =  data.get('house_number')
      
            location =  data.get('location')
            latitude =  data.get('latitude')
            longitude =  data.get('longitude')
            is_draft=  data.get('is_draft')
            property_overview = data.get('property_overview')
            type_property = data.get('type_property')
            description_home = data.get('description_home')
            spend_time = data.get('spend_time')
            useless_skill = data.get('useless_skill')
            fun_act = data.get('fun_act')
            biography = data.get('biography')
            primary_room = data.get('primary_room')
            housing_type = data.get('housing_type')
            key_info_bedroom = data.get('key_info_bedroom')
            story = data.get('story')

            if not title:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not sub_category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'sub_category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bedrooms:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'bedrooms is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'image is required'},status=status.HTTP_400_BAD_REQUEST)
            if not latitude:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not longitude:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not video:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rooms:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rooms is required'},status=status.HTTP_400_BAD_REQUEST)
            if not size:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'size is required'},status=status.HTTP_400_BAD_REQUEST)
            if not monthly_rent:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'monthly_rent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rental_period:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rental_period is required'},status=status.HTTP_400_BAD_REQUEST)
            if not facilites:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'facilites is required'},status=status.HTTP_400_BAD_REQUEST)
            if not avaiable_from_date:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'avaiable_from_date is required'},status=status.HTTP_400_BAD_REQUEST)
            if not monthly_rent_includes:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'monthly_rent_includes is required'},status=status.HTTP_400_BAD_REQUEST)
            if not security:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'security is required'},status=status.HTTP_400_BAD_REQUEST)

            if not location:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not security_amount:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'security_amount is required'},status=status.HTTP_400_BAD_REQUEST)
            if not heading:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'heading is required'},status=status.HTTP_400_BAD_REQUEST)
            if not display_information:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'display_information is required'},status=status.HTTP_400_BAD_REQUEST)
            if not name_of_ad:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'name_of_ad is required'},status=status.HTTP_400_BAD_REQUEST)

            if not property_overview:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_overview is required'},status=status.HTTP_400_BAD_REQUEST)
            if not type_property:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'type_property is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description_home:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'description_home is required'},status=status.HTTP_400_BAD_REQUEST)
            if not spend_time:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'spend_time is required'},status=status.HTTP_400_BAD_REQUEST)
            if not useless_skill:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'useless_skill is required'},status=status.HTTP_400_BAD_REQUEST)
            if not fun_act:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'fun_act is required'},status=status.HTTP_400_BAD_REQUEST)
            if not biography:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'biography is required'},status=status.HTTP_400_BAD_REQUEST)
            if not primary_room:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'primary_room is required'},status=status.HTTP_400_BAD_REQUEST)
            if not housing_type:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'housing_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not key_info_bedroom:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'key_info_bedroom is required'},status=status.HTTP_400_BAD_REQUEST)
            if not story:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'story is required'},status=status.HTTP_400_BAD_REQUEST)
            if not deposit:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'deposit is required'},status=status.HTTP_400_BAD_REQUEST)



            rentprop = RentProperty.objects.create(customerId=customerObj)
            rentprop.title = title
            rentprop.category = category
            rentprop.subCategory = sub_category
            rentprop.image_data = image
            rentprop.video = video
            rentprop.videos_thumbnail = videos_thumbnail
            rentprop.floor = floor
            rentprop.rooms = rooms
            rentprop.bedrooms = bedrooms
            rentprop.size = size
            rentprop.facilites = facilites
            rentprop.deposit = deposit
            rentprop.benefits = benefits
   
   
            rentprop.country = country
            rentprop.state = state
            rentprop.city = city
            rentprop.postal_code = postal_code
            rentprop.landmark = landmark
            rentprop.house_number = house_number
   
            rentprop.rental_period = rental_period
            rentprop.avaiable_from_date = avaiable_from_date
            rentprop.monthly_rent = monthly_rent
            rentprop.monthly_rent_includes = monthly_rent_includes
            rentprop.security = security
            rentprop.security_amount = security_amount
            rentprop.heading = heading
            rentprop.description = description
            rentprop.display_information = display_information
            rentprop.name_of_ad = name_of_ad
            rentprop.visibilty = visibilty
            rentprop.location = location
            rentprop.latitude = latitude
            rentprop.longitude = longitude
            rentprop.subscription_type = subscription_tyre
            rentprop.is_draft = is_draft
   
            rentprop.property_overview = property_overview
            rentprop.type_property = type_property
            rentprop.description_home = description_home
            rentprop.spend_time = spend_time
            rentprop.useless_skill = useless_skill
            rentprop.fun_act = fun_act
            rentprop.biography = biography
            rentprop.primary_room = primary_room
            rentprop.housing_type = housing_type
            rentprop.key_info_bedroom = key_info_bedroom
            rentprop.story = story
   
   
            rentprop.save()
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':rentprop.id,
            }
            AdminNotifications.objects.create(message= 'A new property for rent has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=True,notification_type='rent_property')
            return Response({'status_code':status.HTTP_200_OK,'message':'Added successfully','data':allData},status=status.HTTP_200_OK)	
        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 editPropertyRent(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            rent_id = request.data.get('rent_id')
            if not rent_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Rent id is required'},status=status.HTTP_400_BAD_REQUEST)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan_id
            else:
                subscription_tyre =  0

            title = data.get('title')
            category = data.get('category')
            sub_category = data.get('sub_category')
            image = data.get('image_data')
            video = data.get('video')
            videos_thumbnail = data.get('videos_thumbnail')
   
            floor = data.get('floor')
            rooms = data.get('rooms')
            bedrooms = data.get('bedrooms')
            size = data.get('size')
            facilites = data.get('facilities')
            deposit = data.get('deposit')
            benefits = data.get('benefits')
   
            country =  data.get('country')
            state =  data.get('state')
            city =  data.get('city')
            postal_code =  data.get('postal_code')
            landmark =  data.get('landmark')
            house_number =  data.get('house_number')
   
            rental_period = data.get('rental_period')
            avaiable_from_date = data.get('available_from_date')
            monthly_rent = data.get('monthly_rent')
            monthly_rent_includes = data.get('monthly_rent_includes')
            security = data.get('security')
            security_amount = data.get('security_amount')
            heading = data.get('heading')
            description = data.get('description')
            display_information = data.get('display_information')
            name_of_ad = data.get('name_of_ad')
            visibilty =  data.get('visibilty')
            location =  data.get('location')
            latitude =  data.get('latitude')
            longitude =  data.get('longitude')
            is_draft=  data.get('is_draft')
            property_overview = data.get('property_overview')
            type_property = data.get('type_property')
            description_home = data.get('description_home')
            spend_time = data.get('spend_time')
            useless_skill = data.get('useless_skill')
            fun_act = data.get('fun_act')
            biography = data.get('biography')
            primary_room = data.get('primary_room')
            housing_type = data.get('housing_type')
            key_info_bedroom = data.get('key_info_bedroom')
            story = data.get('story')

            if not title:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not sub_category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'sub_category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bedrooms:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'bedrooms is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'image is required'},status=status.HTTP_400_BAD_REQUEST)
            if not latitude:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not longitude:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not video:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rooms:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rooms is required'},status=status.HTTP_400_BAD_REQUEST)
            if not size:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'size is required'},status=status.HTTP_400_BAD_REQUEST)
            if not monthly_rent:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'monthly_rent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rental_period:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rental_period is required'},status=status.HTTP_400_BAD_REQUEST)
            if not facilites:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'facilites is required'},status=status.HTTP_400_BAD_REQUEST)
            if not avaiable_from_date:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'avaiable_from_date is required'},status=status.HTTP_400_BAD_REQUEST)
            if not monthly_rent_includes:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'monthly_rent_includes is required'},status=status.HTTP_400_BAD_REQUEST)
            if not security:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'security is required'},status=status.HTTP_400_BAD_REQUEST)

            if not location:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not security_amount:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'security_amount is required'},status=status.HTTP_400_BAD_REQUEST)
            if not heading:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'heading is required'},status=status.HTTP_400_BAD_REQUEST)
            if not display_information:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'display_information is required'},status=status.HTTP_400_BAD_REQUEST)
            if not name_of_ad:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'name_of_ad is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_overview:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_overview is required'},status=status.HTTP_400_BAD_REQUEST)
            if not type_property:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'type_property is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description_home:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'description_home is required'},status=status.HTTP_400_BAD_REQUEST)
            if not spend_time:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'spend_time is required'},status=status.HTTP_400_BAD_REQUEST)
            if not useless_skill:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'useless_skill is required'},status=status.HTTP_400_BAD_REQUEST)
            if not fun_act:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'fun_act is required'},status=status.HTTP_400_BAD_REQUEST)
            if not biography:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'biography is required'},status=status.HTTP_400_BAD_REQUEST)
            if not primary_room:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'primary_room is required'},status=status.HTTP_400_BAD_REQUEST)
            if not housing_type:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'housing_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not key_info_bedroom:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'key_info_bedroom is required'},status=status.HTTP_400_BAD_REQUEST)
            if not story:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'story is required'},status=status.HTTP_400_BAD_REQUEST)
            if not deposit:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'deposit is required'},status=status.HTTP_400_BAD_REQUEST)




            rentprop = RentProperty.objects.filter(id=rent_id,customerId=customerObj).first()
            rentprop.title = title
            rentprop.category = category
            rentprop.subCategory = sub_category
            rentprop.image_data = image
            rentprop.video = video
            rentprop.videos_thumbnail = videos_thumbnail
            rentprop.floor = floor
            rentprop.rooms = rooms
            rentprop.bedrooms = bedrooms
            rentprop.size = size
            rentprop.facilites = facilites
            rentprop.deposit = deposit
            rentprop.benefits = benefits
   
   
   
            rentprop.country = country
            rentprop.state = state
            rentprop.city = city
            rentprop.postal_code = postal_code
            rentprop.house_number = house_number

   
            rentprop.rental_period = rental_period
            rentprop.avaiable_from_date = avaiable_from_date
            rentprop.monthly_rent = monthly_rent
            rentprop.monthly_rent_includes = monthly_rent_includes
            rentprop.security = security
            rentprop.security_amount = security_amount
            rentprop.heading = heading
            rentprop.description = description
            rentprop.display_information = display_information
            rentprop.name_of_ad = name_of_ad
            rentprop.visibilty = visibilty
            rentprop.location = location
            rentprop.latitude = latitude
            rentprop.longitude = longitude
            rentprop.subscription_type = subscription_tyre
            rentprop.is_draft = is_draft
   
            rentprop.property_overview = property_overview
            rentprop.type_property = type_property
            rentprop.description_home = description_home
            rentprop.spend_time = spend_time
            rentprop.useless_skill = useless_skill
            rentprop.fun_act = fun_act
            rentprop.biography = biography
            rentprop.primary_room = primary_room
            rentprop.housing_type = housing_type
            rentprop.key_info_bedroom = key_info_bedroom
            rentprop.story = story
            rentprop.status = 0

            rentprop.save()
            return Response({'status_code':status.HTTP_200_OK,'message':'Updated successfully'},status=status.HTTP_200_OK)	
        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 propertyRentDetail(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            rent_id = request.query_params.get('rent_id')
            if not rent_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Rent id is required'},status=status.HTTP_400_BAD_REQUEST)
            rentobj = RentProperty.objects.filter(id=rent_id).first()
            if not rentobj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No rent property found'},status=status.HTTP_400_BAD_REQUEST)
            if rentobj.status == 0:
                status_info = "Pending"
            elif rentobj.status == 1:
                status_info = "Approved"
            else:
                status_info = "Disapproved"
            alldata = {
            'id':rentobj.id,
            'customer_id':rentobj.customerId.id,
            'fullname': rentobj.customerId.firstName+' '+ rentobj.customerId.lastName,
            'customer_image':rentobj.customerId.profileImage,
            'title':rentobj.title,
            'category': rentobj.category,
            'sub_category': rentobj.subCategory,
            'image_data':  ast.literal_eval(rentobj.image_data),
            'video':rentobj.video,
            'floor': rentobj.floor,
            'rooms': rentobj.rooms,
            'bedrooms': rentobj.bedrooms,
            'size': rentobj.size,
            'facilites': ast.literal_eval(rentobj.facilites),
            'deposit': rentobj.deposit,
            'country' : rentobj.country,
            'state' : rentobj.state,
            'city' :rentobj.city,
            'postal_code' : rentobj.postal_code,
            'house_number' : rentobj.house_number,
            'rental_period': rentobj.rental_period,
            'avaiable_from_date': rentobj.avaiable_from_date,
            'monthly_rent': rentobj.monthly_rent,
            'monthly_rent_includes': rentobj.monthly_rent_includes,
            'security': rentobj.security,
            'security_amount': rentobj.security_amount,
            'heading': rentobj.heading,
            'description': rentobj.description,
            'display_information': rentobj.display_information,
            'name_of_ad': rentobj.name_of_ad,
            'visibilty': rentobj.visibilty,
            'location': rentobj.location,
            'latitude': rentobj.latitude,
            'longitude':rentobj.longitude,
            'subscription_type':rentobj.subscription_type,
            'is_draft': rentobj.is_draft,

            'property_overview': rentobj.property_overview,
            'type_property': rentobj.type_property,
            'description_home': rentobj.description_home,
            'spend_time': rentobj.spend_time,
            'useless_skill': rentobj.useless_skill,
            'fun_act': rentobj.fun_act,
            'biography': rentobj.biography,
            'primary_room': rentobj.primary_room,
            'housing_type': rentobj.housing_type,
            'key_info_bedroom': rentobj.key_info_bedroom,
            'story': rentobj.story,
            'status':status_info,




            }
            return Response({'status_code':status.HTTP_200_OK,'message':'Updated successfully','data':alldata},status=status.HTTP_200_OK)	
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
from django.utils import timezone
from datetime import timedelta

class addSaleProperty(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan_id
                if subscription_tyre is None:
                    subscription_tyre =  1
            else:
                subscription_tyre =  1
            if subscription_tyre == 1:
                now = timezone.localtime(timezone.now())
                three_months_ago = now - timedelta(days=90)
                property_count = SaleProperty.objects.filter(
                    customerId=customerObj,
                    created_at__gte=three_months_ago
                ).count()

                if property_count >= 1:
                    return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'You can only add one property every 3 months on the Basic plan.'}, status=status.HTTP_400_BAD_REQUEST)


            # if subscription_tyre != 3:
            #     if customerObj.can_add_property_count==0:
            #         return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)

            title = data.get('title')
            main_category = data.get('main_category')
            sub_category = data.get('sub_category')
            image_data = data.get('image_data')
            video = data.get('video')
            videos_thumbnail = data.get('videos_thumbnail')
            property_name = data.get('property_name')
            house_number = data.get('house_number')
            postal_code = data.get('postal_code')
            country = data.get('country')
            state = data.get('state')
            city = data.get('city')
            benfits = data.get('benefits')

            youtubeUrl = data.get('youtubeUrl')
            phoneNumber = data.get('phoneNumber')
            price = data.get('price')
            property_demension = data.get('property_demension')
            vision = data.get('vision')
            rental = data.get('rental')
   
            descriptioon = data.get('descriptioon')
            closingFee = data.get('closingFee')
            bedrooms = data.get('bedrooms')
            bathrooms = data.get('bathrooms')
            readyBy = data.get('readyBy')
            propertyReferenceId = data.get('propertyReferenceId')
            maintenanceFee = data.get('maintenanceFee')
            facilities = data.get('facilities')
   
            finance_rental = data.get('finance_rental')
            finance_total_closing_fee = data.get('finance_total_closing_fee')
            finance_maintaince_fee = data.get('finance_maintaince_fee')
            finance_bill_utilites = data.get('finance_bill_utilites')
   
            cashflow_forecast = data.get('cashflow_forecast')
            disclaimer = data.get('disclaimer')
            property_information = data.get('property_information')
            required_capital = data.get('required_capital')
            residental_property_details = data.get('residental_property_details')
            location = data.get('location')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            is_draft = data.get('is_draft')

            if not title:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not main_category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'main_category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not sub_category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'sub_category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not video:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not postal_code:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'postal_code is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phoneNumber:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'phoneNumber is required'},status=status.HTTP_400_BAD_REQUEST)
            if not price:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_demension:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_demension is required'},status=status.HTTP_400_BAD_REQUEST)
            if not vision:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'vision is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rental:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rental is required'},status=status.HTTP_400_BAD_REQUEST)
            if not descriptioon:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'descriptioon is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bedrooms:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'bedrooms is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bathrooms:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'bathrooms is required'},status=status.HTTP_400_BAD_REQUEST)
            if not readyBy:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'readyBy is required'},status=status.HTTP_400_BAD_REQUEST)
            if not propertyReferenceId:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'propertyReferenceId is required'},status=status.HTTP_400_BAD_REQUEST)
            
   
            if not finance_rental:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finance_rental is required'},status=status.HTTP_400_BAD_REQUEST)
            if not finance_total_closing_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finance_total_closing_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not finance_maintaince_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finance_maintaince_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not finance_bill_utilites:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finance_bill_utilites is required'},status=status.HTTP_400_BAD_REQUEST)
            
   
            if not cashflow_forecast:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'cashflow_forecast is required'},status=status.HTTP_400_BAD_REQUEST)
            if not disclaimer:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'disclaimer is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_information:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_information is required'},status=status.HTTP_400_BAD_REQUEST)
            if not required_capital:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'required_capital is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not facilities:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'facilities is required'},status=status.HTTP_400_BAD_REQUEST)
            if not residental_property_details:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'residental_property_details is required'},status=status.HTTP_400_BAD_REQUEST)


            sale_obj = SaleProperty.objects.create(customerId=customerObj)
            sale_obj.title = title
            sale_obj.main_category = main_category
            sale_obj.subCategory = sub_category
            sale_obj.image_data = image_data
            sale_obj.video = video
            sale_obj.videos_thumbnail = videos_thumbnail
            sale_obj.property_name = property_name
            sale_obj.house_number = house_number
   
            sale_obj.country = country
            sale_obj.state = state
            sale_obj.city = city
            sale_obj.benfits = benfits
   
            sale_obj.postal_code = postal_code
            sale_obj.youtubeUrl = youtubeUrl
            sale_obj.phoneNumber = phoneNumber
            sale_obj.price = price
            sale_obj.property_demension = property_demension
            sale_obj.vision = vision
            sale_obj.rental = rental
            sale_obj.descriptioon = descriptioon
            sale_obj.closingFee = closingFee
            sale_obj.bedrooms = bedrooms
            sale_obj.bathrooms = bathrooms
            sale_obj.readyBy = readyBy
            sale_obj.propertyReferenceId = propertyReferenceId
            sale_obj.maintenanceFee = maintenanceFee
   
            sale_obj.finance_rental = finance_rental
            sale_obj.finance_total_closing_fee = finance_total_closing_fee
            sale_obj.finance_maintaince_fee = finance_maintaince_fee
            sale_obj.finance_bill_utilites = finance_bill_utilites
   

   
   
            sale_obj.cashflow_forecast = cashflow_forecast
            sale_obj.disclaimer = disclaimer
            sale_obj.property_information = property_information
            sale_obj.required_capital = required_capital
   
            sale_obj.location = location
            sale_obj.latitude = latitude
            sale_obj.longitude = longitude
            sale_obj.facilities = facilities
            sale_obj.residental_property_details = residental_property_details
            sale_obj.is_draft = is_draft
            sale_obj.subscription_type = subscription_tyre
            sale_obj.save()
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':sale_obj.id,
            }
            
            AdminNotifications.objects.create(message= 'A new property for sale has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=True,notification_type='sale_property')
            return Response({'status_code':status.HTTP_200_OK,'message':'Added successfully','data':allData},status=status.HTTP_200_OK)
        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 editSaleProperty(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            sale_id = request.data.get('sale_id')
            if not sale_id:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Sale id is required'},status=status.HTTP_400_BAD_REQUEST)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan_id
            else:
                subscription_tyre =  0
            title = data.get('title')
            main_category = data.get('main_category')
            sub_category = data.get('sub_category')
            image_data = data.get('image_data')
            video = data.get('video')
            videos_thumbnail = data.get('videos_thumbnail')
            property_name = data.get('property_name')
            house_number = data.get('house_number')
            country = data.get('country')
            state = data.get('state')
            city = data.get('city')
            benfits = data.get('benefits')
            postal_code = data.get('postal_code')
            youtubeUrl = data.get('youtubeUrl')
            phoneNumber = data.get('phoneNumber')
            price = data.get('price')
            property_demension = data.get('property_demension')
            vision = data.get('vision')
            rental = data.get('rental')
            descriptioon = data.get('descriptioon')
            closingFee = data.get('closingFee')
            bedrooms = data.get('bedrooms')
            bathrooms = data.get('bathrooms')
            readyBy = data.get('readyBy')
            propertyReferenceId = data.get('propertyReferenceId')
            maintenanceFee = data.get('maintenanceFee')
            facilities = data.get('facilities')
   
            finance_rental = data.get('finance_rental')
            finance_total_closing_fee = data.get('finance_total_closing_fee')
            finance_maintaince_fee = data.get('finance_maintaince_fee')
            finance_bill_utilites = data.get('finance_bill_utilites')
   
            cashflow_forecast = data.get('cashflow_forecast')
            disclaimer = data.get('disclaimer')
            property_information = data.get('property_information')
            required_capital = data.get('required_capital')
            residental_property_details = data.get('residental_property_details')
            location = data.get('location')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            is_draft = data.get('is_draft')

            if not title:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not main_category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'main_category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not sub_category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'sub_category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not video:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not postal_code:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'postal_code is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phoneNumber:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'phoneNumber is required'},status=status.HTTP_400_BAD_REQUEST)
            if not price:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_demension:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_demension is required'},status=status.HTTP_400_BAD_REQUEST)
            if not vision:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'vision is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rental:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rental is required'},status=status.HTTP_400_BAD_REQUEST)
            if not descriptioon:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'descriptioon is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bedrooms:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'bedrooms is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bathrooms:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'bathrooms is required'},status=status.HTTP_400_BAD_REQUEST)
            if not readyBy:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'readyBy is required'},status=status.HTTP_400_BAD_REQUEST)
            if not propertyReferenceId:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'propertyReferenceId is required'},status=status.HTTP_400_BAD_REQUEST)
            
   
            if not finance_rental:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finance_rental is required'},status=status.HTTP_400_BAD_REQUEST)
            if not finance_total_closing_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finance_total_closing_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not finance_maintaince_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finance_maintaince_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not finance_bill_utilites:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finance_bill_utilites is required'},status=status.HTTP_400_BAD_REQUEST)
            
   
            if not cashflow_forecast:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'cashflow_forecast is required'},status=status.HTTP_400_BAD_REQUEST)
            if not disclaimer:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'disclaimer is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_information:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_information is required'},status=status.HTTP_400_BAD_REQUEST)
            if not required_capital:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'required_capital is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not facilities:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'facilities is required'},status=status.HTTP_400_BAD_REQUEST)
            if not residental_property_details:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'residental_property_details is required'},status=status.HTTP_400_BAD_REQUEST)


            sale_obj = SaleProperty.objects.filter(id=sale_id).first()
            sale_obj.title = title
            sale_obj.main_category = main_category
            sale_obj.subCategory = sub_category
            sale_obj.image_data = image_data
            sale_obj.video = video
            sale_obj.videos_thumbnail = videos_thumbnail

            sale_obj.property_name = property_name
            sale_obj.house_number = house_number
            sale_obj.country = country
            sale_obj.state = state
            sale_obj.city = city
            sale_obj.benfits = benfits
            sale_obj.postal_code = postal_code
            sale_obj.youtubeUrl = youtubeUrl
            sale_obj.phoneNumber = phoneNumber
            sale_obj.price = price
            sale_obj.property_demension = property_demension
            sale_obj.vision = vision
            sale_obj.rental = rental
            sale_obj.descriptioon = descriptioon
            sale_obj.closingFee = closingFee
            sale_obj.bedrooms = bedrooms
            sale_obj.bathrooms = bathrooms
            sale_obj.readyBy = readyBy
            sale_obj.propertyReferenceId = propertyReferenceId
            sale_obj.maintenanceFee = maintenanceFee
   
            sale_obj.finance_rental = finance_rental
            sale_obj.finance_total_closing_fee = finance_total_closing_fee
            sale_obj.finance_maintaince_fee = finance_maintaince_fee
            sale_obj.finance_bill_utilites = finance_bill_utilites
   

   
            sale_obj.facilities = facilities
            sale_obj.cashflow_forecast = cashflow_forecast
            sale_obj.disclaimer = disclaimer
            sale_obj.property_information = property_information
            sale_obj.required_capital = required_capital
            sale_obj.location = location
            sale_obj.latitude = latitude
            sale_obj.longitude = longitude
            sale_obj.residental_property_details = residental_property_details
            sale_obj.status = 0
            sale_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'message':'Updated successfully'},status=status.HTTP_200_OK)
            
        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 salePropertyDetails(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data = request.data
            property_id = request.query_params.get('id')
            if not property_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Sale id is required'},status=status.HTTP_400_BAD_REQUEST)
            saleobj = SaleProperty.objects.filter(id=property_id).first()
            if not saleobj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No sale property found'},status=status.HTTP_400_BAD_REQUEST)
            
            if saleobj.status == 0:
                status_info = "Pending"
            elif saleobj.status == 1:
                status_info = "Approved"
            else:
                status_info = "Disapproved"

   
            alldata = {
        
            'id':saleobj.id,
            'customer_id':saleobj.customerId.id,
            'fullname': saleobj.customerId.firstName+' '+ saleobj.customerId.lastName,
            'customer_image':saleobj.customerId.profileImage,
            'title':saleobj.title,
            'main_category': saleobj.main_category,
            'sub_category': saleobj.subCategory,
            'image_data' : ast.literal_eval(saleobj.image_data),
            'video': saleobj.video,
            'videos_thumbnail': saleobj.videos_thumbnail,

            'property_name': saleobj.property_name,
            'house_number': saleobj.house_number,
            'country': saleobj.country,
            'state': saleobj.state,
            'city': saleobj.city,
            'benefits': saleobj.benfits,
   
            'postal_code': saleobj.postal_code,
            'youtubeUrl': saleobj.youtubeUrl,
            'phoneNumber': saleobj.phoneNumber,
            'price': saleobj.price,
            'property_demension': saleobj.property_demension,
            'vision': saleobj.vision,
            'rental': saleobj.rental,
            'descriptioon': saleobj.descriptioon,
            'closingFee': saleobj.closingFee,
            'bedrooms': saleobj.bedrooms,
            'bathrooms': saleobj.bathrooms,
            'readyBy': saleobj.readyBy,
            'propertyReferenceId': saleobj.propertyReferenceId,
            'maintenanceFee': saleobj.maintenanceFee,

            'finance_rental':saleobj.finance_rental,
            'finance_total_closing_fee':saleobj.finance_total_closing_fee,
            'finance_maintaince_fee':saleobj.finance_maintaince_fee,
            'finance_bill_utilites':saleobj.finance_bill_utilites,
            
            'cashflow_forecast': saleobj.cashflow_forecast,
            'disclaimer':saleobj.disclaimer,
            'property_information':saleobj.property_information,
            'required_capital':saleobj.required_capital,
            'residental_property_details':saleobj.residental_property_details,
            'facility':ast.literal_eval(saleobj.facilities),
            'location':saleobj.location,
            'latitude':saleobj.latitude,
            'longitude':saleobj.longitude,
            'subscription_type':saleobj.subscription_type,
            'is_draft':saleobj.is_draft,
            'status':status_info,

            }
            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)
        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 addCompanySeekingEquity(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0
            if subscription_tyre != 3:
                if customerObj.can_add_property_count==0:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)
            
            short_title = data.get('short_title')
            description = data.get('description')
            about_the_owner = data.get('about_the_owner')
            company_name = data.get('company_name')
            property_image = data.get('property_image')
            property_video = data.get('property_video')
            videos_thumbnail = data.get('videos_thumbnail')
            company_logo = data.get('company_logo')
            maximum_drawing = data.get('maximum_drawing')
            minimum_drawing = data.get('minimum_drawing')
            share_for_sale = data.get('share_for_sale')
            price_per_share = data.get('price_per_share')
            number_of_share = data.get('number_of_share')
            self_report = data.get('self_report')

            nominal_share_price = data.get('nominal_share_price')
            e_post = data.get('e_post')
            issue_account_number = data.get('issue_account_number')
            share_before_share = data.get('share_before_share')
            name_of_shareholder = data.get('name_of_shareholder')
            beskrivelse = data.get('beskrivelse')
   
            establish_year = data.get('establish_year')
            premises_from = data.get('premises_from')

            background_for_sale = data.get('background_for_sale')
            company_website = data.get('company_website')
            number_of_employee = data.get('number_of_employee')
            company_email = data.get('company_email')
            company_telephone = data.get('company_telephone')
            youtube = data.get('youtube')
            upload_team_data = data.get('upload_team_data')
            upload_team_size = data.get('upload_team_size')
            upload_team_name = data.get('upload_team_name')
   
   
            upload_board_data = data.get('upload_board_data')
            upload_board_name = data.get('upload_board_name')
            upload_board_size = data.get('upload_board_size')
   

            upload_partner_data = data.get('upload_partner_data')
            upload_partner_name = data.get('upload_partner_name')
            upload_partner_size = data.get('upload_partner_size')

            location = data.get('location')
            country = data.get('country')
            state = data.get('state')

            city = data.get('city')
            zip_code = data.get('zip_code')
            landmark = data.get('landmark')
            share_holder_image = data.get('share_holder_image')
            enter_shares = data.get('enter_shares')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            is_draft = data.get('is_draft')
   


            sale_obj = CompanySeekingEquity.objects.create(customerId=customerObj)
            sale_obj.short_title = short_title
            sale_obj.description = description
            sale_obj.about_the_owner = about_the_owner
            sale_obj.company_name = company_name
            sale_obj.property_image = property_image
            sale_obj.property_video = property_video
            sale_obj.videos_thumbnail = videos_thumbnail
            sale_obj.company_logo = company_logo

            sale_obj.maximum_drawing = maximum_drawing
            sale_obj.minimum_drawing = minimum_drawing
            sale_obj.share_for_sale = share_for_sale
            sale_obj.price_per_share = price_per_share
            sale_obj.number_of_share = number_of_share
            sale_obj.self_report = self_report
            sale_obj.nominal_share_price = nominal_share_price
   

            sale_obj.e_post = e_post
            sale_obj.issue_account_number = issue_account_number
            sale_obj.share_before_share = share_before_share
            sale_obj.name_of_shareholder = name_of_shareholder
            sale_obj.beskrivelse = beskrivelse
   
            sale_obj.establish_year = establish_year
            sale_obj.premises_from = premises_from
            sale_obj.background_for_sale = background_for_sale
            sale_obj.company_website = company_website
            sale_obj.number_of_employee = number_of_employee
            sale_obj.company_email = company_email
            sale_obj.company_telephone = company_telephone
            sale_obj.youtube = youtube
            sale_obj.upload_team_data = upload_team_data
            sale_obj.upload_team_size = upload_team_size
            sale_obj.upload_team_name = upload_team_name
   
   
            sale_obj.upload_board_data = upload_board_data
            sale_obj.upload_board_name = upload_board_name
            sale_obj.upload_board_size = upload_board_size
   
            sale_obj.upload_partner_data = upload_partner_data
            sale_obj.upload_partner_name = upload_partner_name
            sale_obj.upload_partner_size = upload_partner_size

            sale_obj.location = location
            sale_obj.country = country
            sale_obj.state = state
            sale_obj.city = city




            sale_obj.zip_code = zip_code
            sale_obj.landmark = landmark
            sale_obj.share_holder_image = share_holder_image
            sale_obj.enter_shares = enter_shares

            sale_obj.latitude = latitude
            sale_obj.longitude = longitude
            sale_obj.is_draft = is_draft
            sale_obj.subscription_type = subscription_tyre
            sale_obj.save()
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':sale_obj.id,
            }
            
            AdminNotifications.objects.create(message= 'A new company seeking for equity has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=True,notification_type='sale_property')
            return Response({'status_code':status.HTTP_200_OK,'message':'Added successfully','data':allData},status=status.HTTP_200_OK)
        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 updateCompanySeekingEquity(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()

            property_id = data.get('property_id')
            short_title = data.get('short_title')
            description = data.get('description')
            about_the_owner = data.get('about_the_owner')
            company_name = data.get('company_name')
            property_image = data.get('property_image')
            property_video = data.get('property_video')
            videos_thumbnail = data.get('videos_thumbnail')
            company_logo = data.get('company_logo')
            maximum_drawing = data.get('maximum_drawing')
            minimum_drawing = data.get('minimum_drawing')
            share_for_sale = data.get('share_for_sale')
            price_per_share = data.get('price_per_share')
            number_of_share = data.get('number_of_share')
            self_report = data.get('self_report')

            nominal_share_price = data.get('nominal_share_price')
            e_post = data.get('e_post')
            issue_account_number = data.get('issue_account_number')
            share_before_share = data.get('share_before_share')
            name_of_shareholder = data.get('name_of_shareholder')
            beskrivelse = data.get('beskrivelse')
   
            establish_year = data.get('establish_year')
            premises_from = data.get('premises_from')

            background_for_sale = data.get('background_for_sale')
            company_website = data.get('company_website')
            number_of_employee = data.get('number_of_employee')
            company_email = data.get('company_email')
            company_telephone = data.get('company_telephone')
            youtube = data.get('youtube')
            upload_team_data = data.get('upload_team_data')
            upload_team_size = data.get('upload_team_size')
            upload_team_name = data.get('upload_team_name')
   
   
            upload_board_data = data.get('upload_board_data')
            upload_board_name = data.get('upload_board_name')
            upload_board_size = data.get('upload_board_size')
   

            upload_partner_data = data.get('upload_partner_data')
            upload_partner_name = data.get('upload_partner_name')
            upload_partner_size = data.get('upload_partner_size')
            location = data.get('location')
            country = data.get('country')
            state = data.get('state')

            city = data.get('city')
            zip_code = data.get('zip_code')
            landmark = data.get('landmark')
            share_holder_image = data.get('share_holder_image')
            enter_shares = data.get('enter_shares')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            is_draft = data.get('is_draft')
   


            sale_obj = CompanySeekingEquity.objects.filter(id=property_id).first()
            sale_obj.short_title = short_title
            sale_obj.description = description
            sale_obj.about_the_owner = about_the_owner
            sale_obj.company_name = company_name
            sale_obj.property_image = property_image
            sale_obj.property_video = property_video
            sale_obj.videos_thumbnail = videos_thumbnail
            sale_obj.company_logo = company_logo

            sale_obj.maximum_drawing = maximum_drawing
            sale_obj.minimum_drawing = minimum_drawing
            sale_obj.share_for_sale = share_for_sale
            sale_obj.price_per_share = price_per_share
            sale_obj.number_of_share = number_of_share
            sale_obj.self_report = self_report
            sale_obj.nominal_share_price = nominal_share_price
   

            sale_obj.e_post = e_post
            sale_obj.issue_account_number = issue_account_number
            sale_obj.share_before_share = share_before_share
            sale_obj.name_of_shareholder = name_of_shareholder
            sale_obj.beskrivelse = beskrivelse
            sale_obj.establish_year = establish_year
            sale_obj.premises_from = premises_from
            sale_obj.background_for_sale = background_for_sale
            sale_obj.company_website = company_website
            sale_obj.number_of_employee = number_of_employee
            sale_obj.company_email = company_email
            sale_obj.company_telephone = company_telephone
            sale_obj.youtube = youtube
   
            sale_obj.upload_team_data = upload_team_data
            sale_obj.upload_team_size = upload_team_size
            sale_obj.upload_team_name = upload_team_name
   
   
            sale_obj.upload_board_data = upload_board_data
            sale_obj.upload_board_name = upload_board_name
            sale_obj.upload_board_size = upload_board_size
   
            sale_obj.upload_partner_data = upload_partner_data
            sale_obj.upload_partner_name = upload_partner_name
            sale_obj.upload_partner_size = upload_partner_size

            sale_obj.location = location
            sale_obj.country = country
            sale_obj.state = state
            sale_obj.city = city




            sale_obj.zip_code = zip_code
            sale_obj.landmark = landmark
            sale_obj.share_holder_image = share_holder_image
            sale_obj.enter_shares = enter_shares

            sale_obj.latitude = latitude
            sale_obj.longitude = longitude
            sale_obj.is_draft = is_draft
            sale_obj.status = 0
            sale_obj.save()
   
            allData = {
                'id':sale_obj.id,
            }
            
            AdminNotifications.objects.create(message= 'A new company seeking for equity has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=True,notification_type='sale_property')
            return Response({'status_code':status.HTTP_200_OK,'message':'Updated successfully','data':allData},status=status.HTTP_200_OK)
        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 addPropertyDevelopers(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0
            if subscription_tyre != 3:
                if customerObj.can_add_property_count==0:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)

            property_image = data.get('property_image')
            videos = data.get('videos')
            videos_thumbnail = data.get('videos_thumbnail')
            document = data.get('document')
            property_type = data.get('property_type')
            assest_equality = data.get('assest_equality')
            investment_highlight = data.get('investment_highlight')
            equity_price = data.get('equity_price')
            lp_equity_percent = data.get('lp_equity_percent')
            gp_equity_percent = data.get('gp_equity_percent')
            debt_percent = data.get('debt_percent')
            short_title = data.get('short_title')
            description = data.get('description')
            bussiness_plan = data.get('bussiness_plan')

            minimum_investment = data.get('minimum_investment')
            investment_strategy = data.get('investment_strategy')
            expected_period = data.get('expected_period')
            financed = data.get('financed')
            target_return_on_cost = data.get('target_return_on_cost')

            target_irr = data.get('target_irr')
            offered_by = data.get('offered_by')

            estimated_first_distribution = data.get('estimated_first_distribution')
            type_of_investment = data.get('type_of_investment')
            phone_number = data.get('phone_number')
            measure_of_multiplier = data.get('measure_of_multiplier')
            address = data.get('address')
            minimum_goal = data.get('minimum_goal')
            nominal_share_price = data.get('nominal_share_price')
            the_valuation = data.get('the_valuation')
            minimum_drawing = data.get('minimum_drawing')


            no_of_drawings = data.get('no_of_drawings')
            share_for_sale = data.get('share_for_sale')
            remaining_share = data.get('remaining_share')


            maximum_drawing = data.get('maximum_drawing')
            short_description = data.get('short_description')
            why_invest = data.get('why_invest')

            problem_to_be_solved = data.get('problem_to_be_solved')
            our_solution = data.get('our_solution')
            start_date_data = data.get('start_date_data')

            end_date_data = data.get('end_date_data')
            number_of_share = data.get('number_of_share')
            price_of_share = data.get('price_of_share')
            issue_minimum_investment = data.get('issue_minimum_investment')
            issue_maximum_investment = data.get('issue_maximum_investment')
            value_before_issue = data.get('value_before_issue')
            raised_capital_minimum_limit = data.get('raised_capital_minimum_limit')
            raised_capital_maximum_limit = data.get('raised_capital_maximum_limit')
            share_of_company_sold_minimum_limit = data.get('share_of_company_sold_minimum_limit')
            share_of_company_sold_maximum_limit = data.get('share_of_company_sold_maximum_limit')
            self_report = data.get('self_report')
            discussion_description = data.get('discussion_description')
            new_exisiting_details = data.get('new_exisiting_details')
            drawing_on_behalf = data.get('drawing_on_behalf')
            foundation = data.get('foundation')
            foundation_name = data.get('foundation_name')
   
            satutes = data.get('satutes')
            satutes_name = data.get('satutes_name')
   
            annual_account = data.get('annual_account')
            annual_account_name = data.get('annual_account_name')
   
            valuation = data.get('valuation')
            valuation_name = data.get('valuation_name')
   
            agreement_on_co = data.get('agreement_on_co')
            agreement_on_co_name = data.get('agreement_on_co_name')

            conversion_of_debt = data.get('conversion_of_debt')
            conversion_of_debt_name = data.get('conversion_of_debt_name')
   
            balance_sheet = data.get('balance_sheet')
            balance_sheet_name = data.get('balance_sheet_name')

            result_report = data.get('result_report')
            result_report_name = data.get('result_report_name')

            country = data.get('country')
            state = data.get('state')
            city = data.get('city')
            postal_code = data.get('postal_code')
            landmark = data.get('landmark')
            house_number = data.get('house_number')
            location = data.get('location')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            latitude = data.get('latitude')
            is_draft = data.get('is_draft')
            property_name = data.get('property_name')
   
   




            sale_obj = PropertyDevelopers.objects.create(customerId=customerObj)
            sale_obj.property_name = property_name
            sale_obj.property_image = property_image
            sale_obj.videos = videos
            sale_obj.videos_thumbnail = videos_thumbnail
            sale_obj.document = document
            sale_obj.property_type = property_type
            sale_obj.assest_equality = assest_equality
            sale_obj.investment_highlight = investment_highlight
            sale_obj.equity_price = equity_price

            sale_obj.lp_equity_percent = lp_equity_percent
            sale_obj.gp_equity_percent = gp_equity_percent
            sale_obj.debt_percent = debt_percent
            sale_obj.short_title = short_title
            sale_obj.description = description
            sale_obj.bussiness_plan = bussiness_plan
            sale_obj.minimum_investment = minimum_investment


            sale_obj.investment_strategy = investment_strategy
            sale_obj.expected_period = expected_period
            sale_obj.financed = financed
            sale_obj.target_return_on_cost = target_return_on_cost
            sale_obj.target_irr = target_irr

            sale_obj.offered_by = offered_by
            sale_obj.estimated_first_distribution = estimated_first_distribution
            sale_obj.type_of_investment = type_of_investment
            sale_obj.phone_number = phone_number
            sale_obj.measure_of_multiplier = measure_of_multiplier
            sale_obj.address = address
            sale_obj.minimum_goal = minimum_goal
            sale_obj.nominal_share_price = nominal_share_price
            sale_obj.the_valuation = the_valuation
            sale_obj.minimum_drawing = minimum_drawing
            sale_obj.no_of_drawings = no_of_drawings


            sale_obj.share_for_sale = share_for_sale
            sale_obj.remaining_share = remaining_share
            sale_obj.maximum_drawing = maximum_drawing

            sale_obj.short_description = short_description
            sale_obj.why_invest = why_invest
            sale_obj.problem_to_be_solved = problem_to_be_solved

            sale_obj.our_solution = our_solution
            sale_obj.start_date_data = start_date_data
            sale_obj.end_date_data = end_date_data
            sale_obj.number_of_share = number_of_share




            sale_obj.price_of_share = price_of_share
            sale_obj.issue_minimum_investment = issue_minimum_investment
            sale_obj.issue_maximum_investment = issue_maximum_investment
            sale_obj.value_before_issue = value_before_issue
            sale_obj.raised_capital_minimum_limit = raised_capital_minimum_limit
            sale_obj.raised_capital_maximum_limit = raised_capital_maximum_limit
            sale_obj.share_of_company_sold_minimum_limit = share_of_company_sold_minimum_limit
            sale_obj.share_of_company_sold_maximum_limit = share_of_company_sold_maximum_limit
            sale_obj.self_report = self_report
            sale_obj.discussion_description = discussion_description
            sale_obj.new_exisiting_details = new_exisiting_details
            sale_obj.drawing_on_behalf = drawing_on_behalf
            sale_obj.foundation = foundation
            sale_obj.foundation_name = foundation_name
   
            sale_obj.satutes = satutes
            sale_obj.satutes_name = satutes_name 
    
            sale_obj.annual_account = annual_account
            sale_obj.annual_account_name = annual_account_name
   
            sale_obj.valuation = valuation
            sale_obj.valuation_name = valuation_name
   
            sale_obj.agreement_on_co = agreement_on_co
            sale_obj.agreement_on_co_name = agreement_on_co_name
   
            sale_obj.conversion_of_debt = conversion_of_debt
            sale_obj.conversion_of_debt_name = conversion_of_debt_name
   
            sale_obj.balance_sheet = balance_sheet
            sale_obj.balance_sheet_name = balance_sheet_name
   
            sale_obj.result_report = result_report
            sale_obj.result_report_name = result_report_name
   
            sale_obj.country = country
            sale_obj.state = state
            sale_obj.city = city
            sale_obj.postal_code = postal_code
            sale_obj.landmark = landmark
            sale_obj.house_number = house_number
            sale_obj.location = location
            sale_obj.latitude = latitude
            sale_obj.longitude = longitude
            sale_obj.is_draft = is_draft
            sale_obj.subscription_type = subscription_tyre
            sale_obj.save()
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':sale_obj.id,
            }
            
            return Response({'status_code':status.HTTP_200_OK,'message':'Added successfully','data':allData},status=status.HTTP_200_OK)
        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 updatePropertyDevelopers(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0
            property_id = data.get('property_id')
            property_image = data.get('property_image')
            videos = data.get('videos')
            videos_thumbnail = data.get('videos_thumbnail')
            document = data.get('document')
            property_type = data.get('property_type')
            assest_equality = data.get('assest_equality')
            investment_highlight = data.get('investment_highlight')
            equity_price = data.get('equity_price')
            lp_equity_percent = data.get('lp_equity_percent')
            gp_equity_percent = data.get('gp_equity_percent')
            debt_percent = data.get('debt_percent')
            short_title = data.get('short_title')
            description = data.get('description')
            bussiness_plan = data.get('bussiness_plan')

            minimum_investment = data.get('minimum_investment')
            investment_strategy = data.get('investment_strategy')
            expected_period = data.get('expected_period')
            financed = data.get('financed')
            target_return_on_cost = data.get('target_return_on_cost')

            target_irr = data.get('target_irr')
            offered_by = data.get('offered_by')

            estimated_first_distribution = data.get('estimated_first_distribution')
            type_of_investment = data.get('type_of_investment')
            phone_number = data.get('phone_number')
            measure_of_multiplier = data.get('measure_of_multiplier')
            address = data.get('address')
            minimum_goal = data.get('minimum_goal')
            nominal_share_price = data.get('nominal_share_price')
            the_valuation = data.get('the_valuation')
            minimum_drawing = data.get('minimum_drawing')


            no_of_drawings = data.get('no_of_drawings')
            share_for_sale = data.get('share_for_sale')
            remaining_share = data.get('remaining_share')


            maximum_drawing = data.get('maximum_drawing')
            short_description = data.get('short_description')
            why_invest = data.get('why_invest')

            problem_to_be_solved = data.get('problem_to_be_solved')
            our_solution = data.get('our_solution')
            start_date_data = data.get('start_date_data')

            end_date_data = data.get('end_date_data')
            number_of_share = data.get('number_of_share')
            price_of_share = data.get('price_of_share')
            issue_minimum_investment = data.get('issue_minimum_investment')
            issue_maximum_investment = data.get('issue_maximum_investment')
            value_before_issue = data.get('value_before_issue')
            raised_capital_minimum_limit = data.get('raised_capital_minimum_limit')
            raised_capital_maximum_limit = data.get('raised_capital_maximum_limit')
            share_of_company_sold_minimum_limit = data.get('share_of_company_sold_minimum_limit')
            share_of_company_sold_maximum_limit = data.get('share_of_company_sold_maximum_limit')
            self_report = data.get('self_report')
            discussion_description = data.get('discussion_description')
            new_exisiting_details = data.get('new_exisiting_details')
            drawing_on_behalf = data.get('drawing_on_behalf')
            foundation = data.get('foundation')
            foundation_name = data.get('foundation_name')
   
            satutes = data.get('satutes')
            satutes_name = data.get('satutes_name')
   
            annual_account = data.get('annual_account')
            annual_account_name = data.get('annual_account_name')
   
            valuation = data.get('valuation')
            valuation_name = data.get('valuation_name')
   
            agreement_on_co = data.get('agreement_on_co')
            agreement_on_co_name = data.get('agreement_on_co_name')

            conversion_of_debt = data.get('conversion_of_debt')
            conversion_of_debt_name = data.get('conversion_of_debt_name')
   
            balance_sheet = data.get('balance_sheet')
            balance_sheet_name = data.get('balance_sheet_name')

            result_report = data.get('result_report')
            result_report_name = data.get('result_report_name')
            country = data.get('country')
            state = data.get('state')
            city = data.get('city')
            postal_code = data.get('postal_code')
            landmark = data.get('landmark')
            house_number = data.get('house_number')
            location = data.get('location')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            latitude = data.get('latitude')
            is_draft = data.get('is_draft')
            property_name = data.get('property_name')
   
   




            sale_obj = PropertyDevelopers.objects.filter(id= property_id).first()
            sale_obj.property_name = property_name
            sale_obj.property_image = property_image
            sale_obj.videos = videos
            sale_obj.videos_thumbnail = videos_thumbnail
            sale_obj.document = document
            sale_obj.property_type = property_type
            sale_obj.assest_equality = assest_equality
            sale_obj.investment_highlight = investment_highlight
            sale_obj.equity_price = equity_price

            sale_obj.lp_equity_percent = lp_equity_percent
            sale_obj.gp_equity_percent = gp_equity_percent
            sale_obj.debt_percent = debt_percent
            sale_obj.short_title = short_title
            sale_obj.description = description
            sale_obj.bussiness_plan = bussiness_plan
            sale_obj.minimum_investment = minimum_investment


            sale_obj.investment_strategy = investment_strategy
            sale_obj.expected_period = expected_period
            sale_obj.financed = financed
            sale_obj.target_return_on_cost = target_return_on_cost
            sale_obj.target_irr = target_irr

            sale_obj.offered_by = offered_by
            sale_obj.estimated_first_distribution = estimated_first_distribution
            sale_obj.type_of_investment = type_of_investment
            sale_obj.phone_number = phone_number
            sale_obj.measure_of_multiplier = measure_of_multiplier
            sale_obj.address = address
            sale_obj.minimum_goal = minimum_goal
            sale_obj.nominal_share_price = nominal_share_price
            sale_obj.the_valuation = the_valuation
            sale_obj.minimum_drawing = minimum_drawing
            sale_obj.no_of_drawings = no_of_drawings


            sale_obj.share_for_sale = share_for_sale
            sale_obj.remaining_share = remaining_share
            sale_obj.maximum_drawing = maximum_drawing

            sale_obj.short_description = short_description
            sale_obj.why_invest = why_invest
            sale_obj.problem_to_be_solved = problem_to_be_solved

            sale_obj.our_solution = our_solution
            sale_obj.start_date_data = start_date_data
            sale_obj.end_date_data = end_date_data
            sale_obj.number_of_share = number_of_share




            sale_obj.price_of_share = price_of_share
            sale_obj.issue_minimum_investment = issue_minimum_investment
            sale_obj.issue_maximum_investment = issue_maximum_investment
            sale_obj.value_before_issue = value_before_issue
            sale_obj.raised_capital_minimum_limit = raised_capital_minimum_limit
            sale_obj.raised_capital_maximum_limit = raised_capital_maximum_limit
            sale_obj.share_of_company_sold_minimum_limit = share_of_company_sold_minimum_limit
            sale_obj.share_of_company_sold_maximum_limit = share_of_company_sold_maximum_limit
            sale_obj.self_report = self_report
            sale_obj.discussion_description = discussion_description
            sale_obj.new_exisiting_details = new_exisiting_details
            sale_obj.drawing_on_behalf = drawing_on_behalf
            sale_obj.foundation = foundation
            sale_obj.foundation_name = foundation_name
   
            sale_obj.satutes = satutes
            sale_obj.satutes_name = satutes_name 
    
            sale_obj.annual_account = annual_account
            sale_obj.annual_account_name = annual_account_name
   
            sale_obj.valuation = valuation
            sale_obj.valuation_name = valuation_name
   
            sale_obj.agreement_on_co = agreement_on_co
            sale_obj.agreement_on_co_name = agreement_on_co_name
   
            sale_obj.conversion_of_debt = conversion_of_debt
            sale_obj.conversion_of_debt_name = conversion_of_debt_name
   
            sale_obj.balance_sheet = balance_sheet
            sale_obj.balance_sheet_name = balance_sheet_name
   
            sale_obj.result_report = result_report
            sale_obj.result_report_name = result_report_name
            sale_obj.country = country
            sale_obj.state = state
            sale_obj.city = city
            sale_obj.postal_code = postal_code
            sale_obj.landmark = landmark
            sale_obj.house_number = house_number
            sale_obj.location = location
            sale_obj.latitude = latitude
            sale_obj.longitude = longitude
            sale_obj.is_draft = is_draft
            sale_obj.subscription_type = subscription_tyre
            sale_obj.save()
            allData = {
                'id':sale_obj.id,
            }
            
            return Response({'status_code':status.HTTP_200_OK,'message':'Updated successfully','data':allData},status=status.HTTP_200_OK)
        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 myListing(APIView):
    def get(self,request):
        # try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            selected_type = request.GET.get('type')
            sort_price = request.GET.get('sort_price')
            sort_upload_date = request.GET.get('sort_upload_date')
            filter_data =  request.GET.get('filter_data')
            status_filter = request.GET.get('status_filter')
            feature_filter = request.GET.get('feature_filter')
   


            customerObj=Customer.objects.filter(user=uid).first()
            bussinessSale = BussinessForSale.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
            houseWantedRent = HouseWantedForRent.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
            investmentProject = InvestmentMyProject.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
            investmentCompany = InvestmentMyCompany.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
            propertyProject = PropertyProject.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
            saleProperty = SaleProperty.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
            rentProperty = RentProperty.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
            seeking_equity = CompanySeekingEquity.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
            propertyDeveloper =  PropertyDevelopers.objects.filter(customerId=customerObj,end_date__isnull = True).order_by('-id')
   
    
            allData= []
            for bs in bussinessSale:
                favourite_obj = BussinessForSaleFavourite.objects.filter(bussiness=bs.id,customerId=customerObj).first()
                if favourite_obj:
                    favourite = True
                else:
                    favourite = False
        
                if bs.status == 0:
                    status_info = "Pending"
                elif bs.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                investments = inquirePropertyProject.objects.filter(
                    bussiness_for_sale_id=bs.id,
                ).aggregate(total_investment=Sum('investment_amount'))

                total_investment = investments['total_investment']

                allData.append({
                    'id': bs.id,
                    'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
                    'company_name': bs.company_name,
                    'short_title': bs.short_title,
                    'image_data': ast.literal_eval(bs.image_data.strip()) if bs.image_data and bs.image_data.strip() else [],
                    'videos': bs.videos,
                    'videos_thumbnail': bs.videos_thumbnail,
                    'company_name': bs.company_name,
                    'description': bs.description,
                    'total_turnover': bs.total_turnover,
                    'rent': bs.rent,
                    'established_year': bs.established_year,
                    'premises': bs.premises,
                    'years_of_work': bs.years_of_work,
                    'operation_concept': bs.operation_concept,
                    'operation_opening_hours': bs.operation_opening_hours,
                    'turnover_last_year': bs.turnover_last_year,
                    'salary_percentage': bs.salary_percentage,
                    'city': bs.city,
                    'country': bs.country,
                    'is_favourite': favourite,
                    'cost': bs.cost,
                    'reason_for_sale':bs.reason_for_sale,
                    'website_link':bs.website_link,
                    'number_of_employes':bs.number_of_employes,
                    'other_operating_cost':bs.other_operating_cost,
                    'area':bs.area,
                    'term_of_lease': bs.term_of_lease,
                    'document':ast.literal_eval(bs.document.strip()) if bs.document and bs.document.strip() else [],
                    'details': bs.details,
                    'service':bs.service,
                    'operations':bs.operations,
                    'market_initatives':bs.market_initatives,
                    'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
                    'valuation':bs.valuation,
                    'owner_name':bs.owner_name,
                    'phone':bs.phone,
                    'telephone':bs.telephone,
                    'email':bs.email,
                    'company':bs.company,
                    'public_order':bs.public_order,
                    'avaiable_attachment':bs.avaiable_attachment,
                    'location':bs.location,
                    'latitude':bs.latitude,
                    'longitude':bs.longitude,   
                    'status':status_info,
                    'is_ad_featured':bs.is_featured,
                     'shareholder_name': bs.shareholder_name,
                    'shareholder_share': bs.shareholder_share,
                    'shareholder_description': bs.shareholder_description,
                    'type':"BusinessSale",
                    'investment_amount':total_investment,
                    'payment_status':bs.payment_done
                    })
            
            for hWr in houseWantedRent:
       
                favourite_obj = HouseRentFavourite.objects.filter(house_rent=hWr.id,customerId=customerObj).first()
                if favourite_obj:
                    favourite = True
                else:
                    favourite = False
    
                if hWr.status == 0:
                    status_info = "Pending"
                elif hWr.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                
                
                if hWr.first_name and hWr.last_name:
                    name=hWr.first_name+' '+ hWr.last_name
                elif hWr.first_name and not hWr.last_name:
                    name=hWr.first_name
                elif not hWr.first_name and  hWr.last_name:
                    name=hWr.last_name
                allData.append({
                    'id': hWr.id,
                    'short_title':hWr.short_title,
                    'customer_id':hWr.customerId.id,
                    'fullname':name ,
                    
                    'profile_visiblity':hWr.profile_visiblity,
                    'profile_hidden':hWr.profile_hidden,
                    'image_data':ast.literal_eval(hWr.image) if hWr.image and hWr.image.strip() else [],
                    'first_name': hWr.first_name,
                    'last_name': hWr.last_name,
                    'gender': hWr.gender,
                    'dob': hWr.dob,
                    'nationality': hWr.nationality,
                    'phone_number':hWr.phone_number,
                    'email': hWr.email,
                    'quantity': hWr.quantity,
                    'rental_period': hWr.rental_period,
                    'max_rent': hWr.max_rent,
                    'from_date': hWr.from_date,
                     'housing_type':ast.literal_eval(hWr.housing_type) if hWr.housing_type and hWr.housing_type.strip() else [],
                    'number_of_people':hWr.number_of_people,
                    'max_month_price': hWr.max_month_price,
                    'desired_start_date':hWr.desired_start_date,
                    'desired_area': hWr.desired_area,
                    'latitude':hWr.latitude,
                    'longitude':hWr.longitude,
                    'location':hWr.location,
                    'about':hWr.about,
                    'education':hWr.education,
                    'martial_status':hWr.martial_status,
                    'cleanliness':hWr.cleanliness,
                    'party_habits':hWr.party_habits,
                    'work':hWr.work,
                    'interest':hWr.interest,
                    'subscription_type':hWr.subscription_type,
                    'is_draft':hWr.is_draft,
                    'work':hWr.work,
                    'country':hWr.country,
                    'state':hWr.state,
                    'city':hWr.city,
                    'postal_code':hWr.postal_code,
                    'landmark':hWr.landmark,
                    'floor':hWr.floor,
                    'description':hWr.description,
                    'status':status_info,
                    'is_favourite':favourite,
                    'is_ad_featured':hWr.is_featured,
                    'type':"HouseRent"})
            # for ip in investmentProject:
            # 	allData.append({'id':ip.id,
            # 		'project_name':ip.property_name,
            # 		'image_data':ip.image_data,
            # 		'location':ip.location,
            # 		'investment_strategy':ip.investment_strategy,
            # 		'investment_type':ip.type_of_investment,
            # 		'target_irr':ip.target_irr,
            # 		'target_return_on_cost':ip.target_return_on_cost,
            # 		'offered_by':ip.offered_by,
            # 		'overview':ip.overview,
            # 		'filter_price':ip.minimum_investment,
            # 		'created_date':ip.start_date,
            # 		'type':"InvestmentProject"})
            # for ic in investmentCompany:
            # 	allData.append({
            # 		'id': ic.id,
            # 		'customer_id':ic.customerId.id,
            # 		'fullname': ic.customerId.firstName+' '+ ic.customerId.lastName,
            # 		'company_name' :ic.property_name,
            # 		'company_established' :ic.company_established,
            # 		'company_email' :ic.company_email,
            # 		'the_valuation' :ic.the_valuation,
            # 		'price_per_share':ic.price_per_share,
            # 		'shares_for_sale' :ic.shares_for_sale,
            # 		'minimum_drawing' :ic.minimum_drawing,
            # 		'max_drawing' :ic.max_drawing,
            # 		'status': ic.status,
            # 		'created_date':ic.start_date,
            # 		'filter_price':ic.the_valuation,
            # 		'type':"InvestmentCompany"})
            for pp in propertyProject:
                favourite_obj = PropertyProjectFavourite.objects.filter(property=pp.id,customerId=customerObj).first()
                if favourite_obj:
                    favourite = True
                else:
                    favourite = False
         
                if pp.status == 0:
                    status_info = "Pending"
                elif pp.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                allData.append({
                    'id': pp.id,
                    'customer_id':pp.customerId.id,
                    'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
                    'image_data' : ast.literal_eval(pp.image_data.strip()) if pp.image_data and pp.image_data.strip() else [],
                    'property_name':pp.property_name,
                    'location':pp.location,
                    'rent_to_landlord':pp.rent_to_landlord,
                    'return_on_investment':pp.return_on_investment,
                    'created_date':pp.start_date,
                    'filter_price':pp.return_on_investment,
                    'cashflow_pcm':pp.cashflow_pcm,
                    'price':pp.price,
                    'country':pp.country,
                    'state':pp.state,
                    'city':pp.city,
                    'postal_code':pp.postal_code,
                    'landmark':pp.landmark,
                    'house_number':pp.house_number,
                    'location':pp.location,
                    'latitude':pp.latitude,
                    'longitude':pp.longitude,
                     'is_favourite':favourite,
                    'status':status_info,
                    'is_ad_featured':pp.is_featured,
                    'type':"PropertyProject"})
                
            for sp in saleProperty:
                favourite_obj = SalePropertyFavourite.objects.filter(sale=sp.id,customerId=customerObj).first()
                if favourite_obj:
                    favourite = True
                else:
                    favourite = False
     
                if sp.status == 0:
                    status_info = "Pending"
                elif sp.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
        
                allData.append ({
                    'id':sp.id,
                    'title':sp.title,
                    'main_category': sp.main_category,
                    'sub_category': sp.subCategory,
                    'image_data' :ast.literal_eval(sp.image_data.strip()) if sp.image_data and sp.image_data.strip() else [],
                    'video': sp.video,
                    'videos_thumbnail': sp.videos_thumbnail,
                    'is_favourite':favourite,
                    'property_name': sp.property_name,
                    'house_number': sp.house_number,
                    'country': sp.country,
                    'state': sp.state,
                    'city': sp.city,
                    # 'benefits': ast.literal_eval(sp.benfits.strip()) if sp.benfits and sp.benfits.strip() else [],
                    'postal_code': sp.postal_code,
                    'youtubeUrl': sp.youtubeUrl,
                    'phoneNumber': sp.phoneNumber,
                    'price': sp.price,
                    'property_demension': sp.property_demension,
                    'vision': sp.vision,
                    'rental': sp.rental,
                    'descriptioon': sp.descriptioon,
                    'closingFee': sp.closingFee,
                    'bedrooms': sp.bedrooms,
                    'bathrooms': sp.bathrooms,
                    'readyBy': sp.readyBy,
                    'propertyReferenceId': sp.propertyReferenceId,
                    'maintenanceFee': sp.maintenanceFee,
                    # 'facilities':ast.literal_eval(sp.facilities.strip()) if sp.facilities and sp.facilities.strip() else [],
                    'location':sp.location,
                    'latitude':sp.latitude,
                    'longitude':sp.longitude,
                    'location':sp.location,
                    'created_date':sp.created_at,
                    'filter_price':sp.price,
                     'is_ad_featured':sp.is_featured,
                    'status':status_info,
                    'type':"SaleProperty",
                })
            for rp in rentProperty:
                favourite_obj = RentPropertyFavourite.objects.filter(rent=rp.id,customerId=customerObj).first()
                if favourite_obj:
                    favourite = True
                else:
                    favourite = False
     
                if rp.status == 0:
                    status_info = "Pending"
                elif rp.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                allData.append ({
                        'id':rp.id,
                        'title':rp.title,
                        'category': rp.category,
                        'sub_category': rp.subCategory,
                        'image_data': ast.literal_eval(rp.image_data.strip()) if rp.image_data and rp.image_data.strip() else [],
                        'video':rp.video,
                        'floor': rp.floor,
                        'rooms': rp.rooms,
                        'bedrooms': rp.bedrooms,
                        'size': rp.size,
                        'facilites': ast.literal_eval(rp.facilites.strip()) if rp.facilites and rp.facilites.strip() else [],
                        'country': rp.country,
                        'state': rp.state,
                        'city': rp.city,
                        'postal_code':rp.postal_code,
                        'landmark': rp.landmark,
                        'house_number': rp.house_number,

                        'rental_period': rp.rental_period,
                        'avaiable_from_date': rp.avaiable_from_date,
                        'monthly_rent': rp.monthly_rent,
                        'monthly_rent_includes': rp.monthly_rent_includes,
                        'security': rp.security,
                        'security_amount': rp.security_amount,
                        'heading': rp.heading,
                        'description': rp.description,
                        'display_information': rp.display_information,
                        'name_of_ad': rp.name_of_ad,
                        'visibilty': rp.visibilty,
                        'location': rp.location,
                        'latitude': rp.latitude,
                        'longitude':rp.longitude,
                        'created_date':rp.created_at,
                        'filter_price':rp.monthly_rent,
                          'is_favourite':favourite,
                        'status':status_info,
                         'is_ad_featured':rp.is_featured,
                        'type':"RentProperty",
                })

            for cs in seeking_equity:
                favourite_obj = CompanySeekingEquityFavourite.objects.filter(company_seek_id=cs.id,customerId=customerObj).first()
                if favourite_obj:
                    favourite = True
                else:
                    favourite = False
    
                if cs.status == 0:
                    status_info = "Pending"
                elif cs.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                
                investments = inquirePropertyProject.objects.filter(
                    company_seeking_equity_id=cs.id,
                ).aggregate(total_investment=Sum('investment_amount'))
                total_investment = investments['total_investment']
                allData.append ({
                        'id':cs.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'customer_id' : cs.customerId.id,
                        'customer_phone_number' : cs.customerId.phoneNumber,
                        'customer_images' : cs.customerId.profileImage,
                        'short_title':cs.short_title,
                        'description': cs.description,
                        'about_the_owner': cs.about_the_owner,
                        'company_name': cs.company_name,
                        'property_video': cs.property_video,
                        'videos_thumbnail': cs.videos_thumbnail,
                        'company_logo': cs.company_logo,
                        'maximum_drawing': cs.maximum_drawing,
                        'image_data':ast.literal_eval(cs.property_image.strip()) if cs.property_image and cs.property_image.strip() else [],
                        'minimum_drawing': cs.minimum_drawing,
                        'share_for_sale': cs.share_for_sale,
                        'price_per_share': cs.price_per_share,
                        'number_of_share':cs.number_of_share,
                        'self_report': cs.self_report,
                        'nominal_share_price': cs.nominal_share_price,
                        'e_post': cs.e_post,
                        'issue_account_number': cs.issue_account_number,
                        'share_before_share': cs.share_before_share,
                        'name_of_shareholder': cs.name_of_shareholder,
                        'beskrivelse': cs.beskrivelse,
                        'establish_year': cs.establish_year,
                        'landmark': cs.landmark,
                        'zip_code': cs.zip_code,
                        'city': cs.city,
                        'state': cs.state,
                        'country': cs.country,
                        'location': cs.location,
                        'latitude': cs.latitude,
                        'longitude':cs.longitude,
                        'filter_price':cs.price_per_share,
                        'is_favourite':favourite,
                        'status':status_info,
                        'is_ad_featured':cs.is_featured,
                        'type':"seeking_equity",
                        'investment_amount':total_investment,
                        'payment_status':cs.payment_done
                })
            for pd in propertyDeveloper:
                if pd.status == 0:
                    status_info = "Pending"
                elif pd.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
        
                favourite_obj = PropertyDevelopersFavourite.objects.filter(property_developer_id=pd.id,customerId=customerObj).first()
                if favourite_obj:
                    favourite = True
                else:
                    favourite = False
     
                investments = inquirePropertyProject.objects.filter(
                    property_developers_id=cs.id,
                ).aggregate(total_investment=Sum('investment_amount'))
                total_investment = investments['total_investment']
                allData.append({
                    'id': pd.id,
                    'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
                    'customer_id' : pd.customerId.id,
                    'customer_phone_number' : pd.customerId.phoneNumber,
                    'customer_images' : pd.customerId.profileImage,
                    'image_data': ast.literal_eval(pd.property_image),
                    'videos': pd.videos,
                    'videos_thumbnail': pd.videos_thumbnail,
                    'document': pd.document,
                    'property_name':pd.property_name,
                    'property_type': pd.property_type,
                    'assest_equality': pd.assest_equality,
                    'investment_highlight': pd.investment_highlight,
                    'equity_price': pd.equity_price,
                    'lp_equity_percent': pd.lp_equity_percent,
                    'gp_equity_percent': pd.gp_equity_percent,
                    'debt_percent': pd.debt_percent,
                    'short_title': pd.short_title,
                    'description': pd.description,
                    'bussiness_plan': pd.bussiness_plan,
                    'minimum_investment': pd.minimum_investment,
                    'investment_strategy': pd.investment_strategy,
                    'expected_period': pd.expected_period,
                    'financed': pd.financed,
                    'target_return_on_cost': pd.target_return_on_cost,
                    'target_irr': pd.target_irr,
                    'offered_by': pd.offered_by,
                    'estimated_first_distribution': pd.estimated_first_distribution,
                    'type_of_investment': pd.type_of_investment,
                    'phone_number': pd.phone_number,
                    'measure_of_multiplier': pd.measure_of_multiplier,
                    'address': pd.address,
                    'minimum_goal': pd.minimum_goal,

                    'nominal_share_price': pd.nominal_share_price,
                    'the_valuation': pd.the_valuation,
                    'minimum_drawing': pd.minimum_drawing,

                    'no_of_drawings': pd.no_of_drawings,
                    'share_for_sale': pd.share_for_sale,
                    'remaining_share': pd.remaining_share,
                    'maximum_drawing': pd.maximum_drawing,
                    'short_description': pd.short_description,
                    'why_invest': pd.why_invest,
                    'problem_to_be_solved': pd.problem_to_be_solved,
                    'our_solution': pd.our_solution,
                    'start_date_data': pd.start_date_data,
                    'end_date_data': pd.end_date_data,
                    'number_of_share': pd.number_of_share,
                    'issue_minimum_investment': pd.issue_minimum_investment,
                    'issue_maximum_investment': pd.issue_maximum_investment,
                    'value_before_issue': pd.value_before_issue,
                    'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
                    'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
                    'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
                    'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
                    'self_report': pd.self_report,
                    'discussion_description': pd.discussion_description,
                    'new_exisiting_details': pd.new_exisiting_details,
                    'drawing_on_behalf': pd.drawing_on_behalf,
                    'foundation': pd.foundation,
                    'satutes': pd.satutes,
                    'annual_account': pd.annual_account,
                    'valuation': pd.valuation,
                    'agreement_on_co': pd.agreement_on_co,
                    'conversion_of_debt': pd.conversion_of_debt,
                    'balance_sheet': pd.balance_sheet,
                    'result_report': pd.result_report,
                    'location': pd.location,
                    'country': pd.country,
                    'state': pd.state,
                    'city': pd.city,
                    'zip_code': pd.postal_code,
                    'landmark': pd.landmark,
                    'latitude': pd.latitude,
                    'longitude': pd.longitude,
                    'status': pd.status,
                    'agency': pd.agency.id if pd.agency else None,
                    'subscription_type': pd.subscription_type,
                    'start_date': pd.start_date,
                    'end_date': pd.end_date,
                     'status':status_info,
                    'is_ad_featured':pd.is_featured,
                    'is_favourite':favourite,
                    'type':"property_developers",
                    'investment_amount':total_investment,
                    'payment_status':pd.payment_done
                })

            if filter_data == 'true':	
                if selected_type:
                    allData = [data for data in allData if data['type'] == selected_type]
                if feature_filter == "True":
                    allData = [data for data in allData if data['is_ad_featured'] == selected_type]
                elif feature_filter == "False":
                    allData = [data for data in allData if data['is_ad_featured'] == selected_type]
                if sort_price == 'ascending':
                    allData = sorted(allData, key=lambda x: x['filter_price'])
                elif sort_price == 'desending':
                    allData = sorted(allData, key=lambda x: x['filter_price'], reverse=True)
                if sort_upload_date == "oldest":
                    allData = sorted(allData, key=lambda x: x['created_date'])
                elif sort_upload_date == "latest":
                    allData = sorted(allData, key=lambda x: x['created_date'], reverse=True)
                if status_filter:
                    allData = [data for data in allData if data['status'] == status_filter]
            else:
                allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', True)))

            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched successfully','data':allData},status=status.HTTP_200_OK)
                    
        # 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 getCategories(APIView):
    def get(self,request):
        try:
            allData = []
            categoryObj = Categories.objects.filter(status=0)
            for category in categoryObj:
                data = {
                    'id':category.id,
                    'category_name':category.category_name
                }
                allData.append(data)
            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched successfully','data':allData},status=status.HTTP_200_OK)
            
        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 bussinessForSale(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0
            if subscription_tyre != 3:
                if customerObj.can_add_property_count==0:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)
            short_title = data.get('short_title')
            image_data = data.get('image_data')
            videos = data.get('videos')
            company_name = data.get('company_name')
            description = data.get('description')
            total_turnover = data.get('total_turnover')
            rent = data.get('rent')
            established_year= data.get('established_year')
            premises= data.get('premises')
            years_of_work = data.get('years_of_work')
            operation_concept= data.get('operation_concept')
            operation_opening_hours= data.get('operation_opening_hours')
            turnover_last_year= data.get('turnover_last_year')
            salary_percentage= data.get('salary_percentage')
            other_operating_cost = data.get('other_operating_cost')
            cost = data.get('cost')
            reason_for_sale = data.get('reason_for_sale')
            website_link= data.get('website_link')
            number_of_employes =data.get('number_of_employes')
            area =data.get('area')
            rent =data.get('rent')
            term_of_lease =data.get('term_of_lease')
            document =data.get('document')
            details= data.get('details')
            service = data.get('service')
            operations = data.get('operations')
            market_initatives = data.get('market_initatives')
            advantage_and_oppurtunity = data.get('advantage_and_oppurtunity')
            valuation = data.get('valuation')
            owner_name =  data.get('owner_name')
            phone =  data.get('phone')
            telephone =  data.get('telephone')
            email =  data.get('email')
            company =  data.get('company')
            public_order =  data.get('public_order')
            avaiable_attachment =  data.get('avaiable_attachment')
            location =  data.get('location')
            latitude =  data.get('latitude')
            longitude =  data.get('longitude')
            agency_id =  data.get('agency_id')
            turnover =  data.get('turnover')
            country =  data.get('country')
            state =  data.get('state')
            city =  data.get('city')
            postal_code =  data.get('postal_code')
            landmark =  data.get('landmark')
            floor =  data.get('floor')
            shareholder_name =  data.get('shareholder_name')
            shareholder_share =  data.get('shareholder_share')
            shareholder_description =  data.get('shareholder_description')
            videos_thumbnail =  data.get('videos_thumbnail')

   

   
            # if agency_id:
            # 	agency_obj = Customer.objects.filter(id=agency_id).first()
            # else:
            # 	agency_obj = None

            if not short_title:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'short_title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image_data:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'image_data  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not videos:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'videos is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not total_turnover:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'total_turnover is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rent:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rent hours is required'},status=status.HTTP_400_BAD_REQUEST)
            if not established_year:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'established_year is required'},status=status.HTTP_400_BAD_REQUEST)
            if not premises:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'years_of_work  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not years_of_work:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'operation_concept is required'},status=status.HTTP_400_BAD_REQUEST)
            if not operation_concept:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'reason_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not operation_opening_hours:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'operation_opening_hours  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not turnover_last_year:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'turnover_last_year is required'},status=status.HTTP_400_BAD_REQUEST)
            if not salary_percentage:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'salary_percentage is required'},status=status.HTTP_400_BAD_REQUEST)
            if not other_operating_cost:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'other_operating_cost is required'},status=status.HTTP_400_BAD_REQUEST)
            if not operation_concept:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'operation_concept is required'},status=status.HTTP_400_BAD_REQUEST)
            if not cost:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'cost is required'},status=status.HTTP_400_BAD_REQUEST)
            if not reason_for_sale:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'reason_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not website_link:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'website_link is required'},status=status.HTTP_400_BAD_REQUEST)
            if not number_of_employes:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'number_of_employes is required'},status=status.HTTP_400_BAD_REQUEST)
            if not area:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'area is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rent:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not term_of_lease:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'term_of_lease is required'},status=status.HTTP_400_BAD_REQUEST)
            if not details:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'details is required'},status=status.HTTP_400_BAD_REQUEST)
            if not service:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'service is required'},status=status.HTTP_400_BAD_REQUEST)
            if not operations:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'operations is required'},status=status.HTTP_400_BAD_REQUEST)
            if not market_initatives:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'market_initatives is required'},status=status.HTTP_400_BAD_REQUEST)
            if not advantage_and_oppurtunity:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'advantage_and_oppurtunity is required'},status=status.HTTP_400_BAD_REQUEST)
            if not valuation:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'valuation is required'},status=status.HTTP_400_BAD_REQUEST)
            if not owner_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'owner_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'phone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not telephone:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'telephone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company is required'},status=status.HTTP_400_BAD_REQUEST)
            if not public_order:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'public_order is required'},status=status.HTTP_400_BAD_REQUEST)
            if not avaiable_attachment:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'avaiable_attachment is required'},status=status.HTTP_400_BAD_REQUEST)
            if not country:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'country is required'},status=status.HTTP_400_BAD_REQUEST)
            if not state:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'state is required'},status=status.HTTP_400_BAD_REQUEST)
            if not city:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'city is required'},status=status.HTTP_400_BAD_REQUEST)
            if not postal_code:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'postal_code is required'},status=status.HTTP_400_BAD_REQUEST)
            if not videos_thumbnail:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'videos_thumbnail is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not landmark:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'landmark is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not floor:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'floor is required'},status=status.HTTP_400_BAD_REQUEST)

            
            bussine_sale = BussinessForSale.objects.create(
                    customerId=customerObj,
                    short_title=short_title,
                    image_data=image_data,
                    videos=videos,
                    videos_thumbnail=videos_thumbnail,
                    company_name=company_name,
                    description=description,
                    total_turnover=total_turnover,
                    rent=rent,
                    established_year=established_year,
                    premises=premises,
                    years_of_work=years_of_work,
                    operation_concept=operation_concept,
                    operation_opening_hours=operation_opening_hours,
                    turnover_last_year=turnover_last_year,
                    salary_percentage=salary_percentage,
                    other_operating_cost=other_operating_cost,
                    cost=cost,
                    reason_for_sale=reason_for_sale,
                    website_link=website_link,
                    number_of_employes=number_of_employes,
                    area=area,
                    term_of_lease=term_of_lease,
                    document=document,
                    details=details,
                    service=service,
                    operations=operations,
                    market_initatives=market_initatives,
                    advantage_and_oppurtunity=advantage_and_oppurtunity,
                    valuation=valuation,
                    owner_name=owner_name,
                    phone=phone,
                    telephone=telephone,
                    email=email,
                    company=company,
                    public_order=public_order,
                    avaiable_attachment=avaiable_attachment,
                    location=location,
                    latitude=latitude,
                    longitude=longitude,
                    start_date=datetime.now(),
                    subscription_type=subscription_tyre,
                    turnover=turnover,
                    country=country,
                    state=state,
                    city=city,
                    postal_code=postal_code,
                    landmark=landmark,
                    floor=floor,
                    shareholder_name=shareholder_name,
                    shareholder_share=shareholder_share,
                    shareholder_description=shareholder_description,
                    # agency=agency_obj,  # Uncomment this if you want to add agency
                )
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':bussine_sale.id,
            }
            AdminNotifications.objects.create(message= 'A new bussiness for sale has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=True,notification_type='bussiness_sale')
            return Response({'status_code':status.HTTP_200_OK,'message':'A new bussiness for sale has been Added successfully','data':allData},status=status.HTTP_200_OK)
        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 editBussinessForSale(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0
            property_id = data.get('property_id')
            if not property_id:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)

            businessSale = BussinessForSale.objects.filter(id=property_id).first()
            short_title = data.get('short_title')
            image_data = data.get('image_data')
            videos = data.get('videos')
            videos_thumbnail = data.get('videos_thumbnail')
            company_name = data.get('company_name')
            description = data.get('description')
            total_turnover = data.get('total_turnover')
            rent = data.get('rent')
            established_year= data.get('established_year')
            premises= data.get('premises')
            years_of_work = data.get('years_of_work')
            operation_concept= data.get('operation_concept')
            operation_opening_hours= data.get('operation_opening_hours')
            turnover_last_year= data.get('turnover_last_year')
            salary_percentage= data.get('salary_percentage')
            other_operating_cost = data.get('other_operating_cost')
            cost = data.get('cost')
            reason_for_sale = data.get('reason_for_sale')
            website_link= data.get('website_link')
            number_of_employes =data.get('number_of_employes')
            area =data.get('area')
            rent =data.get('rent')
            term_of_lease =data.get('term_of_lease')
            document =data.get('document')
            details= data.get('details')
            service = data.get('service')
            operations = data.get('operations')
            market_initatives = data.get('market_initatives')
            advantage_and_oppurtunity = data.get('advantage_and_oppurtunity')
            valuation = data.get('valuation')
            owner_name =  data.get('owner_name')
            phone =  data.get('phone')
            telephone =  data.get('telephone')
            email =  data.get('email')
            company =  data.get('company')
            public_order =  data.get('public_order')
            avaiable_attachment =  data.get('avaiable_attachment')
            location =  data.get('location')
            latitude =  data.get('latitude')
            longitude =  data.get('longitude')
            agency_id =  data.get('agency_id')
            shareholder_name =  data.get('shareholder_name')
            shareholder_share =  data.get('shareholder_share')
            shareholder_description =  data.get('shareholder_description')
   
            if not short_title:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'short_title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image_data:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'image_data  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not videos:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'videos is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rent:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rent hours is required'},status=status.HTTP_400_BAD_REQUEST)
            if not established_year:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'established_year is required'},status=status.HTTP_400_BAD_REQUEST)
            if not premises:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'years_of_work  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not years_of_work:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'operation_concept is required'},status=status.HTTP_400_BAD_REQUEST)
            if not operation_concept:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'reason_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not operation_opening_hours:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'operation_opening_hours  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not turnover_last_year:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'turnover_last_year is required'},status=status.HTTP_400_BAD_REQUEST)
            if not salary_percentage:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'salary_percentage is required'},status=status.HTTP_400_BAD_REQUEST)
            if not other_operating_cost:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'other_operating_cost is required'},status=status.HTTP_400_BAD_REQUEST)
            if not operation_concept:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'operation_concept is required'},status=status.HTTP_400_BAD_REQUEST)
            if not cost:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'cost is required'},status=status.HTTP_400_BAD_REQUEST)
            if not reason_for_sale:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'reason_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not website_link:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'website_link is required'},status=status.HTTP_400_BAD_REQUEST)
            if not number_of_employes:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'number_of_employes is required'},status=status.HTTP_400_BAD_REQUEST)
            if not area:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'area is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rent:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not term_of_lease:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'term_of_lease is required'},status=status.HTTP_400_BAD_REQUEST)
            if not details:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'details is required'},status=status.HTTP_400_BAD_REQUEST)
            if not service:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'service is required'},status=status.HTTP_400_BAD_REQUEST)
            if not operations:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'operations is required'},status=status.HTTP_400_BAD_REQUEST)
            if not market_initatives:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'market_initatives is required'},status=status.HTTP_400_BAD_REQUEST)
            if not advantage_and_oppurtunity:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'advantage_and_oppurtunity is required'},status=status.HTTP_400_BAD_REQUEST)
            if not valuation:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'valuation is required'},status=status.HTTP_400_BAD_REQUEST)
            if not owner_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'owner_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'telephone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not telephone:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'owner_mobile_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'company is required'},status=status.HTTP_400_BAD_REQUEST)
            if not public_order:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'public_order is required'},status=status.HTTP_400_BAD_REQUEST)
            if not avaiable_attachment:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'avaiable_attachment is required'},status=status.HTTP_400_BAD_REQUEST)


            businessSale.short_title = short_title
            businessSale.image_data = image_data
            businessSale.videos = videos
            businessSale.videos_thumbnail = videos_thumbnail
            businessSale.company_name = company_name
            businessSale.description = description
            businessSale.total_turnover = total_turnover
            businessSale.rent = rent
            businessSale.established_year = established_year
            businessSale.premises = premises
            businessSale.years_of_work = years_of_work
            businessSale.operation_concept = operation_concept
            businessSale.operation_opening_hours = operation_opening_hours
            businessSale.turnover_last_year = turnover_last_year
            businessSale.salary_percentage = salary_percentage
            businessSale.other_operating_cost = other_operating_cost
            businessSale.cost = cost
            businessSale.reason_for_sale = reason_for_sale
            businessSale.website_link = website_link
            businessSale.number_of_employes = number_of_employes
            businessSale.area = area
            businessSale.rent = rent
            businessSale.term_of_lease = term_of_lease
            businessSale.document = document
            businessSale.details = details
            businessSale.service = service
            businessSale.operations = operations
            businessSale.market_initatives = market_initatives
            businessSale.advantage_and_oppurtunity = advantage_and_oppurtunity
            businessSale.valuation = valuation
            businessSale.owner_name = owner_name
            businessSale.phone = phone
            businessSale.telephone = telephone
            businessSale.email = email
            businessSale.company = company
            businessSale.public_order = public_order
            businessSale.avaiable_attachment = avaiable_attachment
            businessSale.location = location
            businessSale.latitude = latitude
            businessSale.longitude = longitude
            businessSale.latitude = latitude
            businessSale.longitude = longitude
            businessSale.start_date = datetime.now()			
            businessSale.subscription_type = subscription_tyre
            businessSale.status = 0
            businessSale.shareholder_name = shareholder_name
            businessSale.shareholder_share = shareholder_share
            businessSale.shareholder_description = shareholder_description

            businessSale.save()
            return Response({'status_code':status.HTTP_200_OK,'message':'Business for sale edited successfully'},status=status.HTTP_200_OK)
        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 myBussinessForsale(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            page = self.request.query_params.get('page')
            if not page:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            page_per_data = self.request.query_params.get('page_per_data')
            if not page_per_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            
            sale_obj =  BussinessForSale.objects.filter(customerId=customerObj)
            total_count = BussinessForSale.objects.all().count()
            paginator = Paginator(sale_obj, page_per_data)
            try:
                sale_obj = paginator.page(page)
            except PageNotAnInteger:
                sale_obj = paginator.page(1)
            except EmptyPage:
                sale_obj = paginator.page(paginator.num_pages)
            
   
            allData = []
            for sale in sale_obj:
                if sale.status == 0:
                    status_info = "Pending"
                elif sale.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                alldata={
                    'id':sale.id,
                    'customer_id':sale.customerId.id,
                    'customer_name':sale.customerId.firstName +' '+ sale.customerId.lastName,
                    'owner_name':sale.owner_name,
                    'owner_mobile_number':sale.owner_mobile_number,
                    'owner_email':sale.owner_email,
                    'short_title':sale.short_title,
                    'established_year':sale.established_year,
                    'total_turnover':sale.total_turnover,
                    'description':sale.description,
                    'location':sale.location,
                    'status':status_info,
                }
                allData.append(alldata)

                return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(sale_obj),'total':total_count})
        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 bussinessForSaleDetail(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            bussiness_id = self.request.query_params.get('id')
            if not bussiness_id:
                return Response({'message':'Bussiness sale Id is required'},status=status.HTTP_400_BAD_REQUEST)
            bussiness_obj = BussinessForSale.objects.filter(id=bussiness_id,customerId=customerObj).first()
            if not bussiness_obj:
                return Response({'message':'No bussiness sale found'},status=status.HTTP_400_BAD_REQUEST)
            if bussiness_obj.status == 0:
                status_info = "Pending"
            elif bussiness_obj.status == 1:
                status_info = "Approved"
            else:
                status_info = "Disapproved"
            alldata = {
                'id': bussiness_obj.id,
                'customer_name' : bussiness_obj.customerId.firstName +' '+ bussiness_obj.customerId.lastName,
                'company_name': bussiness_obj.company_name,
                'short_title': bussiness_obj.short_title,
                'image_data': ast.literal_eval(bussiness_obj.image_data),
                'videos': bussiness_obj.videos,
                'videos_thumbnail': bussiness_obj.videos_thumbnail,
                'company_name': bussiness_obj.company_name,
                'description': bussiness_obj.description,
                'total_turnover': bussiness_obj.total_turnover,
                'rent': bussiness_obj.rent,
                'established_year': bussiness_obj.established_year,
                'premises': bussiness_obj.premises,
                'years_of_work': bussiness_obj.years_of_work,
                'operation_concept': bussiness_obj.operation_concept,
                'operation_opening_hours': bussiness_obj.operation_opening_hours,
                'turnover_last_year': bussiness_obj.turnover_last_year,
                'salary_percentage': bussiness_obj.salary_percentage,
                'other_operating_cost': bussiness_obj.other_operating_cost,
                'cost': bussiness_obj.cost,
                'reason_for_sale':bussiness_obj.reason_for_sale,
                'website_link':bussiness_obj.website_link,
                'number_of_employes':bussiness_obj.number_of_employes,
                'other_operating_cost':bussiness_obj.other_operating_cost,
                'area':bussiness_obj.area,
                'term_of_lease': bussiness_obj.term_of_lease,
                'document':ast.literal_eval(bussiness_obj.document), 
                'details': bussiness_obj.details,
                'service':bussiness_obj.service,
                'operations':bussiness_obj.operations,
                'market_initatives':bussiness_obj.market_initatives,
                'advantage_and_oppurtunity':bussiness_obj.advantage_and_oppurtunity,
                'valuation':bussiness_obj.valuation,
                'owner_name':bussiness_obj.owner_name,
                'phone':bussiness_obj.phone,
                'telephone':bussiness_obj.telephone,
                'email':bussiness_obj.email,
                'company':bussiness_obj.company,
                'public_order':bussiness_obj.public_order,
                'avaiable_attachment':bussiness_obj.avaiable_attachment,
                'location':bussiness_obj.location,
                'latitude':bussiness_obj.latitude,
                'longitude':bussiness_obj.longitude,    
                'is_draft': bussiness_obj.is_draft,
                'status':status_info,
                'turnover':bussiness_obj.turnover,
                'country':bussiness_obj.country,
                'state':bussiness_obj.state,
                'city':bussiness_obj.city,
                'postal_code':bussiness_obj.postal_code,
                'landmark':bussiness_obj.landmark,
                'floor':bussiness_obj.floor,

            }
            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)
        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 houseWantedForRent(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0

            if subscription_tyre != 3:    
                if customerObj.can_add_property_count==0:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)
            
   
            short_title = data.get('short_title')
            profile_visiblity = data.get('profile_visiblity')
            profile_hidden = data.get('profile_hidden')
            image = data.get('image')
            first_name = data.get('first_name')
            last_name = data.get('last_name')
            gender = data.get('gender')
            dob = data.get('dob')
            nationality = data.get('nationality')
            phone_number = data.get('phone_number')
            email = data.get('email')
            quantity = data.get('quantity')
            rental_period = data.get('rental_period')
            max_rent = data.get('max_rent')
            from_date = data.get('from_date')
            housing_type = data.get('housing_type')
            number_of_people = data.get('number_of_people')
            max_month_price = data.get('max_month_price')
            desired_start_date = data.get('desired_start_date')
            desired_area = data.get('desired_area')
   
            country = data.get('country')
            state = data.get('state')
            city = data.get('city')
            postal_code = data.get('postal_code')
            landmark = data.get('landmark')
            floor = data.get('floor')
            description = data.get('description')
   
   
   
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            location = data.get('location')
            about = data.get('about')
            education = data.get('education')
            martial_status = data.get('martial_status')
            cleanliness = data.get('cleanliness')
            party_habits = data.get('party_habits')
            work = data.get('work')
            interest = data.get('interest')
            is_draft = data.get('is_draft')
   


            if not image:return Response({'message':'image is required'},status=status.HTTP_400_BAD_REQUEST)
            if not first_name:return Response({'message':'first_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not last_name:return Response({'message':'last_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not gender:return Response({'message':'gender is required'},status=status.HTTP_400_BAD_REQUEST)
            if not dob:return Response({'message':'dob is required'},status=status.HTTP_400_BAD_REQUEST)
            if not nationality:return Response({'message':'nationality is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone_number:return Response({'message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:return Response({'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rental_period:return Response({'message':'rental_period is required'},status=status.HTTP_400_BAD_REQUEST)
            if not housing_type:return Response({'message':'housing_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not number_of_people:return Response({'message':'number_of_people is required'},status=status.HTTP_400_BAD_REQUEST)
            if not max_month_price:return Response({'message':'max_month_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location:return Response({'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not education:return Response({'message':'education is required'},status=status.HTTP_400_BAD_REQUEST)
            if not martial_status:return Response({'message':'martial_status is required'},status=status.HTTP_400_BAD_REQUEST)
            if not cleanliness:return Response({'message':'cleanliness is required'},status=status.HTTP_400_BAD_REQUEST)
            if not party_habits:return Response({'message':'party_habits is required'},status=status.HTTP_400_BAD_REQUEST)
            if not work:return Response({'message':'work is required'},status=status.HTTP_400_BAD_REQUEST)
            if not interest:return Response({'message':'interest is required'},status=status.HTTP_400_BAD_REQUEST)
   


            house_rent = HouseWantedForRent.objects.create(customerId=customerObj)
            house_rent.short_title = short_title
            house_rent.profile_visiblity = profile_visiblity
            house_rent.profile_hidden = profile_hidden
            house_rent.image = image
            house_rent.first_name = first_name
            house_rent.last_name = last_name
            house_rent.gender = gender
            house_rent.dob = dob
            house_rent.nationality = nationality
            house_rent.phone_number = phone_number
            house_rent.email = email
            house_rent.quantity = quantity
            house_rent.rental_period = rental_period
            house_rent.max_rent = max_rent
            house_rent.from_date = from_date
            house_rent.housing_type = housing_type
            house_rent.number_of_people = number_of_people
            house_rent.max_month_price = max_month_price
            house_rent.desired_start_date = desired_start_date
            house_rent.desired_area = desired_area
            house_rent.about = about
            house_rent.education = education
            house_rent.martial_status = martial_status
            house_rent.cleanliness = cleanliness
            house_rent.party_habits = party_habits
            house_rent.work = work
            house_rent.interest = interest
            house_rent.subscription_type = subscription_tyre
   
            house_rent.country = country
            house_rent.state = state
            house_rent.city = city
            house_rent.postal_code = postal_code
            house_rent.landmark = landmark
            house_rent.floor = floor
            house_rent.description = description
   
            house_rent.latitude = latitude
            house_rent.longitude = longitude
            house_rent.location = location
            house_rent.is_draft = is_draft
            house_rent.save()
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':house_rent.id,
            }
            AdminNotifications.objects.create(message= 'A new house wanted for rent has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=True,notification_type='house_rent')
            return Response({'status_code':status.HTTP_200_OK,'message':'Added successfully','data':allData},status=status.HTTP_200_OK)

        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 edithouseWantedForRent(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0
            property_id = data.get('property_id')
            if not property_id:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)
            house_rent = HouseWantedForRent.objects.filter(id=property_id).first()
           
            short_title = data.get('short_title')
            profile_visiblity = data.get('profile_visiblity')
            profile_hidden = data.get('profile_hidden')
            image = data.get('image')
            first_name = data.get('first_name')
            last_name = data.get('last_name')
            gender = data.get('gender')
            dob = data.get('dob')
            nationality = data.get('nationality')
            phone_number = data.get('phone_number')
            email = data.get('email')
            quantity = data.get('quantity')
            rental_period = data.get('rental_period')
            max_rent = data.get('max_rent')
            from_date = data.get('from_date')
            housing_type = data.get('housing_type')
            number_of_people = data.get('number_of_people')
            max_month_price = data.get('max_month_price')
            desired_start_date = data.get('desired_start_date')
            desired_area = data.get('desired_area')
   
   
   
            country = data.get('country')
            state = data.get('state')
            city = data.get('city')
            postal_code = data.get('postal_code')
            landmark = data.get('landmark')
            floor = data.get('floor')
            description = data.get('description')
   
   
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            location = data.get('location')
            about = data.get('about')
            education = data.get('education')
            martial_status = data.get('martial_status')
            cleanliness = data.get('cleanliness')
            party_habits = data.get('party_habits')
            work = data.get('work')
            interest = data.get('interest')
            is_draft = data.get('is_draft')
   


            if not short_title:return Response({'message':'short_title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image:return Response({'message':'image is required'},status=status.HTTP_400_BAD_REQUEST)
            if not first_name:return Response({'message':'first_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not last_name:return Response({'message':'last_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not gender:return Response({'message':'gender is required'},status=status.HTTP_400_BAD_REQUEST)
            if not dob:return Response({'message':'dob is required'},status=status.HTTP_400_BAD_REQUEST)
            if not nationality:return Response({'message':'nationality is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone_number:return Response({'message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:return Response({'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rental_period:return Response({'message':'rental_period is required'},status=status.HTTP_400_BAD_REQUEST)
            if not housing_type:return Response({'message':'housing_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not number_of_people:return Response({'message':'number_of_people is required'},status=status.HTTP_400_BAD_REQUEST)
            if not max_month_price:return Response({'message':'max_month_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not desired_start_date:return Response({'message':'desired_start_date is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location:return Response({'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not education:return Response({'message':'education is required'},status=status.HTTP_400_BAD_REQUEST)
            if not martial_status:return Response({'message':'martial_status is required'},status=status.HTTP_400_BAD_REQUEST)
            if not cleanliness:return Response({'message':'cleanliness is required'},status=status.HTTP_400_BAD_REQUEST)
            if not party_habits:return Response({'message':'party_habits is required'},status=status.HTTP_400_BAD_REQUEST)
            if not work:return Response({'message':'work is required'},status=status.HTTP_400_BAD_REQUEST)
            if not interest:return Response({'message':'interest is required'},status=status.HTTP_400_BAD_REQUEST)
   

            house_rent.short_title = short_title
            house_rent.profile_visiblity = profile_visiblity
            house_rent.profile_hidden = profile_hidden
            house_rent.image = image
            house_rent.first_name = first_name
            house_rent.last_name = last_name
            house_rent.gender = gender
            house_rent.dob = dob
            house_rent.nationality = nationality
            house_rent.phone_number = phone_number
            house_rent.email = email
            house_rent.quantity = quantity
            house_rent.rental_period = rental_period
            house_rent.max_rent = max_rent
            house_rent.from_date = from_date
            house_rent.housing_type = housing_type
            house_rent.number_of_people = number_of_people
            house_rent.max_month_price = max_month_price
            house_rent.desired_start_date = desired_start_date
            house_rent.desired_area = desired_area
            house_rent.about = about
            house_rent.education = education
            house_rent.martial_status = martial_status
            house_rent.cleanliness = cleanliness
            house_rent.party_habits = party_habits
            house_rent.work = work
            house_rent.interest = interest
            house_rent.subscription_type = subscription_tyre
            house_rent.latitude = latitude
            house_rent.longitude = longitude
            house_rent.location = location
            house_rent.is_draft = is_draft
            house_rent.country = country
            house_rent.state = state
            house_rent.city = city
            house_rent.postal_code = postal_code
            house_rent.landmark = landmark
            house_rent.floor = floor
            house_rent.description = description
            house_rent.status = 0

            house_rent.save()
            return Response({'status_code':status.HTTP_200_OK,'message':'Updated successfully'},status=status.HTTP_200_OK)
        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 myHouseWantedForRent(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            page = self.request.query_params.get('page')
            if not page:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            page_per_data = self.request.query_params.get('page_per_data')
            if not page_per_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            # if customerObj.can_add_property_count==0:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)
            rent_obj =  HouseWantedForRent.objects.filter(customerId=customerObj)
            total_count = HouseWantedForRent.objects.filter(customerId=customerObj).count()
            paginator = Paginator(rent_obj, page_per_data)
            try:
                rent_obj = paginator.page(page)
            except PageNotAnInteger:
                rent_obj = paginator.page(1)
            except EmptyPage:
                rent_obj = paginator.page(paginator.num_pages)
            allData = []
            for rent in rent_obj:
                if rent.status == 0:
                    status_info = "Pending"
                elif rent.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                alldata = {
                    'id': rent.id,
                    'short_title':rent.short_title,
                    'customer_id':rent.customerId.id,
                    'fullname': rent.first_name+' '+ rent.last_name,
                    'phone_number':rent.phone_number,
                    'max_month_price':rent.max_month_price,
                    'rental_period':rent.rental_period,
                    'number_of_people':rent.number_of_people,
                    'desired_start_date':rent.desired_start_date,
                    'location':rent.location,
                    'created_date':rent.start_date,
                    'status':status_info,
                }
                allData.append(alldata)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(rent_obj),'total':total_count})
        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 myHouseWantedForRentDetails(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            rent_id = self.request.query_params.get('id')
            if not rent_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Rent sale Id is required'},status=status.HTTP_400_BAD_REQUEST)
            rent_obj = HouseWantedForRent.objects.filter(id=rent_id,customerId=customerObj).first()
            if not rent_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No house for rent found'},status=status.HTTP_400_BAD_REQUEST)
            if rent_obj.status == 0:
                status_info = "Pending"
            elif rent_obj.status == 1:
                status_info = "Approved"
            else:
                status_info = "Disapproved"
   
            alldata = {
                'id': rent_obj.id,
                'short_title':rent_obj.short_title,
                'customer_id':rent_obj.customerId.id,
                'fullname': rent_obj.first_name+' '+ rent_obj.last_name,
                
                'profile_visiblity':rent_obj.profile_visiblity,
                'profile_hidden':rent_obj.profile_hidden,
                'image': ast.literal_eval(rent_obj.image),
                'first_name': rent_obj.first_name,
                'last_name': rent_obj.last_name,
                'gender': rent_obj.gender,
                'dob': rent_obj.dob,
                'nationality': rent_obj.nationality,
                'phone_number':rent_obj.phone_number,
                'email': rent_obj.email,
                'quantity': rent_obj.quantity,
                'rental_period': rent_obj.rental_period,
                'max_rent': rent_obj.max_rent,
                'from_date': rent_obj.from_date,
                'housing_type':rent_obj.housing_type,
                'number_of_people':rent_obj.number_of_people,
                'max_month_price': rent_obj.max_month_price,
                'desired_start_date':rent_obj.desired_start_date,
                'desired_area': rent_obj.desired_area,
                'latitude':rent_obj.latitude,
                'longitude':rent_obj.longitude,
                'location':rent_obj.location,
                'about':rent_obj.about,
                'education':rent_obj.education,
                'martial_status':rent_obj.martial_status,
                'cleanliness':rent_obj.cleanliness,
                'party_habits':rent_obj.party_habits,
                'work':rent_obj.work,
                'interest':rent_obj.interest,
                'subscription_type':rent_obj.subscription_type,
                'is_draft':rent_obj.is_draft,
                'work':rent_obj.work,
                'country':rent_obj.country,
                'state':rent_obj.state,
                'city':rent_obj.city,
                'postal_code':rent_obj.postal_code,
                'landmark':rent_obj.landmark,
                'floor':rent_obj.floor,
                'description':rent_obj.description,

    
    
                'status':status_info,



            }
            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)

        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 investmentMyProject(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0

            if subscription_tyre != 3:  
                if customerObj.can_add_property_count==0:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)
            property_name = data.get('property_name') 
            image_data = data.get('image_data')
            videos = data.get('videos')
            documents_data = data.get('documents_data')
            property_type = data.get('property_type')
            assest_equality = data.get('assest_equality')
            investment_highlight = data.get('investment_highlight')
            equity_price = data.get('equity_price')
            lp_equity_percent = data.get('lp_equity_percent')
            gp_equity_percent = data.get('gp_equity_percent')
            debt_percent = data.get('debt_percent')
            property_at_glance_title = data.get('property_at_glance_title')
            description = data.get('description')
            bussiness_plan = data.get('bussiness_plan')
            minimum_investment = data.get('minimum_investment')
            investment_strategy = data.get('investment_strategy')
            expected_attitude_price = data.get('expected_attitude_price')
            financed = data.get('financed')
            target_return_on_cost = data.get('target_return_on_cost')
            target_irr = data.get('target_irr')
            lp_equity_percent = data.get('lp_equity_percent')
            offered_by = data.get('offered_by')
            estimated_first_distribution = data.get('estimated_first_distribution')
            type_of_investment = data.get('type_of_investment')
            phone_number = data.get('phone_number')
            measure_for_multiplier = data.get('measure_for_multiplier')
            address = data.get('address')
            location_details = data.get('location_details')
            location = data.get('location')
            longitude = data.get('longitude')
            latitude = data.get('latitude')
            is_draft = data.get('is_draft')
            agency_id =  data.get('agency_id')
   
            minimal_goal =  data.get('minimal_goal')
            nominal_share_price =  data.get('nominal_share_price')
            the_valuation =  data.get('the_valuation')
            minimum_drawing =  data.get('minimum_drawing')
            no_of_drawing =  data.get('no_of_drawing')
            share_for_sale =  data.get('share_for_sale')
            remaining_share =  data.get('remaining_share')
            maximum_drawing =  data.get('maximum_drawing')
            short_description =  data.get('short_description')
            why_invest =  data.get('why_invest')
            problem_to_solved =  data.get('problem_to_solved')
            our_solution =  data.get('our_solution')
            issue_info_start_date =  data.get('issue_info_start_date')
            issue_info_end_date =  data.get('issue_info_end_date')
            number_of_share =  data.get('number_of_share')
            price_of_share =  data.get('price_of_share')
            minimum_investment =  data.get('minimum_investment')
            maximum_investment =  data.get('maximum_investment')
            raised_capital_minimum =  data.get('raised_capital_minimum')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
            agency_id =  data.get('agency_id')
   
   
    
            if agency_id:
                agency_obj =Customer.objects.filter(id=agency_id).first()
            else:
                agency_obj = None


            if not property_name:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image_data:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'image_data is required'},status=status.HTTP_400_BAD_REQUEST)
            if not videos:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'videos is required'},status=status.HTTP_400_BAD_REQUEST)
            if not documents_data:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'documents_data is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_type:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not assest_equality:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'assest_equality is required'},status=status.HTTP_400_BAD_REQUEST)
            if not investment_highlight:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'investment_highlight is required'},status=status.HTTP_400_BAD_REQUEST)
            if not equity_price:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'equity_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not lp_equity_percent:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'lp_equity_percent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not gp_equity_percent:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'gp_equity_percent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not debt_percent:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'debt_percent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_at_glance_title:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_at_glance_title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bussiness_plan:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'bussiness_plan is required'},status=status.HTTP_400_BAD_REQUEST)
            if not minimum_investment:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'minimum_investment is required'},status=status.HTTP_400_BAD_REQUEST)
            if not investment_strategy:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'investment_strategy is required'},status=status.HTTP_400_BAD_REQUEST)
            if not expected_attitude_price:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'expected_attitude_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not financed:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'financed is required'},status=status.HTTP_400_BAD_REQUEST)
            if not target_return_on_cost:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'target_return_on_cost is required'},status=status.HTTP_400_BAD_REQUEST)
            if not target_irr:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'target_irr is required'},status=status.HTTP_400_BAD_REQUEST)
            if not lp_equity_percent:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'lp_equity_percent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not offered_by:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'offered_by is required'},status=status.HTTP_400_BAD_REQUEST)
            if not estimated_first_distribution:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'estimated_first_distribution is required'},status=status.HTTP_400_BAD_REQUEST)
            if not type_of_investment:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'type_of_investment is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone_number:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not measure_for_multiplier:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'measure_for_multiplier is required'},status=status.HTTP_400_BAD_REQUEST)
            if not address:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'address is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_summary:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_summary is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_detail:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_detail is required'},status=status.HTTP_400_BAD_REQUEST)
            if not overview:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'overview is required'},status=status.HTTP_400_BAD_REQUEST)
            if not debt_assumption:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'debt_assumption is required'},status=status.HTTP_400_BAD_REQUEST)
            if not financial_debt_assumption:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'financial_debt_assumption is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location_details:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'location_details is required'},status=status.HTTP_400_BAD_REQUEST)
            if not longitude:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not latitude:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)

            project_obj = InvestmentMyProject.objects.create(customerId=customerObj)
            project_obj.property_name = property_name
            project_obj.image_data = image_data
            project_obj.videos = videos
            project_obj.documents_data = documents_data
            project_obj.property_type = property_type
            project_obj.assest_equality = assest_equality
            project_obj.investment_highlight = investment_highlight
            project_obj.equity_price = equity_price
            project_obj.lp_equity_percent = lp_equity_percent
            project_obj.gp_equity_percent = gp_equity_percent
            project_obj.debt_percent = debt_percent
            project_obj.property_at_glance_title = property_at_glance_title
            project_obj.description = description
            project_obj.bussiness_plan = bussiness_plan
            project_obj.minimum_investment = minimum_investment
            project_obj.investment_strategy = investment_strategy
            project_obj.expected_attitude_price = expected_attitude_price
            project_obj.financed = financed
            project_obj.target_return_on_cost = target_return_on_cost
            project_obj.target_irr = target_irr
            project_obj.lp_equity_percent = lp_equity_percent
            project_obj.offered_by = offered_by
            project_obj.estimated_first_distribution = estimated_first_distribution
            project_obj.type_of_investment = type_of_investment
            project_obj.phone_number = phone_number
            project_obj.measure_for_multiplier = measure_for_multiplier
            project_obj.address = address
            project_obj.location_details = location_details
            project_obj.property_summary = property_summary
            project_obj.property_detail = property_detail
            project_obj.overview = overview
            project_obj.debt_assumption = debt_assumption
            project_obj.financial_debt_assumption = financial_debt_assumption
            project_obj.location = location
            project_obj.longitude = longitude
            project_obj.latitude = latitude
            project_obj.is_draft = is_draft
            project_obj.start_date = datetime.now()
            project_obj.agency = agency_obj
            project_obj.subscription_type = subscription_tyre
            project_obj.save()
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':project_obj.id,
            }
            AdminNotifications.objects.create(message= 'A new investment for project has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=True,notification_type='investment_project')
            return Response({'status':status.HTTP_200_OK,'message':'Added successfully','data':allData},status=status.HTTP_200_OK)


        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 editInvestmentMyProject(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0
            property_id = data.get('property_id')
            if not property_id:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)

            project_obj = InvestmentMyProject.objects.filter(id=property_id).first()
            property_name = data.get('property_name') 
            image_data = data.get('image_data')
            videos = data.get('videos')
            documents_data = data.get('documents_data')
            property_type = data.get('property_type')
            assest_equality = data.get('assest_equality')
            investment_highlight = data.get('investment_highlight')
            equity_price = data.get('equity_price')
            lp_equity_percent = data.get('lp_equity_percent')
            gp_equity_percent = data.get('gp_equity_percent')
            debt_percent = data.get('debt_percent')
            property_at_glance_title = data.get('property_at_glance_title')
            description = data.get('description')
            bussiness_plan = data.get('bussiness_plan')
            minimum_investment = data.get('minimum_investment')
            investment_strategy = data.get('investment_strategy')
            expected_attitude_price = data.get('expected_attitude_price')
            financed = data.get('financed')
            target_return_on_cost = data.get('target_return_on_cost')
            target_irr = data.get('target_irr')
            lp_equity_percent = data.get('lp_equity_percent')
            offered_by = data.get('offered_by')
            estimated_first_distribution = data.get('estimated_first_distribution')
            type_of_investment = data.get('type_of_investment')
            phone_number = data.get('phone_number')
            measure_for_multiplier = data.get('measure_for_multiplier')
            address = data.get('address')
            location_details = data.get('location_details')
            property_summary = data.get('property_summary')
            property_detail = data.get('property_detail')
            overview = data.get('overview')
            debt_assumption = data.get('debt_assumption')
            financial_debt_assumption = data.get('financial_debt_assumption')
            location = data.get('location')
            longitude = data.get('longitude')
            latitude = data.get('latitude')
            is_draft = data.get('is_draft')


            if not property_name:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image_data:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'image_data is required'},status=status.HTTP_400_BAD_REQUEST)
            if not videos:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'videos is required'},status=status.HTTP_400_BAD_REQUEST)
            if not documents_data:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'documents_data is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_type:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not assest_equality:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'assest_equality is required'},status=status.HTTP_400_BAD_REQUEST)
            if not investment_highlight:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'investment_highlight is required'},status=status.HTTP_400_BAD_REQUEST)
            if not equity_price:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'equity_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not lp_equity_percent:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'lp_equity_percent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not gp_equity_percent:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'gp_equity_percent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not debt_percent:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'debt_percent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_at_glance_title:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_at_glance_title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bussiness_plan:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'bussiness_plan is required'},status=status.HTTP_400_BAD_REQUEST)
            if not minimum_investment:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'minimum_investment is required'},status=status.HTTP_400_BAD_REQUEST)
            if not investment_strategy:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'investment_strategy is required'},status=status.HTTP_400_BAD_REQUEST)
            if not expected_attitude_price:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'expected_attitude_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not financed:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'financed is required'},status=status.HTTP_400_BAD_REQUEST)
            if not target_return_on_cost:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'target_return_on_cost is required'},status=status.HTTP_400_BAD_REQUEST)
            if not target_irr:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'target_irr is required'},status=status.HTTP_400_BAD_REQUEST)
            if not lp_equity_percent:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'lp_equity_percent is required'},status=status.HTTP_400_BAD_REQUEST)
            if not offered_by:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'offered_by is required'},status=status.HTTP_400_BAD_REQUEST)
            if not estimated_first_distribution:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'estimated_first_distribution is required'},status=status.HTTP_400_BAD_REQUEST)
            if not type_of_investment:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'type_of_investment is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone_number:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not measure_for_multiplier:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'measure_for_multiplier is required'},status=status.HTTP_400_BAD_REQUEST)
            if not address:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'address is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_summary:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_summary is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_detail:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_detail is required'},status=status.HTTP_400_BAD_REQUEST)
            if not overview:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'overview is required'},status=status.HTTP_400_BAD_REQUEST)
            if not debt_assumption:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'debt_assumption is required'},status=status.HTTP_400_BAD_REQUEST)
            if not financial_debt_assumption:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'financial_debt_assumption is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location_details:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'location_details is required'},status=status.HTTP_400_BAD_REQUEST)
            if not longitude:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not latitude:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)

            project_obj.property_name = property_name
            project_obj.image_data = image_data
            project_obj.videos = videos
            project_obj.documents_data = documents_data
            project_obj.property_type = property_type
            project_obj.assest_equality = assest_equality
            project_obj.investment_highlight = investment_highlight
            project_obj.equity_price = equity_price
            project_obj.lp_equity_percent = lp_equity_percent
            project_obj.gp_equity_percent = gp_equity_percent
            project_obj.debt_percent = debt_percent
            project_obj.property_at_glance_title = property_at_glance_title
            project_obj.description = description
            project_obj.bussiness_plan = bussiness_plan
            project_obj.minimum_investment = minimum_investment
            project_obj.investment_strategy = investment_strategy
            project_obj.expected_attitude_price = expected_attitude_price
            project_obj.financed = financed
            project_obj.target_return_on_cost = target_return_on_cost
            project_obj.target_irr = target_irr
            project_obj.lp_equity_percent = lp_equity_percent
            project_obj.offered_by = offered_by
            project_obj.estimated_first_distribution = estimated_first_distribution
            project_obj.type_of_investment = type_of_investment
            project_obj.phone_number = phone_number
            project_obj.measure_for_multiplier = measure_for_multiplier
            project_obj.address = address
            project_obj.location_details = location_details
            project_obj.property_summary = property_summary
            project_obj.property_detail = property_detail
            project_obj.overview = overview
            project_obj.debt_assumption = debt_assumption
            project_obj.financial_debt_assumption = financial_debt_assumption
            project_obj.location = location
            project_obj.longitude = longitude
            project_obj.latitude = latitude
            project_obj.is_draft = is_draft
            project_obj.subscription_type = subscription_tyre
            project_obj.start_date = datetime.now()
            project_obj.status = 0
        
            project_obj.save()
            return Response({'status':status.HTTP_200_OK,'message':'Updated Successfully'},status=status.HTTP_200_OK)
        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 myInvestmentMyProject(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            page = self.request.query_params.get('page')
            if not page:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            page_per_data = self.request.query_params.get('page_per_data')
            if not page_per_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            invest_obj =  InvestmentMyProject.objects.filter(customerId=customerObj)
            total_count = InvestmentMyProject.objects.filter(customerId=customerObj).count()
            paginator = Paginator(invest_obj, page_per_data)
            try:
                invest_obj = paginator.page(page)
            except PageNotAnInteger:
                invest_obj = paginator.page(1)
            except EmptyPage:
                invest_obj = paginator.page(paginator.num_pages)
            allData = []
            for invest in invest_obj:
                alldata = {
                    'id': invest.id,
                    'customer_id':invest.customerId.id,
                    'fullname': invest.customerId.firstName+' '+ invest.customerId.lastName,
                    'property_name':invest.property_name,
                    'image_data':invest.image_data,
                    'videos':invest.videos,
                    'documents_data':invest.documents_data,
                    'property_type':invest.property_type,
                    'assest_equality':invest.assest_equality,
                    'investment_highlight':invest.investment_highlight,
                    'equity_price':invest.equity_price,
                    'lp_equity_percent':invest.lp_equity_percent,
                    'gp_equity_percent':invest.gp_equity_percent,
                    'debt_percent':invest.debt_percent,
                    'property_at_glance_title':invest.property_at_glance_title,
                    'description':invest.description,
                    'bussiness_plan':invest.bussiness_plan,
                    'minimum_investment':invest.minimum_investment,
                    'investment_strategy':invest.investment_strategy,
                    'expected_attitude_price':invest.expected_attitude_price,
                    'financed':invest.financed,
                    'target_return_on_cost':invest.target_return_on_cost,
                    'target_irr':invest.target_irr,
                    'lp_equity_percent':invest.lp_equity_percent,
                    'offered_by':invest.offered_by,
                    'estimated_first_distribution':invest.estimated_first_distribution,
                    'type_of_investment':invest.type_of_investment,
                    'phone_number':invest.phone_number,
                    'measure_for_multiplier':invest.measure_for_multiplier,
                    'address':invest.address,
                    'location_details':invest.location_details,
                    'property_summary':invest.property_summary,
                    'property_details':invest.property_details,
                    'overview':invest.overview,
                    'debt_assumption':invest.debt_assumption,
                    'location':invest.location,
                    'latitude':invest.latitude,
                    'longitude':invest.longitude,
                    'subscription_type':invest.subscription_type,
                    'status':invest.status,
                    'is_draft':invest.is_draft,

                }
                allData.append(alldata)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(invest_obj),'total':total_count})
        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 myInvestmentMyProjectDetails(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            project_id = self.request.query_params.get('id')
            if not project_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Rent sale Id is required'},status=status.HTTP_400_BAD_REQUEST)
            pro_obj = InvestmentMyProject.objects.filter(id=project_id,customerId=customerObj).first()
            if not pro_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No house for rent found'},status=status.HTTP_400_BAD_REQUEST)

            alldata = {
                'id': pro_obj.id,
                'customer_id':pro_obj.customerId.id,
                'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                'property_name':pro_obj.property_name,
                'image_data':pro_obj.image_data,
                'videos':pro_obj.videos,
                'documents_data':pro_obj.documents_data,
                'property_type':pro_obj.property_type,
                'assest_equality':pro_obj.assest_equality,
                'investment_highlight':pro_obj.investment_highlight,
                'equity_price':pro_obj.equity_price,
                'lp_equity_percent':pro_obj.lp_equity_percent,
                'gp_equity_percent':pro_obj.gp_equity_percent,
                'debt_percent':pro_obj.debt_percent,
                'property_at_glance_title':pro_obj.property_at_glance_title,
                'description':pro_obj.description,
                'bussiness_plan':pro_obj.bussiness_plan,
                'minimum_investment':pro_obj.minimum_investment,
                'investment_strategy':pro_obj.investment_strategy,
                'expected_attitude_price':pro_obj.expected_attitude_price,
                'financed':pro_obj.financed,
                'target_return_on_cost':pro_obj.target_return_on_cost,
                'target_irr':pro_obj.target_irr,
                'lp_equity_percent':pro_obj.lp_equity_percent,
                'offered_by':pro_obj.offered_by,
                'estimated_first_distribution':pro_obj.estimated_first_distribution,
                'type_of_investment':pro_obj.type_of_investment,
                'phone_number':pro_obj.phone_number,
                'measure_for_multiplier':pro_obj.measure_for_multiplier,
                'address':pro_obj.address,
                'location_details':pro_obj.location_details,
                'property_summary':pro_obj.property_summary,
                'property_details':pro_obj.property_details,
                'overview':pro_obj.overview,
                'debt_assumption':pro_obj.debt_assumption,
                'location':pro_obj.location,
                'latitude':pro_obj.latitude,
                'longitude':pro_obj.longitude,
                'subscription_type':pro_obj.subscription_type,
                'status':pro_obj.status,
                'is_draft':pro_obj.is_draft,
            }
            return Response({'status':status.HTTP_200_OK,'message':'fetched successfully','data':alldata},status=status.HTTP_200_OK)

        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 myInvestmentPropertyFavouriteList(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            favourite_obj = InvestmentMyProjectFavourite.objects.filter(customerId=customerObj)
            allData = []
            for favourite in favourite_obj:
                
                alldata = {
                    'id': favourite.invest_project.id,
                    'property_name':favourite.invest_project.property_name,
                    'image_data':favourite.invest_project.image_data,
                    'property_type':favourite.invest_project.property_type,
                    'investment_strategy':favourite.invest_project.investment_strategy,
                    'target_irr':favourite.invest_project.target_irr,
                    'target_return_on_cost':favourite.invest_project.target_return_on_cost,
                    'offered_by':favourite.invest_project.offered_by,
                    'description':favourite.invest_project.description,
                    'property_at_glance_title':favourite.invest_project.property_at_glance_title,
                
                }
                allData.append(alldata)
            return Response({'status':status.HTTP_200_OK,'message':'fetched successfully','data':allData},status=status.HTTP_200_OK)
        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 investmentMyCompany(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0

            property_name = data.get('property_name')
            company_logo = data.get('company_logo')
            company_video = data.get('company_video')
            documents_data = data.get('documents_data')
            property_type = data.get('property_type')
            company_established = data.get('company_established')
            company_email = data.get('company_email')
            company_phonenumber = data.get('company_phonenumber')
            company_address = data.get('company_address')
            shareholders = data.get('shareholders')
            share = data.get('share')
            description = data.get('description')
            the_valuation = data.get('the_valuation')
            shares_for_sale = data.get('shares_for_sale')
            price_per_share = data.get('price_per_share')
            postal_code = data.get('postal_code')
            bank_acc_created = data.get('bank_acc_created')
            issue_account_no = data.get('issue_account_no')
            post_number = data.get('post_number')
            self_report = data.get('self_report')
            minimum_drawing = data.get('minimum_drawing')
            max_drawing = data.get('max_drawing')
            remaninig_shares = data.get('remaninig_shares')
            no_share_bfr_issue = data.get('no_share_bfr_issue')
            nominal_share_price = data.get('nominal_share_price')
            company_website = data.get('company_website')
            location = data.get('location')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            is_draft = data.get('is_draft')
            agency_id = data.get('agency_id')
            if agency_id:
                agency_obj = Customer.objects.filter(id=agency_id).first()
            else:
                agency_obj = None
            

            if not property_name:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_video:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_established:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_established is required'},status=status.HTTP_400_BAD_REQUEST)
            if not documents_data:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'documents_data is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_email:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_type:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not max_drawing:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'max_drawing is required'},status=status.HTTP_400_BAD_REQUEST)
            if not the_valuation:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'the_valuation is required'},status=status.HTTP_400_BAD_REQUEST)
            if not shares_for_sale:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'shares_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not remaninig_shares:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'remaninig_shares is required'},status=status.HTTP_400_BAD_REQUEST)
            if not minimum_drawing:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'minimum_drawing is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_phonenumber:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_phonenumber is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_address:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_address is required'},status=status.HTTP_400_BAD_REQUEST)
            if not share:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'share is required'},status=status.HTTP_400_BAD_REQUEST)
            if not postal_code:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'postal_code is required'},status=status.HTTP_400_BAD_REQUEST)
            if not post_number:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'post_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not latitude:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not issue_account_no:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'issue_account_no is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bank_acc_created:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'bank_acc_created is required'},status=status.HTTP_400_BAD_REQUEST)
            if not longitude:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not no_share_bfr_issue:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'no_share_bfr_issue is required'},status=status.HTTP_400_BAD_REQUEST)
            if not nominal_share_price:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'nominal_share_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not price_per_share:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'price_per_share is required'},status=status.HTTP_400_BAD_REQUEST)
            if not self_report:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'price_per_share is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_website:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'price_per_share is required'},status=status.HTTP_400_BAD_REQUEST)




            company_obj = InvestmentMyCompany.objects.create(customerId=customerObj)
            company_obj.property_name = property_name
            company_obj.company_logo = company_logo
            company_obj.company_video = company_video
            company_obj.documents_data = documents_data
            company_obj.property_type = property_type
            company_obj.company_established = company_established
            company_obj.company_email = company_email
            company_obj.company_phonenumber = company_phonenumber
            company_obj.company_address = company_address
            company_obj.share = share
            company_obj.shareholders = shareholders
            company_obj.description = description
            company_obj.the_valuation = the_valuation
            company_obj.shares_for_sale = shares_for_sale
            company_obj.price_per_share = price_per_share
            company_obj.postal_code = postal_code
            company_obj.bank_acc_created = bank_acc_created
            company_obj.issue_account_no = issue_account_no
            company_obj.post_number = post_number
            company_obj.self_report = self_report
            company_obj.minimum_drawing = minimum_drawing
            company_obj.max_drawing = max_drawing
            company_obj.remaninig_shares = remaninig_shares
            company_obj.no_share_bfr_issue = no_share_bfr_issue
            company_obj.nominal_share_price = nominal_share_price
            company_obj.company_website = company_website
            company_obj.location = location
            company_obj.latitude = latitude
            company_obj.longitude = longitude
            company_obj.subscription_type = subscription_tyre
            company_obj.is_draft = is_draft
            company_obj.start_date = datetime.now()
            company_obj.agency = agency_obj
            company_obj.save()
            allData = {
                'id':company_obj.id,
            }
            AdminNotifications.objects.create(message= 'A new investment for company has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=True,notification_type='investment_company')
            return Response({'status':status.HTTP_200_OK,'message':'investment for company has been Added successfully','data':allData},status=status.HTTP_200_OK)


        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 editInvestmentMyCompany(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            property_id = data.get('property_id')
            if not property_id:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)

            company_obj = InvestmentMyCompany.objects.filter(id=property_id).first()

            property_name = data.get('property_name')
            company_logo = data.get('company_logo')
            company_video = data.get('company_video')
            documents_data = data.get('documents_data')
            property_type = data.get('property_type')
            company_established = data.get('company_established')
            company_email = data.get('company_email')
            company_phonenumber = data.get('company_phonenumber')
            company_address = data.get('company_address')
            shareholders = data.get('shareholders')
            share = data.get('share')
            description = data.get('description')
            the_valuation = data.get('the_valuation')
            shares_for_sale = data.get('shares_for_sale')
            price_per_share = data.get('price_per_share')
            postal_code = data.get('postal_code')
            bank_acc_created = data.get('bank_acc_created')
            issue_account_no = data.get('issue_account_no')
            post_number = data.get('post_number')
            self_report = data.get('self_report')
            minimum_drawing = data.get('minimum_drawing')
            max_drawing = data.get('max_drawing')
            remaninig_shares = data.get('remaninig_shares')
            no_share_bfr_issue = data.get('no_share_bfr_issue')
            nominal_share_price = data.get('nominal_share_price')
            company_website = data.get('company_website')
            location = data.get('location')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            is_draft = data.get('is_draft')

            if not property_name:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_video:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_established:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_established is required'},status=status.HTTP_400_BAD_REQUEST)
            if not documents_data:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'documents_data is required'},status=status.HTTP_400_BAD_REQUEST)
            if not description:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_email:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_type:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not max_drawing:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'max_drawing is required'},status=status.HTTP_400_BAD_REQUEST)
            if not the_valuation:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'the_valuation is required'},status=status.HTTP_400_BAD_REQUEST)
            if not shares_for_sale:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'shares_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not remaninig_shares:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'remaninig_shares is required'},status=status.HTTP_400_BAD_REQUEST)
            if not minimum_drawing:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'minimum_drawing is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_phonenumber:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_phonenumber is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_address:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_address is required'},status=status.HTTP_400_BAD_REQUEST)
            if not share:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'share is required'},status=status.HTTP_400_BAD_REQUEST)
            if not postal_code:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'postal_code is required'},status=status.HTTP_400_BAD_REQUEST)
            if not post_number:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'post_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not latitude:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not issue_account_no:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'issue_account_no is required'},status=status.HTTP_400_BAD_REQUEST)
            if not bank_acc_created:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'bank_acc_created is required'},status=status.HTTP_400_BAD_REQUEST)
            if not longitude:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not no_share_bfr_issue:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'no_share_bfr_issue is required'},status=status.HTTP_400_BAD_REQUEST)
            if not nominal_share_price:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'nominal_share_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not price_per_share:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'price_per_share is required'},status=status.HTTP_400_BAD_REQUEST)
            if not self_report:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'price_per_share is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_website:return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'price_per_share is required'},status=status.HTTP_400_BAD_REQUEST)

            company_obj.property_name = property_name
            company_obj.company_logo = company_logo
            company_obj.company_video = company_video
            company_obj.documents_data = documents_data
            company_obj.property_type = property_type
            company_obj.company_established = company_established
            company_obj.company_email = company_email
            company_obj.company_phonenumber = company_phonenumber
            company_obj.company_address = company_address
            company_obj.share = share
            company_obj.shareholders = shareholders
            company_obj.description = description
            company_obj.the_valuation = the_valuation
            company_obj.shares_for_sale = shares_for_sale
            company_obj.price_per_share = price_per_share
            company_obj.postal_code = postal_code
            company_obj.bank_acc_created = bank_acc_created
            company_obj.issue_account_no = issue_account_no
            company_obj.post_number = post_number
            company_obj.self_report = self_report
            company_obj.minimum_drawing = minimum_drawing
            company_obj.max_drawing = max_drawing
            company_obj.remaninig_shares = remaninig_shares
            company_obj.no_share_bfr_issue = no_share_bfr_issue
            company_obj.nominal_share_price = nominal_share_price
            company_obj.company_website = company_website
            company_obj.location = location
            company_obj.latitude = latitude
            company_obj.longitude = longitude
            company_obj.subscription_type = subscription_tyre
            company_obj.is_draft = is_draft
            company_obj.start_date = datetime.now()
            company_obj.status = 0
            company_obj.save()

            return Response({'status':status.HTTP_200_OK,'message':'Updated successfully'},status=status.HTTP_200_OK)
        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 myInvestmentMyCompany(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            page = self.request.query_params.get('page')
            if not page:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            page_per_data = self.request.query_params.get('page_per_data')
            if not page_per_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            property_obj =  InvestmentMyCompany.objects.filter(customerId=customerObj)
            total_count = InvestmentMyCompany.objects.filter(customerId=customerObj).count()
            paginator = Paginator(property_obj, page_per_data)
            try:
                property_obj = paginator.page(page)
            except PageNotAnInteger:
                property_obj = paginator.page(1)
            except EmptyPage:
                property_obj = paginator.page(paginator.num_pages)
            allData = []
            for pro_obj in property_obj:
                alldata = {
                    'id': pro_obj.id,
                    'customer_id':pro_obj.customerId.id,
                    'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                    'company_name' :pro_obj.property_name,
                    'company_established' :pro_obj.company_established,
                    'company_email' :pro_obj.company_email,
                    'the_valuation' :pro_obj.the_valuation,
                    'price_per_share':pro_obj.price_per_share,
                    'shares_for_sale' :pro_obj.shares_for_sale,
                    'minimum_drawing' :pro_obj.minimum_drawing,
                    'max_drawing' :pro_obj.max_drawing,
                    'status': pro_obj.status,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(property_obj),'total':total_count})
        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 myInvestmentMyCompanyDetails(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            project_id = request.GET.get('project_id')
            if not project_id:
                return Response({'message':'Investment Id is required'},status=status.HTTP_400_BAD_REQUEST)
            pro_obj = InvestmentMyCompany.objects.filter(id=project_id).first()
            if not pro_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No Investment for my company found'},status=status.HTTP_400_BAD_REQUEST)

            alldata = {
                'id': pro_obj.id,
                'company_logo':pro_obj.company_logo,
                'company_video':pro_obj.company_video,
                'customer_id':pro_obj.customerId.id,
                'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                'property_name' :pro_obj.property_name,
                'documents_data':pro_obj.documents_data,
                'property_type' :pro_obj.property_type,
                'company_established' :pro_obj.company_established,
                'company_email' :pro_obj.company_email,
                'company_phonenumber':pro_obj.company_phonenumber,
                'company_address' :pro_obj.company_address,
                'shareholders' :pro_obj.shareholders,
                'share' :pro_obj.share,
                'description' :pro_obj.description,
                'the_valuation' :pro_obj.the_valuation,
                'shares_for_sale' :pro_obj.shares_for_sale,
                'price_per_share' :pro_obj.price_per_share,
                'postal_code' :pro_obj.postal_code,
                'bank_acc_created' :pro_obj.bank_acc_created,
                'issue_account_no' :pro_obj.issue_account_no,
                'post_number' :pro_obj.post_number,
                'self_report' :pro_obj.self_report,
                'minimum_drawing' :pro_obj.minimum_drawing,
                'max_drawing' :pro_obj.max_drawing,
                'remaninig_shares' :pro_obj.remaninig_shares,
                'no_share_bfr_issue' :pro_obj.no_share_bfr_issue,
                'nominal_share_price' :pro_obj.nominal_share_price,
                'company_website' :pro_obj.company_website,
                'subscription_type' :pro_obj.subscription_type,
                'status' :pro_obj.status,
                'is_draft' :pro_obj.is_draft,
                'agency' :pro_obj.agency.id,
                "location": pro_obj.location,
                'latitude': pro_obj.latitude,
                'longitude': pro_obj.longitude,

            }
            return Response({'status':status.HTTP_200_OK,'message':'fetched successfully','data':alldata},status=status.HTTP_200_OK)

        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 buyCompanyShare(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            company_id = request.data.get('company_id')
            if not company_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Company id is required'},status=status.HTTP_400_BAD_REQUEST)
            url = request.data.get('url')
            if not url:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'url is required'},status=status.HTTP_400_BAD_REQUEST)
            companyObj = InvestmentMyCompany.objects.filter(id=company_id).first()
            if not companyObj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No company found'},status=status.HTTP_400_BAD_REQUEST)
            inquireRentObj= BuyCompanyShare.objects.create(company=companyObj,customerId=customerObj,url=url)
            return Response({'status':status.HTTP_200_OK,'message':'Added successfully'},status=status.HTTP_200_OK)
        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 myShareRequests(APIView):
    def get(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            request_type = self.request.query_params.get('request_type')
            if not request_type:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'request type is required'},status=status.HTTP_400_BAD_REQUEST)

            all_Data = []
            if request_type == 'sent':
                share_obj =  BuyCompanyShare.objects.filter(customerId = customerObj.id)
                for share in share_obj:
                    all_data = {
                        'id':share.id,
                        'company_name':share.company.company_name,
                        'created_date':share.start_date,
                        'share_status':share.share_status,
                        'url':share.url,
                        'company_email':share.company.company_email,
                        'company_phone_number':share.company.company_telephone,


                    }
                    all_Data.append(all_data)
            else:
                share_obj =  BuyCompanyShare.objects.filter(company__customerId = customerObj.id)
                for share in share_obj:
                    all_data = {
                        'id':share.id,
                        'customer_id':share.customerId.id,
                        'customer_name':share.customerId.firstName+" "+share.customerId.firstName,
                        'customer_email':share.customerId.email,
                        'customer_phone_number':share.customerId.phoneNumber,
                        'share_status':share.share_status,
                        'created_date':share.start_date,
                        'url':share.url,

                    }

                    all_Data.append(all_data)
            return Response({'status':status.HTTP_200_OK,'message':'fetched successfully','data':all_Data},status=status.HTTP_200_OK)
        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 shareRequestsRecieved(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            share_obj =  BuyCompanyShare.objects.filter(company__customerId = customerObj.id)
            all_Data = []
            for share in share_obj:
                all_data = {
                    'id':share.id,
                    'customer_id':share.customerId.id,
                    'customer_name':share.customerId.firstName+''+share.customerId.firstName,
                    'customer_email':share.customerId.email,
                    'customer_phone_number':share.customerId.phoneNumber,
                    'share_status':share.share_status,
                    'created_date':share.start_date,
                    'url':share.url,

                }

                all_Data.append(all_data)
            
            return Response({'status':status.HTTP_200_OK,'message':'request shared successfully','data':all_Data})
        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 approveShareRequest(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()

            request_id = request.data.get('request_id')
            if not request_id:
                return Response({'message':'request id is required'},status=status.HTTP_400_BAD_REQUEST)

            share_obj = BuyCompanyShare.objects.filter(id = request_id,company__customerId = customerObj.id ).first()
            share_obj.share_status = "Approved"
            share_obj.save()
            return Response({'status':status.HTTP_200_OK,'message':'share request approved successfully'},status=status.HTTP_200_OK)
        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 addPropertyProject(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0

            if subscription_tyre != 3:  
                if customerObj.can_add_property_count==0:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)
                

            spend_too_much_time = data.get('spend_too_much_time')
            most_useless_skill = data.get('most_useless_skill')
            fun_act = data.get('fun_act')
            biography = data.get('biography')
            short_title = data.get('short_title')
            property_overview = data.get('property_overview')
            property_description = data.get('property_description')
            image_data =  data.get('image_data')
            videos =  data.get('videos')
            videos_thumbnail =  data.get('videos_thumbnail')
            property_document = data.get('property_document')
            category = data.get('category')
            property_name =  data.get('property_name')
            property_dimension = data.get('property_dimension')
            country = data.get('country')
            state = data.get('state')
            city = data.get('city')
            postal_code = data.get('postal_code')
            landmark = data.get('landmark')
            house_number = data.get('house_number')
            location = data.get('location')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            facility = data.get('facility')
            benefits = data.get('benefits')
            return_on_investment = data.get('return_on_investment')
            finder_fee = data.get('finder_fee')
            gross_income = data.get('gross_income')
            price = data.get('price')
            cashflow_pcm = data.get('cashflow_pcm')
            total_termination_fee = data.get('total_termination_fee')
            rent_to_landlord = data.get('rent_to_landlord')
            bill_utilities = data.get('bill_utilities')

            purchase_price = data.get('purchase_price')
            potential_cashflow_pcm = data.get('potential_cashflow_pcm')
            investment_finder_fee = data.get('investment_finder_fee')
            investment_return_on_investment_fee = data.get('investment_return_on_investment_fee')
            rental = data.get('rental')
            the_vision = data.get('the_vision')
            cost_to_consider = data.get('cost_to_consider')
            capital_required = data.get('capital_required')
            cashflow_forecast = data.get('cashflow_forecast')   
            is_draft = data.get('is_draft')
            agency_id = data.get('agency_id')
            if agency_id:
                agency_obj = Customer.objects.filter(id=agency_id).first()
            else:
                agency_obj = None


            if not spend_too_much_time:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'spend_too_much_time is required'},status=status.HTTP_400_BAD_REQUEST)
            if not most_useless_skill:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'most_useless_skill is required'},status=status.HTTP_400_BAD_REQUEST)
            if not fun_act:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'fun_act is required'},status=status.HTTP_400_BAD_REQUEST)
            if not biography:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'biography is required'},status=status.HTTP_400_BAD_REQUEST)
            if not short_title:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'short_title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_overview:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_overview is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_description:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image_data:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'image_data is required'},status=status.HTTP_400_BAD_REQUEST)
            if not videos:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'videos is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_document:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_document is required'},status=status.HTTP_400_BAD_REQUEST)
            if not category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_dimension:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_dimension is required'},status=status.HTTP_400_BAD_REQUEST)
            if not country:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'country is required'},status=status.HTTP_400_BAD_REQUEST)
            if not state:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'state is required'},status=status.HTTP_400_BAD_REQUEST)
            if not city:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'city is required'},status=status.HTTP_400_BAD_REQUEST)
            if not postal_code:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'postal_code is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not latitude:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not longitude:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not facility:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'facility is required'},status=status.HTTP_400_BAD_REQUEST)
            if not benefits:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'benefits is required'},status=status.HTTP_400_BAD_REQUEST)
            if not return_on_investment:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'return_on_investment is required'},status=status.HTTP_400_BAD_REQUEST)
            if not finder_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finder_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not gross_income:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'gross_income is required'},status=status.HTTP_400_BAD_REQUEST)
            if not price:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not cashflow_pcm:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'cashflow_pcm is required'},status=status.HTTP_400_BAD_REQUEST)
            if not total_termination_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'total_termination_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not purchase_price:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'purchase_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not potential_cashflow_pcm:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'potential_cashflow_pcm is required'},status=status.HTTP_400_BAD_REQUEST)
            if not investment_finder_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'investment_finder_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not investment_return_on_investment_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'investment_return_on_investment_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rental:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rental is required'},status=status.HTTP_400_BAD_REQUEST)
            if not the_vision:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'the_vision is required'},status=status.HTTP_400_BAD_REQUEST)
            if not cost_to_consider:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'cost_to_consider is required'},status=status.HTTP_400_BAD_REQUEST)
            if not capital_required:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'capital_required is required'},status=status.HTTP_400_BAD_REQUEST)
            
            property_project = PropertyProject.objects.create(
                customerId=customerObj,
                spend_too_much_time=spend_too_much_time,
                most_useless_skill=most_useless_skill,
                fun_act=fun_act,
                biography=biography,
                short_title=short_title,
                property_overview=property_overview,
                property_description=property_description,
                image_data=image_data,
                videos_thumbnail=videos_thumbnail,
                videos=videos,
                property_document=property_document,
                category=category,
                property_name=property_name,
                property_dimension=property_dimension,
                country=country,
                state=state,
                city=city,
                postal_code=postal_code,
                landmark=landmark,
                house_number=house_number,
                location=location,
                latitude=latitude,
                longitude=longitude,
                facility=facility,
                benefits=benefits,
                return_on_investment=return_on_investment,
                gross_income=gross_income,
                price=price,
                cashflow_pcm=cashflow_pcm,
                total_termination_fee=total_termination_fee,
                rent_to_landlord=rent_to_landlord,
                bill_utilities=bill_utilities,
                purchase_price=purchase_price,
                potential_cashflow_pcm=potential_cashflow_pcm,
                investment_finder_fee=investment_finder_fee,
                investment_return_on_investment_fee=investment_return_on_investment_fee,
                rental=rental,
                finder_fee=finder_fee,
                the_vision=the_vision,
                cost_to_consider=cost_to_consider,
                capital_required=capital_required,
                cashflow_forecast=cashflow_forecast,
                start_date=datetime.now(),
                is_draft=is_draft,
                subscription_type=subscription_tyre,
                agency=agency_obj
            )
            customerObj.can_add_property_count-=1
            customerObj.save()
            AdminNotifications.objects.create(message= 'A new property project has been added by the '+customerObj.firstName+''+ customerObj.lastName ,is_read=False,notification_type='property_project')
            return Response({'status_code':status.HTTP_200_OK,'message':'Added successfully'},status=status.HTTP_200_OK)

        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 editPropertyProject(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersFeatureAdsHistory.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.id
            else:
                subscription_tyre =  0
            property_id = data.get('property_id')
            if not property_id:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)

            propertyProject_obj = PropertyProject.objects.filter(id=property_id).first()
            if not propertyProject_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No property project found'},status=status.HTTP_400_BAD_REQUEST)
            
            spend_too_much_time = data.get('spend_too_much_time')
            most_useless_skill = data.get('most_useless_skill')
            fun_act = data.get('fun_act')
            biography = data.get('biography')
            short_title = data.get('short_title')
            property_overview = data.get('property_overview')
            property_description = data.get('property_description')
            image_data =  data.get('image_data')
            videos =  data.get('videos')
            videos_thumbnail =  data.get('videos_thumbnail')
            property_document = data.get('property_document')
            category = data.get('category')
            property_name =  data.get('property_name')
            property_dimension = data.get('property_dimension')
            country = data.get('country')
            state = data.get('state')
            city = data.get('city')
            postal_code = data.get('postal_code')
            landmark = data.get('landmark')
            house_number = data.get('house_number')
            location = data.get('location')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            facility = data.get('facility')
            benefits = data.get('benefits')
            return_on_investment = data.get('return_on_investment')
            rent_to_landlord = data.get('rent_to_landlord')
            bill_utilities = data.get('bill_utilities')
   
            finder_fee = data.get('finder_fee')
            gross_income = data.get('gross_income')
            price = data.get('price')
            cashflow_pcm = data.get('cashflow_pcm')
            total_termination_fee = data.get('total_termination_fee')
            purchase_price = data.get('purchase_price')
            potential_cashflow_pcm = data.get('potential_cashflow_pcm')
            investment_finder_fee = data.get('investment_finder_fee')
            investment_return_on_investment_fee = data.get('investment_return_on_investment_fee')
            rental = data.get('rental')
            the_vision = data.get('the_vision')
            cost_to_consider = data.get('cost_to_consider')
            capital_required = data.get('capital_required')
            cashflow_forecast = data.get('cashflow_forecast')   
            is_draft = data.get('is_draft')



            if not spend_too_much_time:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'spend_too_much_time is required'},status=status.HTTP_400_BAD_REQUEST)
            if not most_useless_skill:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'most_useless_skill is required'},status=status.HTTP_400_BAD_REQUEST)
            if not fun_act:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'fun_act is required'},status=status.HTTP_400_BAD_REQUEST)
            if not biography:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'biography is required'},status=status.HTTP_400_BAD_REQUEST)
            if not short_title:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'short_title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_overview:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_overview is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_description:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_description is required'},status=status.HTTP_400_BAD_REQUEST)
            if not image_data:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'image_data is required'},status=status.HTTP_400_BAD_REQUEST)
            if not videos:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'videos is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_document:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_document is required'},status=status.HTTP_400_BAD_REQUEST)
            if not category:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_name:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_dimension:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'property_dimension is required'},status=status.HTTP_400_BAD_REQUEST)
            if not country:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'country is required'},status=status.HTTP_400_BAD_REQUEST)
            if not state:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'state is required'},status=status.HTTP_400_BAD_REQUEST)
            if not city:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'city is required'},status=status.HTTP_400_BAD_REQUEST)
            if not postal_code:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'postal_code is required'},status=status.HTTP_400_BAD_REQUEST)
            if not location:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            if not latitude:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not longitude:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            if not facility:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'facility is required'},status=status.HTTP_400_BAD_REQUEST)
            if not benefits:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'benefits is required'},status=status.HTTP_400_BAD_REQUEST)
            if not return_on_investment:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'return_on_investment is required'},status=status.HTTP_400_BAD_REQUEST)
            if not finder_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'finder_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not gross_income:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'gross_income is required'},status=status.HTTP_400_BAD_REQUEST)
            if not price:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not cashflow_pcm:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'cashflow_pcm is required'},status=status.HTTP_400_BAD_REQUEST)
            if not total_termination_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'total_termination_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not purchase_price:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'purchase_price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not potential_cashflow_pcm:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'potential_cashflow_pcm is required'},status=status.HTTP_400_BAD_REQUEST)
            if not investment_finder_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'investment_finder_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not investment_return_on_investment_fee:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'investment_return_on_investment_fee is required'},status=status.HTTP_400_BAD_REQUEST)
            if not rental:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'rental is required'},status=status.HTTP_400_BAD_REQUEST)
            if not the_vision:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'the_vision is required'},status=status.HTTP_400_BAD_REQUEST)
            if not cost_to_consider:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'cost_to_consider is required'},status=status.HTTP_400_BAD_REQUEST)
            if not capital_required:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'capital_required is required'},status=status.HTTP_400_BAD_REQUEST)


            propertyProject_obj.spend_too_much_time = spend_too_much_time
            propertyProject_obj.most_useless_skill = most_useless_skill
            propertyProject_obj.fun_act = fun_act
            propertyProject_obj.biography = biography
            propertyProject_obj.short_title = short_title
            propertyProject_obj.property_overview = property_overview
            propertyProject_obj.property_description = property_description
            propertyProject_obj.image_data = image_data
            propertyProject_obj.videos = videos
            propertyProject_obj.videos_thumbnail = videos_thumbnail
            propertyProject_obj.property_document = property_document
            propertyProject_obj.category = category
            propertyProject_obj.property_name = property_name
            propertyProject_obj.property_dimension = property_dimension
            propertyProject_obj.country = country
            propertyProject_obj.state = state
            propertyProject_obj.city = city
            propertyProject_obj.postal_code = postal_code
            propertyProject_obj.landmark = landmark
            propertyProject_obj.house_number = house_number
            propertyProject_obj.location = location
            propertyProject_obj.latitude = latitude
            propertyProject_obj.longitude = longitude
            propertyProject_obj.facility = facility
            propertyProject_obj.benefits = benefits
            propertyProject_obj.return_on_investment = return_on_investment
            propertyProject_obj.gross_income = gross_income
            propertyProject_obj.price = price
            propertyProject_obj.cashflow_pcm = cashflow_pcm
            propertyProject_obj.total_termination_fee = total_termination_fee
            propertyProject_obj.rent_to_landlord = rent_to_landlord
            propertyProject_obj.bill_utilities = bill_utilities
            propertyProject_obj.purchase_price = purchase_price
            propertyProject_obj.potential_cashflow_pcm = potential_cashflow_pcm
            propertyProject_obj.investment_finder_fee = investment_finder_fee
            propertyProject_obj.investment_return_on_investment_fee = investment_return_on_investment_fee
            propertyProject_obj.rental = rental
            propertyProject_obj.the_vision = the_vision
            propertyProject_obj.cost_to_consider = cost_to_consider
            propertyProject_obj.capital_required = capital_required
            propertyProject_obj.cashflow_forecast = cashflow_forecast
            propertyProject_obj.subscription_type = subscription_tyre
            propertyProject_obj.is_draft = is_draft
            propertyProject_obj.status = 0
            propertyProject_obj.save()
            
            return Response({'status_code':status.HTTP_200_OK,'message':'Updated Successfully'},status=status.HTTP_200_OK)
        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 myPropertyProject(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            page = self.request.query_params.get('page')
            if not page:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            page_per_data = self.request.query_params.get('page_per_data')
            if not page_per_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            property_obj =  PropertyProject.objects.filter(customerId=customerObj)
            total_count = PropertyProject.objects.filter(customerId=customerObj).count()
            paginator = Paginator(property_obj, page_per_data)
            try:
                property_obj = paginator.page(page)
            except PageNotAnInteger:
                property_obj = paginator.page(1)
            except EmptyPage:
                property_obj = paginator.page(paginator.num_pages)
            allData = []
            for pro_obj in property_obj:
                if pro_obj.status == 0:
                    status_info = "Pending"
                elif pro_obj.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
        

                alldata = {
                    'id': pro_obj.id,
                    'customer_id':pro_obj.customerId.id,
                    'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                    'property_name':pro_obj.property_name,
                    'location':pro_obj.location,
                    'price':pro_obj.price,
                    'return_on_investment':pro_obj.return_on_investment,
                    'cashflow_pcm':pro_obj.cashflow_pcm,
                    'status': status_info,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(property_obj),'total':total_count})
        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 myPropertyProjectDetails(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            project_id = self.request.query_params.get('id')
            if not project_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Project Id is required'},status=status.HTTP_400_BAD_REQUEST)
            pro_obj = PropertyProject.objects.filter(id=project_id,customerId=customerObj).first()
            if not pro_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No property project found'},status=status.HTTP_400_BAD_REQUEST)
            if pro_obj.status == 0:
                status_info = "Pending"
            elif pro_obj.status == 1:
                status_info = "Approved"
            else:
                status_info = "Disapproved"
    
            facilities_list = ast.literal_eval(pro_obj.facility)

            # Fetch each facility name and icon from the Facilities model
            facility_details = []
            for facility_name in facilities_list:
                facility = Facilities.objects.filter(name=facility_name).first()
                if facility:
                    facility_details.append({
                        'name': facility.name,
                        'icon': facility.icon
                    })
                else:
                    facility_details.append({
                        'name': facility_name,
                        'icon': None 
                    })
                    
            alldata = {
                'id': pro_obj.id,
                'customer_id':pro_obj.customerId.id,
                'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                'customer_image':pro_obj.customerId.profileImage,
                'spend_too_much_time':pro_obj.spend_too_much_time,
                'most_useless_skill':pro_obj.most_useless_skill,
                'fun_act':pro_obj.fun_act,
                'biography':pro_obj.biography,
                'short_title':pro_obj.short_title,
                'property_overview':pro_obj.property_overview,
                'property_description':pro_obj.property_description,
                'image_data': ast.literal_eval(pro_obj.image_data),
                'videos':pro_obj.videos,
                'videos_thumbnail':pro_obj.videos_thumbnail,
                'property_document':pro_obj.property_document,
                'category':pro_obj.category,
                'property_name':pro_obj.property_name,
                'property_dimension':pro_obj.property_dimension,
                'country':pro_obj.country,
                'state':pro_obj.state,
                'city':pro_obj.city,
                'postal_code':pro_obj.postal_code,
                'landmark':pro_obj.landmark,
                'house_number':pro_obj.house_number,
                'location':pro_obj.location,
                'latitude':pro_obj.latitude,
                'longitude':pro_obj.longitude,
                'facility':ast.literal_eval(pro_obj.facilities.strip()) if pro_obj.facilities and pro_obj.facilities.strip() else [],
                'benefits':ast.literal_eval(pro_obj.benefits),
                'return_on_investment':pro_obj.return_on_investment,
                'finder_fee':pro_obj.finder_fee,
                'gross_income':pro_obj.gross_income,
                'price':pro_obj.price,
                'cashflow_pcm':pro_obj.cashflow_pcm,
                'total_termination_fee':pro_obj.total_termination_fee,
                'purchase_price':pro_obj.purchase_price,
                'potential_cashflow_pcm':pro_obj.potential_cashflow_pcm,
                'investment_finder_fee':pro_obj.investment_finder_fee,
                'investment_return_on_investment_fee':pro_obj.investment_return_on_investment_fee,
                'rental':pro_obj.rental,
                'the_vision':pro_obj.the_vision,
                'cost_to_consider':pro_obj.cost_to_consider,
                'capital_required':pro_obj.capital_required,
                'cashflow_forecast':pro_obj.cashflow_forecast,
                'investment_finder_fee':pro_obj.investment_finder_fee,
                'rent_to_landlord':pro_obj.rent_to_landlord,
                'bill_utilities':pro_obj.bill_utilities,
                'is_draft':pro_obj.is_draft,
                'status':status_info,

            }
            return Response({'status_code':status.HTTP_200_OK,'message':'Property project details fetched successfully','data':alldata},status=status.HTTP_200_OK)

        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 deleteImage(APIView):
    def post(self,request):
        try:
            data = request.data
            image_name = data.get('image')
            if not image_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'image is required'},status=status.HTTP_400_BAD_REQUEST)
            image_path = os.path.join(settings.MEDIA_ROOT, image_name)
            if os.path.exists(image_path):
                os.remove(image_path) # delete the image
                return Response({'status_code':status.HTTP_200_OK,'message': 'Image deleted successfully.'},status=status.HTTP_200_OK)
            else:
                return Response({'status_code':status.HTTP_404_NOT_FOUND,'message': 'Image not found.'}, status=status.HTTP_404_NOT_FOUND)
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class myHouseRentFavouriteList(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            favourite_obj = HouseRentFavourite.objects.filter(customerId=customerObj)
            allData = []
            for favourite in favourite_obj:
                
                alldata = {
                    'id':favourite.house_rent.id,
                    'first_name':favourite.house_rent.first_name,
                    'last_name': favourite.house_rent.last_name,
                    'image': favourite.house_rent.image,
                    'max_monthly_rent': favourite.house_rent.max_month_price,
                    'house_type': favourite.house_rent.property_type,
                    'number_of_resident': favourite.house_rent.no_of_resident,
                    'wanted_from':favourite.house_rent.wanted_from,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'message':'House rent favourite data fetched successfully','data':allData},status=status.HTTP_200_OK)
        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 homePageListing(APIView):
    def get(self,request):
        # try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            # if customerObj.can_add_property_count==0:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Purchase subscription is over. Upgrade your plan.'},status=status.HTTP_400_BAD_REQUEST)
            saleProperty = SaleProperty.objects.filter(end_date__isnull = True)
            rentProperty = RentProperty.objects.filter(end_date__isnull = True)
            bussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,payment_done=False)
            houseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True)
            investmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True)
            investmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True)
            propertyProject = PropertyProject.objects.filter(end_date__isnull = True)
            companySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True,payment_done=False)
            propertydeveloper = PropertyDevelopers.objects.filter(end_date__isnull = True,payment_done=False)
            selected_type = request.GET.get('type')
            min_price = request.GET.get('min_price')
            max_price = request.GET.get('max_price')
            location = request.GET.get('location')
            latitude = request.GET.get('latitude')
            longitude = request.GET.get('longitude')
            filter_data =  request.GET.get('filter_data')
            sort_price = request.GET.get('sort_price')
            sort_upload_date = request.GET.get('sort_upload_date')
            subscription_tyre = request.GET.get('subscription_tyre')

            allData= []
            if saleProperty:
                for salelist in saleProperty:
                    favourite_obj = SalePropertyFavourite.objects.filter(sale=salelist.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
      
                    if salelist.status == 0:
                        status_info = "Pending"
                    elif salelist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':salelist.id,
                        'title':salelist.title,
                        'image_data':salelist.image_data,
                        'price':salelist.price,
                        'descriptioon':salelist.descriptioon,
                        'latitude':salelist.latitude,
                        'longitude':salelist.longitude,
                        'location':salelist.location,
                        'property_demension':salelist.property_demension,
                        'filter_price':salelist.price,
                        'bedrooms':salelist.bedrooms,
                        'bathrooms':salelist.bathrooms,
                        'created_date':salelist.created_at,
                        'location':salelist.location,
                        'is_favourite':favourite,
                        'subscription_type':salelist.subscription_type,
                        'created_date':salelist.created_at,
                        'status':status_info,
                        'type':"SaleProperty",
                    }
                    allData.append(alldata)
            if rentProperty:
                for rentlist in rentProperty:
                    favourite_obj = RentPropertyFavourite.objects.filter(rent=rentlist.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
      
                    if rentlist.status == 0:
                        status_info = "Pending"
                    elif rentlist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':rentlist.id,
                        'title':rentlist.title,
                        'image_data':rentlist.image_data,
                        'video':rentlist.video,
                        'rooms':rentlist.rooms,
                        'bedrooms':rentlist.bedrooms,
                        'size':rentlist.size,
                        'street_name':rentlist.street_name,
                        'street_number':rentlist.street_number,
                        'postal_no':rentlist.postal_no,
                        'post_office':rentlist.post_office,
                        'filter_price':rentlist.monthly_rent,
                        'residence_number':rentlist.residence_number,
                        'rental_period':rentlist.rental_period,
                        'heading':rentlist.heading,
                        'name_of_ad':rentlist.name_of_ad,
                        'visibilty':rentlist.visibilty,
                        'location':rentlist.location,
                        'latitude':rentlist.latitude,
                        'longitude':rentlist.longitude,
                        'is_favourite':favourite,
                        'status':status_info,
                        'type':"RentProperty",
                    }
                    allData.append(alldata)
            if bussinessSale:
                for bs in bussinessSale:
                    favourite_obj = BussinessForSaleFavourite.objects.filter(bussiness=bs.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    allData.append({
                         'id': bs.id,
                        'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
                        'company_name': bs.company_name,
                        'short_title': bs.short_title,
                        'image_data': ast.literal_eval(bs.image_data),
                        'videos': bs.videos,
                        'videos_thumbnail': bs.videos_thumbnail,
                        'company_name': bs.company_name,
                        'description': bs.description,
                        'total_turnover': bs.total_turnover,
                        'rent': bs.rent,
                        'established_year': bs.established_year,
                        'premises': bs.premises,
                        'years_of_work': bs.years_of_work,
                        'operation_concept': bs.operation_concept,
                        'operation_opening_hours': bs.operation_opening_hours,
                        'turnover_last_year': bs.turnover_last_year,
                        'salary_percentage': bs.salary_percentage,
                        'other_operating_cost': bs.other_operating_cost,
                        'cost': bs.cost,
                        'reason_for_sale':bs.reason_for_sale,
                        'website_link':bs.website_link,
                        'number_of_employes':bs.number_of_employes,
                        'other_operating_cost':bs.other_operating_cost,
                        'area':bs.area,
                        'term_of_lease': bs.term_of_lease,
                        'document':ast.literal_eval(bs.document),
                        'details': bs.details,
                        'service':bs.service,
                        'operations':bs.operations,
                        'market_initatives':bs.market_initatives,
                        'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
                        'valuation':bs.valuation,
                        'owner_name':bs.owner_name,
                        'phone':bs.phone,
                        'telephone':bs.telephone,
                        'email':bs.email,
                        'company':bs.company,
                        'public_order':bs.public_order,
                        'avaiable_attachment':bs.avaiable_attachment,
                        'location':bs.location,
                        'latitude':bs.latitude,
                        'longitude':bs.longitude,    
                        'subscription_type':bs.subscription_type,
                        'created_date':bs.start_date,
                        'is_favourite':favourite,
                        'type':"BusinessSale",})
            if companySeeking:
                for cs in companySeeking:
                    favourite_obj = CompanySeekingEquityFavourite.objects.filter(company_seek=cs.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if cs.status == 0:
                        status_info = "Pending"
                    elif cs.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': cs.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'company_name': cs.company_name,
                        'short_title': cs.short_title_two,
                        'description': cs.description,
                        'about_the_owner': cs.about_the_owner,
                        'image_data': ast.literal_eval(cs.property_image),
                        'videos': cs.property_video,
                        'videos_thumbnail': cs.videos_thumbnail,
                        'company_logo': cs.company_logo,
                        'maximum_drawing': cs.maximum_drawing,
                        'minimum_drawing': cs.minimum_drawing,
                        'share_for_sale': cs.share_for_sale,
                        'price_per_share': cs.price_per_share,
                        'filter_price': cs.price_per_share,
                        'number_of_share': cs.number_of_share,
                        'self_report': cs.self_report,
                        'nominal_share_price': cs.nominal_share_price,
                        'e_post': cs.e_post,
                        'issue_account_number': cs.issue_account_number,
                        'establish_year': cs.establish_year,
                        'premises_from': cs.premises_from,
                        'background_for_sale': cs.background_for_sale,
                        'company_website': cs.company_website,
                        'number_of_employee': cs.number_of_employee,
                        'company_email': cs.company_email,
                        'company_telephone': cs.company_telephone,
                        'youtube': cs.youtube,
                        'upload_team_data': cs.upload_team_data,
                        'upload_team_name': cs.upload_team_name,
                        'upload_team_size': cs.upload_team_size,
      
                        'upload_board_data': cs.upload_board_data,
                        'upload_board_name': cs.upload_board_name,
                        'upload_board_size': cs.upload_board_size,
      
                        'upload_partner_data': cs.upload_partner_data,
                        'upload_partner_name': cs.upload_partner_name,
                        'upload_partner_size': cs.upload_partner_size,
      
                        'location': cs.location,
                        'country': cs.country,
                        'state': cs.state,
                        'city': cs.city,
                        'zip_code': cs.zip_code,
                        'landmark': cs.landmark,
                        'share_holder_image': cs.share_holder_image,
                        'enter_shares': cs.enter_shares,
                        'status': cs.status,
                        'agency': cs.agency.id if cs.agency else None,
                        'subscription_type': cs.subscription_type,
                        'latitude': cs.latitude,
                        'longitude': cs.longitude,
                        'start_date': cs.start_date,
                        'end_date': cs.end_date,
                        # 'is_favourite': cs.is_favourite,
                        # 'favourite_date': cs.favourite_date,
                        'is_favourite':favourite,
                        'status':status_info,
                        'type':"companySeeking"
                    })

            if propertydeveloper:
                for pd in propertydeveloper:
                    favourite_obj = PropertyDevelopersFavourite.objects.filter(house_rent=pd.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
      
                    if pd.status == 0:
                        status_info = "Pending"
                    elif pd.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"

                    allData.append({
                        'id': pd.id,
                        'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
                        'customer_id' : pd.customerId.id,
                        'customer_phone_number' : pd.customerId.phoneNumber,
                        'customer_images' : pd.customerId.profileImage,
                        'image_data': ast.literal_eval(pd.property_image),
                        'videos': pd.videos,
                        'videos_thumbnail': pd.videos_thumbnail,
                        'document': pd.document,
                        'property_name':pd.property_name,
                        'property_type': pd.property_type,
                        'assest_equality': pd.assest_equality,
                        'investment_highlight': pd.investment_highlight,
                        'equity_price': pd.equity_price,
                        'lp_equity_percent': pd.lp_equity_percent,
                        'gp_equity_percent': pd.gp_equity_percent,
                        'debt_percent': pd.debt_percent,
                        'short_title': pd.short_title,
                        'description': pd.description,
                        'bussiness_plan': pd.bussiness_plan,
                        'minimum_investment': pd.minimum_investment,
                        'investment_strategy': pd.investment_strategy,
                        'expected_period': pd.expected_period,
                        'financed': pd.financed,
                        'target_return_on_cost': pd.target_return_on_cost,
                        'target_irr': pd.target_irr,
                        'offered_by': pd.offered_by,
                        'estimated_first_distribution': pd.estimated_first_distribution,
                        'type_of_investment': pd.type_of_investment,
                        'phone_number': pd.phone_number,
                        'measure_of_multiplier': pd.measure_of_multiplier,
                        'address': pd.address,
                        'minimum_goal': pd.minimum_goal,

                        'nominal_share_price': pd.nominal_share_price,
                        'the_valuation': pd.the_valuation,
                        'minimum_drawing': pd.minimum_drawing,

                        'no_of_drawings': pd.no_of_drawings,
                        'share_for_sale': pd.share_for_sale,
                        'remaining_share': pd.remaining_share,
                        'maximum_drawing': pd.maximum_drawing,
                        'short_description': pd.short_description,
                        'why_invest': pd.why_invest,
                        'problem_to_be_solved': pd.problem_to_be_solved,
                        'our_solution': pd.our_solution,
                        'start_date_data': pd.start_date_data,
                        'end_date_data': pd.end_date_data,
                        'number_of_share': pd.number_of_share,
                        'issue_minimum_investment': pd.issue_minimum_investment,
                        'issue_maximum_investment': pd.issue_maximum_investment,
                        'value_before_issue': pd.value_before_issue,
                        'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
                        'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
                        'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
                        'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
                        'self_report': pd.self_report,
                        'discussion_description': pd.discussion_description,
                        'new_exisiting_details': pd.new_exisiting_details,
                        'drawing_on_behalf': pd.drawing_on_behalf,
                        'foundation': pd.foundation,
                        'satutes': pd.satutes,
                        'annual_account': pd.annual_account,
                        'valuation': pd.valuation,
                        'agreement_on_co': pd.agreement_on_co,
                        'conversion_of_debt': pd.conversion_of_debt,
                        'balance_sheet': pd.balance_sheet,
                        'result_report': pd.result_report,
                        'location': pd.location,
                        'country': pd.country,
                        'state': pd.state,
                        'city': pd.city,
                        'zip_code': pd.postal_code,
                        'landmark': pd.landmark,
                        'latitude': pd.latitude,
                        'longitude': pd.longitude,
                        'status': pd.status,
                        'agency': pd.agency.id if pd.agency else None,
                        'subscription_type': pd.subscription_type,
                        'start_date': pd.start_date,
                        'end_date': pd.end_date,
                        
                    })

            if houseWantedRent:
                for hWr in houseWantedRent:
                    favourite_obj = HouseRentFavourite.objects.filter(house_rent=hWr.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
      
                    if hWr.status == 0:
                        status_info = "Pending"
                    elif hWr.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': hWr.id,
                        'short_title':hWr.short_title,
                        'customer_id':hWr.customerId.id,
                        'fullname': hWr.first_name+' '+ hWr.last_name,
                        'profile_visiblity':hWr.profile_visiblity,
                        'profile_hidden':hWr.profile_hidden,
                        'image': ast.literal_eval(hWr.image),
                        'first_name': hWr.first_name,
                        'last_name': hWr.last_name,
                        'gender': hWr.gender,
                        'dob': hWr.dob,
                        'nationality': hWr.nationality,
                        'phone_number':hWr.phone_number,
                        'email': hWr.email,
                        'quantity': hWr.quantity,
                        'rental_period': hWr.rental_period,
                        'max_rent': hWr.max_rent,
                        'from_date': hWr.from_date,
                        'housing_type':hWr.housing_type,
                        'number_of_people':hWr.number_of_people,
                        'max_month_price': hWr.max_month_price,
                        'desired_start_date':hWr.desired_start_date,
                        'desired_area': hWr.desired_area,
                        'latitude':hWr.latitude,
                        'longitude':hWr.longitude,
                        'location':hWr.location,
                        'about':hWr.about,
                        'education':hWr.education,
                        'martial_status':hWr.martial_status,
                        'cleanliness':hWr.cleanliness,
                        'party_habits':hWr.party_habits,
                        'work':hWr.work,
                        'interest':hWr.interest,
                        'subscription_type':hWr.subscription_type,
                        'is_draft':hWr.is_draft,
                        'work':hWr.work,
                        'is_favourite':favourite,
                        'created_date':hWr.start_date,
                        'status':status_info,
                        'country':hWr.country,
                        'state':hWr.state,
                        'city':hWr.city,
                        'postal_code':hWr.postal_code,
                        'landmark':hWr.landmark,
                        'floor':hWr.floor,
                        'description':hWr.description,
                        'type':"HouseRent"})
            if investmentProject:
                for ip in investmentProject:
                    favourite_obj = InvestmentMyProjectFavourite.objects.filter(invest_project=ip.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    allData.append({
                            'id': ip.id,
                            'customer_id':ip.customerId.id,
                            'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
                            'property_name':ip.property_name,
                            'image_data':ip.image_data,
                            'videos':ip.videos,
                            'documents_data':ip.documents_data,
                            'property_type':ip.property_type,
                            'assest_equality':ip.assest_equality,
                            'investment_highlight':ip.investment_highlight,
                            'equity_price':ip.equity_price,
                            'lp_equity_percent':ip.lp_equity_percent,
                            'gp_equity_percent':ip.gp_equity_percent,
                            'debt_percent':ip.debt_percent,
                            'property_at_glance_title':ip.property_at_glance_title,
                            'description':ip.description,
                            'bussiness_plan':ip.bussiness_plan,
                            'minimum_investment':ip.minimum_investment,
                            'investment_strategy':ip.investment_strategy,
                            'expected_attitude_price':ip.expected_attitude_price,
                            'financed':ip.financed,
                            'target_return_on_cost':ip.target_return_on_cost,
                            'target_irr':ip.target_irr,
                            'lp_equity_percent':ip.lp_equity_percent,
                            'offered_by':ip.offered_by,
                            'estimated_first_distribution':ip.estimated_first_distribution,
                            'type_of_investment':ip.type_of_investment,
                            'phone_number':ip.phone_number,
                            'measure_for_multiplier':ip.measure_for_multiplier,
                            'address':ip.address,
                            'location_details':ip.location_details,
                            'property_summary':ip.property_summary,
                            'property_details':ip.property_details,
                            'overview':ip.overview,
                            'debt_assumption':ip.debt_assumption,
                            'location':ip.location,
                            'latitude':ip.latitude,
                            'longitude':ip.longitude,
                            'subscription_type':ip.subscription_type,
                            'is_favourite':favourite,
                            'type':"InvestmentProject"})
            if investmentCompany:
                for ic in investmentCompany:
                    favourite_obj = InvestmentMyCompanyFavourite.objects.filter(invest_company=ic.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    allData.append({
                        'id': ic.id,
                        'company_logo':ic.company_logo,
                        'company_video':ic.company_video,
                        'customer_id':ic.customerId.id,
                        'fullname': ic.customerId.firstName+' '+ ic.customerId.lastName,
                        'property_name' :ic.property_name,
                        'documents_data':ic.documents_data,
                        'property_type' :ic.property_type,
                        'company_established' :ic.company_established,
                        'company_email' :ic.company_email,
                        'company_phonenumber':ic.company_phonenumber,
                        'company_address' :ic.company_address,
                        'shareholders' :ic.shareholders,
                        'share' :ic.share,
                        'description' :ic.description,
                        'the_valuation' :ic.the_valuation,
                        'shares_for_sale' :ic.shares_for_sale,
                        'price_per_share' :ic.price_per_share,
                        'postal_code' :ic.postal_code,
                        'bank_acc_created' :ic.bank_acc_created,
                        'issue_account_no' :ic.issue_account_no,
                        'post_number' :ic.post_number,
                        'self_report' :ic.self_report,
                        'minimum_drawing' :ic.minimum_drawing,
                        'max_drawing' :ic.max_drawing,
                        'remaninig_shares' :ic.remaninig_shares,
                        'no_share_bfr_issue' :ic.no_share_bfr_issue,
                        'nominal_share_price' :ic.nominal_share_price,
                        'company_website' :ic.company_website,
                        'subscription_type' :ic.subscription_type,
                        'status' :ic.status,
                        'is_draft' :ic.is_draft,
                        'agency' :ic.agency,
                        "location": ic.location,
                        'latitude': ic.latitude,
                        'longitude': ic.longitude,
                        'is_favourite':favourite,
                        'created_date':ic.start_date,
                        'type':"InvestmentCompany"})
            if propertyProject:
                for pp in propertyProject:
                    favourite_obj = PropertyProjectFavourite.objects.filter(property=pp.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if pp.status == 0:
                        status_info = "Pending"
                    elif pp.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': pp.id,
                        'customer_id':pp.customerId.id,
                        'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
                        'spend_too_much_time':pp.spend_too_much_time,
                        'most_useless_skill':pp.most_useless_skill,
                        'fun_act':pp.fun_act,
                        'biography':pp.biography,
                        'short_title':pp.short_title,
                        'property_overview':pp.property_overview,
                        'property_description':pp.property_description,
                        'image_data':pp.image_data,
                        'videos':pp.videos,
                        'property_document':pp.property_document,
                        'category':pp.category,
                        'property_name':pp.property_name,
                        'property_dimension':pp.property_dimension,
                        'country':pp.country,
                        'state':pp.state,
                        'city':pp.city,
                        'postal_code':pp.postal_code,
                        'landmark':pp.landmark,
                        'house_number':pp.house_number,
                        'location':pp.location,
                        'latitude':pp.latitude,
                        'longitude':pp.longitude,
                        'facility':pp.facility,
                        'benefits':pp.benefits,
                        'return_on_investment':pp.return_on_investment,
                        'finder_fee':pp.finder_fee,
                        'gross_income':pp.gross_income,
                        'price':pp.price,
                        'cashflow_pcm':pp.cashflow_pcm,
                        'total_termination_fee':pp.total_termination_fee,
                        'purchase_price':pp.purchase_price,
                        'potential_cashflow_pcm':pp.potential_cashflow_pcm,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
                        'rental':pp.rental,
                        'the_vision':pp.the_vision,
                        'cost_to_consider':pp.cost_to_consider,
                        'capital_required':pp.capital_required,
                        'cashflow_forecast':pp.cashflow_forecast,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'is_draft':pp.is_draft,
                          'filter_price':pp.price,
                           'created_date':pp.start_date,
                           'is_favourite':favourite,
                        'subscription_type':pp.subscription_type,
                           'type':"PropertyProject",
                        'status':status_info,
                         })
            # Filter by selected type
            if filter_data == 'true':
                if selected_type:
                    allData = [data for data in allData if data['type'] == selected_type]
                if subscription_tyre:
                    allData = [data for data in allData if data['subscription_type'] == int(subscription_tyre)]
                if sort_price == 'ascending':
                    allData = sorted(allData, key=lambda x: x['filter_price'])
                elif sort_price == 'desending':
                    allData = sorted(allData, key=lambda x: x['filter_price'], reverse=True)
                if sort_upload_date == "oldest":
                    allData = sorted(allData, key=lambda x: x['created_date'])
                elif sort_upload_date == "latest":
                    allData = sorted(allData, key=lambda x: x['created_date'], reverse=True)
                if min_price and max_price:
                    min_price = int(min_price) 
                    max_price = int(max_price) 
                    allData = [data for data in allData if min_price <= data['filter_price'] <= max_price]
                if latitude and longitude:
                    lat = float(latitude)
                    lon = float(longitude)
                    kmrange = 20  # Adjust the range as needed

                    filtered_data = []
                    for data in allData:
                        if 'latitude' in data and 'longitude' in data and data['latitude'] is not None and data['longitude'] is not None:
                            dist = haversine(lat, lon, float(data['latitude']), float(data['longitude']))
                            if dist <= kmrange:
                                filtered_data.append(data)
                    
                    allData = filtered_data
                    # lookups.add(Q(latitude__gte= (lat - kmrange/111.1),latitude__lte=(lat + kmrange/111.1),longitude__gte=(long - kmrange/111.1),longitude__lte=(long + kmrange/111.1)),Q.AND)
            else:
                if selected_type:
                    allData = [data for data in allData if data['type'] == selected_type]
                if min_price and max_price:
                    min_price = int(min_price) 
                    max_price = int(max_price) 
                    allData = [data for data in allData if min_price <= data['filter_price'] <= max_price]
                random.shuffle(allData)
                allData = sorted(allData, key=lambda x: x['subscription_type'], reverse=True)
            
            return Response({'status_code':status.HTTP_200_OK,'message':'home page listing fetched successfully','data':allData},status=status.HTTP_200_OK)
        # 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 commonGetPropertiesDetail(APIView):
    def get(self,request):
        try:
                try:
                    uid = authenticated(request)
                except Exception as e:
                    return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

                customerObj=Customer.objects.filter(user=uid).first()
                Type = request.query_params.get('type')
                if not Type:
                    return Response({'message':'token is required'},status=status.HTTP_400_BAD_REQUEST)
                jwt_token = request.headers.get('Authorization')
                if not jwt_token:
                    return Response({'message':'token is required'},status=status.HTTP_400_BAD_REQUEST)
                headers = {'Authorization': jwt_token}
                payload={'id':self.request.query_params.get('id'),
                        }
                try:
                    
                    # # Get PropertyRentSale API
                    # if Type ==  'SaleRent':
                    # 	url = str(settings.BASE_URL)+'customer-api/rent-sale-detail'
                    # 	getAPI = requests.request("GET", url, headers=headers, params=payload)
                    # 	apiResponse = getAPI.json()
                    # 	return Response(apiResponse)
                    
                    # Get BussinessForSale API
                    inquirePropertyProjectObj= inquirePropertyProject.objects.filter(customerId=customerObj,property_type=Type)
                    is_requested = False
                    if inquirePropertyProjectObj.exists():
                        is_requested = True

                    if Type ==  'BusinessSale':
                        url = str(settings.BASE_URL)+'customer-api/my-bussiness-for-sale-details'
                        getAPI = requests.request("GET", url, headers=headers, params=payload)
                        apiResponse = getAPI.json()
                        
                        if isinstance(apiResponse.get('data'), dict):
                            apiResponse['data']['is_requested'] = is_requested
                        return Response(apiResponse)
                    
                    # Get HouseRent API
                    if Type ==  'HouseRent':
                        url = str(settings.BASE_URL)+'customer-api/my-house-wanted-for-rent-details'
                        getAPI = requests.request("GET", url, headers=headers, params=payload)
                        apiResponse = getAPI.json()
                        if isinstance(apiResponse.get('data'), dict):
                            apiResponse['data']['is_requested'] = is_requested
                        return Response(apiResponse)

                    # Get investmentMyProject API
                    if Type ==  'InvestmentProject':
                        url = str(settings.BASE_URL)+'customer-api/my-investment-project-details'
                        getAPI = requests.request("GET", url, headers=headers, params=payload)
                        apiResponse = getAPI.json()
                        if isinstance(apiResponse.get('data'), dict):
                            apiResponse['data']['is_requested'] = is_requested
                        return Response(apiResponse)
                    
                    # Get investmentMyCompany API
                    if Type ==  'InvestmentCompany':
                        url = str(settings.BASE_URL)+'customer-api/my-investment-my-company-details'
                        getAPI = requests.request("GET", url, headers=headers, params=payload)
                        apiResponse = getAPI.json()
                        if isinstance(apiResponse.get('data'), dict):
                            apiResponse['data']['is_requested'] = is_requested
                        return Response(apiResponse)

                    # Get PropertyProject API
                    if Type ==  'PropertyProject':
                        url = str(settings.BASE_URL)+'customer-api/my-property-project-details'
                        getAPI = requests.request("GET", url, headers=headers, params=payload)
                        apiResponse = getAPI.json()
                        if isinstance(apiResponse.get('data'), dict):
                            apiResponse['data']['is_requested'] = is_requested
                        return Response(apiResponse)
                    
                    #Saleproperty
                    if Type ==  'SaleProperty':
                        url = str(settings.BASE_URL)+'customer-api/sale-property-details'
                        getAPI = requests.request("GET", url, headers=headers, params=payload)
                        apiResponse = getAPI.json()
                        if isinstance(apiResponse.get('data'), dict):
                            apiResponse['data']['is_requested'] = is_requested
                        return Response(apiResponse)
                    #Rentproperty
                    if Type ==  'RentProperty':
                        url = str(settings.BASE_URL)+'customer-api/rent-property-detail'
                        getAPI = requests.request("GET", url, headers=headers, params=payload)
                        apiResponse = getAPI.json()
                        
                        apiResponse['data']['is_requested'] = is_requested
                        return Response(apiResponse)
                    
                    
                    else:
                        return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No Property'},status=status.HTTP_400_BAD_REQUEST)
                except Exception as e:
                    return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        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 myFavouriteBussinessList(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            favourite_obj = BussinessForSaleFavourite.objects.filter(customerId=customerObj)
            allData = []
            for favourite in favourite_obj:
                
                alldata = {
                    'id':favourite.bussiness.id,
                    'short_title':favourite.bussiness.short_title,
                    'image_data':favourite.bussiness.image_data,
                    'company_name':favourite.bussiness.company_name,
                    'description':favourite.bussiness.description,
                    'cost':favourite.bussiness.cost,
                    'total_turnover':favourite.bussiness.total_turnover,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'message':'Bussiness for sale favourite data fetched successfully','data':allData},status=status.HTTP_200_OK)
        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 myFavouritePropertyProject(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            favourite_obj = PropertyProjectFavourite.objects.filter(customerId=customerObj)
            allData = []
            for favourite in favourite_obj:
                alldata = {
                    'id': favourite.property.id,
                    'customer_id':favourite.property.customerId.id,
                    'fullname': favourite.property.customerId.firstName+' '+ favourite.property.customerId.lastName,
                    'property_name':favourite.property.property_name,
                    'location':favourite.property.location,
                    'price':favourite.property.price,
                    'cashflow_pcm':favourite.property.cashflow_pcm,
                    'return_on_investment':favourite.property.return_on_investment,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'message':'Property project favourite data successfully','data':allData},status=status.HTTP_200_OK)
        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 myFavouriteListing(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            property_type = request.GET.get('property_type')
            customerObj=Customer.objects.filter(user=uid).first()
            bussinessSale = BussinessForSaleFavourite.objects.filter(customerId=customerObj,bussiness__end_date__isnull = True)
            houseWantedRent = HouseRentFavourite.objects.filter(customerId=customerObj,house_rent__end_date__isnull = True)
            investmentProject = InvestmentMyProjectFavourite.objects.filter(customerId=customerObj,invest_project__end_date__isnull = True)
            investmentCompany = InvestmentMyCompanyFavourite.objects.filter(customerId=customerObj,invest_company__end_date__isnull = True)
            propertyProject = PropertyProjectFavourite.objects.filter(customerId=customerObj,property__end_date__isnull = True)
            saleProperty = SalePropertyFavourite.objects.filter(customerId=customerObj,sale__end_date__isnull = True)
            rentProperty = RentPropertyFavourite.objects.filter(customerId=customerObj,rent__end_date__isnull = True)
            companyseekingObj = CompanySeekingEquityFavourite.objects.filter(customerId=customerObj,company_seek__end_date__isnull = True)
            propertyDeveloperObj = PropertyDevelopersFavourite.objects.filter(customerId = customerObj,property_developer__end_date__isnull = True )
            allData= []
            if property_type == "BusinessSale":
                for bs in bussinessSale:
                    allData.append({
                            'id': bs.bussiness.id,
                            'customerId': bs.bussiness.customerId.id,
                            'customer_name' : bs.bussiness.customerId.firstName +' '+ bs.bussiness.customerId.lastName,
                            'company_name': bs.bussiness.company_name,
                            'short_title': bs.bussiness.short_title,
                            'image_data':ast.literal_eval(bs.bussiness.image_data),
                            'videos': bs.bussiness.videos,
                            'videos_thumbnail': bs.bussiness.videos_thumbnail,
                            'company_name': bs.bussiness.company_name,
                            'description': bs.bussiness.description,
                            'total_turnover': bs.bussiness.total_turnover,
                            'rent': bs.bussiness.rent,
                            'established_year': bs.bussiness.established_year,
                            'premises': bs.bussiness.premises,
                            'years_of_work': bs.bussiness.years_of_work,
                            'operation_concept': bs.bussiness.operation_concept,
                            'operation_opening_hours': bs.bussiness.operation_opening_hours,
                            'turnover_last_year': bs.bussiness.turnover_last_year,
                            'salary_percentage': bs.bussiness.salary_percentage,
                            'other_operating_cost': bs.bussiness.other_operating_cost,
                            'cost': bs.bussiness.cost,
                            'reason_for_sale':bs.bussiness.reason_for_sale,
                            'website_link':bs.bussiness.website_link,
                            'number_of_employes':bs.bussiness.number_of_employes,
                            'other_operating_cost':bs.bussiness.other_operating_cost,
                            'area':bs.bussiness.area,
                            'term_of_lease': bs.bussiness.term_of_lease,
                            'revenue_growth': bs.bussiness.revenue_growth,
                            'details': bs.bussiness.details,
                            'service':bs.bussiness.service,
                            'operations':bs.bussiness.operations,
                            'market_initatives':bs.bussiness.market_initatives,
                            'advantage_and_oppurtunity':bs.bussiness.advantage_and_oppurtunity,
                            'valuation':bs.bussiness.valuation,
                            'owner_name':bs.bussiness.owner_name,
                            'phone':bs.bussiness.phone,
                            'telephone':bs.bussiness.telephone,
                            'country':bs.bussiness.country,
                            'city':bs.bussiness.city,
                            'email':bs.bussiness.email,
                            'company':bs.bussiness.company,
                            'public_order':bs.bussiness.public_order,
                            'avaiable_attachment':bs.bussiness.avaiable_attachment,
                            'location':bs.bussiness.location,
                            'latitude':bs.bussiness.latitude,
                            'longitude':bs.bussiness.longitude,    
                            'subscription_type':bs.bussiness.subscription_type,
                            'created_date':bs.bussiness.start_date,
                            'type':"BusinessSale"
                    })
            elif property_type == "seeking_equity":
                for cs in companyseekingObj:
                    allData.append({
                        'id': cs.company_seek.id,
                        'customerId' : cs.customerId.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'customer_phone_number' : cs.customerId.phoneNumber,
                        'customer_images' : cs.customerId.profileImage,
                        'company_name':cs.company_seek.company_name,
                        'short_title': cs.company_seek.short_title,
                        'description': cs.company_seek.description,
                        'about_the_owner': cs.company_seek.about_the_owner,
                        'image_data': ast.literal_eval(cs.company_seek.property_image),
                        'videos': cs.company_seek.property_video,
                        'videos_thumbnail': cs.company_seek.videos_thumbnail,
                        'company_logo': cs.company_seek.company_logo,
                        'maximum_drawing': cs.company_seek.maximum_drawing,
                        'minimum_drawing': cs.company_seek.minimum_drawing,
                        'share_for_sale': cs.company_seek.share_for_sale,
                        'price_per_share': cs.company_seek.price_per_share,
                        'number_of_share': cs.company_seek.number_of_share,
                        'self_report': cs.company_seek.self_report,
                        'nominal_share_price': cs.company_seek.nominal_share_price,
                        'e_post': cs.company_seek.e_post,
                        'issue_account_number': cs.company_seek.issue_account_number,
                        'establish_year': cs.company_seek.establish_year,
                        'premises_from': cs.company_seek.premises_from,
                        'background_for_sale': cs.company_seek.background_for_sale,
                        'company_website': cs.company_seek.company_website,
                        'number_of_employee': cs.company_seek.number_of_employee,
                        'company_email': cs.company_seek.company_email,
                        'company_telephone': cs.company_seek.company_telephone,
                        'youtube': cs.company_seek.youtube,
                        'upload_team_data': cs.company_seek.upload_team_data,
                        'upload_board_data': cs.company_seek.upload_board_data,
                        'upload_partner_data': cs.company_seek.upload_partner_data,
                        'location': cs.company_seek.location,
                        'country': cs.company_seek.country,
                        'state': cs.company_seek.state,
                        'city': cs.company_seek.city,
                        'zip_code': cs.company_seek.zip_code,
                        'landmark': cs.company_seek.landmark,
                        'share_holder_image': cs.company_seek.share_holder_image,
                        'enter_shares': cs.company_seek.enter_shares,
                        'status': cs.company_seek.status,
                        'agency': cs.company_seek.agency.id if cs.company_seek.agency else None,
                        'subscription_type': cs.company_seek.subscription_type,
                        'latitude': cs.company_seek.latitude,
                        'longitude': cs.company_seek.longitude,
                        'start_date': cs.company_seek.start_date,
                        'end_date': cs.company_seek.end_date,
                          'type':"seeking_equity"
                    })
     
            elif property_type == "HouseRent":
                for hWr in houseWantedRent:
                    allData.append({
                        'id': hWr.house_rent.id,
                        'short_title':hWr.house_rent.short_title,
                        'customer_id':hWr.house_rent.customerId.id,
                        'fullname': hWr.house_rent.first_name+' '+ hWr.house_rent.last_name,
                        
                        'profile_visiblity':hWr.house_rent.profile_visiblity,
                        'profile_hidden':hWr.house_rent.profile_hidden,
                        'image_data': ast.literal_eval(hWr.house_rent.image),
                        'first_name': hWr.house_rent.first_name,
                        'last_name': hWr.house_rent.last_name,
                        'gender': hWr.house_rent.gender,
                        'dob': hWr.house_rent.dob,
                        'nationality': hWr.house_rent.nationality,
                        'phone_number':hWr.house_rent.phone_number,
                        'email': hWr.house_rent.email,
                        'quantity': hWr.house_rent.quantity,
                        'rental_period': hWr.house_rent.rental_period,
                        'max_rent': hWr.house_rent.max_rent,
                        'from_date': hWr.house_rent.from_date,
                        'housing_type':ast.literal_eval(hWr.house_rent.housing_type),
                        'number_of_people':hWr.house_rent.number_of_people,
                        'max_month_price': hWr.house_rent.max_month_price,
                        'desired_start_date':hWr.house_rent.desired_start_date,
                        'desired_area': hWr.house_rent.desired_area,
                        'latitude':hWr.house_rent.latitude,
                        'longitude':hWr.house_rent.longitude,
                        'country':hWr.house_rent.country,
                        'state':hWr.house_rent.state,
                        'city':hWr.house_rent.city,
                        'postal_code':hWr.house_rent.postal_code,
                        'landmark':hWr.house_rent.landmark,
                        'location':hWr.house_rent.location,
                        'about':hWr.house_rent.about,
                        'education':hWr.house_rent.education,
                        'martial_status':hWr.house_rent.martial_status,
                        'cleanliness':hWr.house_rent.cleanliness,
                        'party_habits':hWr.house_rent.party_habits,
                        'work':hWr.house_rent.work,
                        'interest':hWr.house_rent.interest,
                        'type':"HouseRent"
                        })
            elif property_type == "InvestmentProject":
                for ip in investmentProject:
                    allData.append({
                            'id': ip.invest_project.id,
                            'customer_id':ip.invest_project.customerId.id,
                            'fullname': ip.invest_project.customerId.firstName+' '+ ip.invest_project.customerId.lastName,
                            'property_name':ip.invest_project.property_name,
                            'image_data':ip.invest_project.image_data,
                            'videos':ip.invest_project.videos,
                            'documents_data':ip.invest_project.documents_data,
                            'property_type':ip.invest_project.property_type,
                            'assest_equality':ip.invest_project.assest_equality,
                            'investment_highlight':ip.invest_project.investment_highlight,
                            'equity_price':ip.invest_project.equity_price,
                            'lp_equity_percent':ip.invest_project.lp_equity_percent,
                            'gp_equity_percent':ip.invest_project.gp_equity_percent,
                            'debt_percent':ip.invest_project.debt_percent,
                            'property_at_glance_title':ip.invest_project.property_at_glance_title,
                            'description':ip.invest_project.description,
                            'bussiness_plan':ip.invest_project.bussiness_plan,
                            'minimum_investment':ip.invest_project.minimum_investment,
                            'investment_strategy':ip.invest_project.investment_strategy,
                            'expected_attitude_price':ip.invest_project.expected_attitude_price,
                            'financed':ip.invest_project.financed,
                            'target_return_on_cost':ip.invest_project.target_return_on_cost,
                            'target_irr':ip.invest_project.target_irr,
                            'lp_equity_percent':ip.invest_project.lp_equity_percent,
                            'offered_by':ip.invest_project.offered_by,
                            'estimated_first_distribution':ip.invest_project.estimated_first_distribution,
                            'type_of_investment':ip.invest_project.type_of_investment,
                            'phone_number':ip.invest_project.phone_number,
                            'measure_for_multiplier':ip.invest_project.measure_for_multiplier,
                            'address':ip.invest_project.address,
                            'location_details':ip.invest_project.location_details,
                            'property_summary':ip.invest_project.property_summary,
                            'property_details':ip.invest_project.property_details,
                            'overview':ip.invest_project.overview,
                            'debt_assumption':ip.invest_project.debt_assumption,
                            'location':ip.invest_project.location,
                            'latitude':ip.invest_project.latitude,
                            'longitude':ip.invest_project.longitude,
                            'subscription_type':ip.invest_project.subscription_type,
                            'status':ip.invest_project.status,
                            'is_draft':ip.invest_project.is_draft,
                            'type':"InvestmentProject"
                        })
            elif property_type == "InvestmentCompany":		
                for ic in investmentCompany:
                    allData.append({
                        'id': ic.invest_company.id,
                        'company_logo':ic.invest_company.company_logo,
                        'company_video':ic.invest_company.company_video,
                        'customer_id':ic.invest_company.customerId.id,
                        'fullname': ic.invest_company.customerId.firstName+' '+ ic.invest_company.customerId.lastName,
                        'property_name' :ic.invest_company.property_name,
                        'documents_data':ic.invest_company.documents_data,
                        'property_type' :ic.invest_company.property_type,
                        'company_established' :ic.invest_company.company_established,
                        'company_email' :ic.invest_company.company_email,
                        'company_phonenumber':ic.invest_company.company_phonenumber,
                        'company_address' :ic.invest_company.company_address,
                        'shareholders' :ic.invest_company.shareholders,
                        'share' :ic.invest_company.share,
                        'description' :ic.invest_company.description,
                        'the_valuation' :ic.invest_company.the_valuation,
                        'shares_for_sale' :ic.invest_company.shares_for_sale,
                        'price_per_share' :ic.invest_company.price_per_share,
                        'postal_code' :ic.invest_company.postal_code,
                        'bank_acc_created' :ic.invest_company.bank_acc_created,
                        'issue_account_no' :ic.invest_company.issue_account_no,
                        'post_number' :ic.invest_company.post_number,
                        'self_report' :ic.invest_company.self_report,
                        'minimum_drawing' :ic.invest_company.minimum_drawing,
                        'max_drawing' :ic.invest_company.max_drawing,
                        'remaninig_shares' :ic.invest_company.remaninig_shares,
                        'no_share_bfr_issue' :ic.invest_company.no_share_bfr_issue,
                        'nominal_share_price' :ic.invest_company.nominal_share_price,
                        'company_website' :ic.invest_company.company_website,
                        'subscription_type' :ic.invest_company.subscription_type,
                        'status' :ic.invest_company.status,
                        'is_draft' :ic.invest_company.is_draft,
                        'agency' :ic.invest_company.agency,
                        "location": ic.invest_company.location,
                        'latitude': ic.invest_company.latitude,
                        'longitude': ic.invest_company.longitude,
                        'type':"InvestmentCompany"
                        })
     
            elif property_type == "PropertyProject":	
                for pp in propertyProject:
                    allData.append({
                        'id': pp.property.id,
                        # 'customer_id':pp.property.customerId.id,
                        # 'fullname': pp.property.customerId.firstName+' '+ pp.property.customerId.lastName,
                        # 'customer_image':pp.property.customerId.profileImage,
                        'spend_too_much_time':pp.property.spend_too_much_time,
                        'most_useless_skill':pp.property.most_useless_skill,
                        'fun_act':pp.property.fun_act,
                        'biography':pp.property.biography,
                        'short_title':pp.property.short_title,
                        'property_overview':pp.property.property_overview,
                        'property_description':pp.property.property_description,
                        'image_data': ast.literal_eval(pp.property.image_data),
                        'videos':pp.property.videos,
                        'videos_thumbnail':pp.property.videos_thumbnail,
                        'property_document':pp.property.property_document,
                        'category':pp.property.category,
                        'property_name':pp.property.property_name,
                        'property_dimension':pp.property.property_dimension,
                        'country':pp.property.country,
                        'state':pp.property.state,
                        'city':pp.property.city,
                        'postal_code':pp.property.postal_code,
                        'landmark':pp.property.landmark,
                        'house_number':pp.property.house_number,
                        'location':pp.property.location,
                        'latitude':pp.property.latitude,
                        'longitude':pp.property.longitude,
                        'facility':ast.literal_eval(pp.property.facility),
                        'benefits':ast.literal_eval(pp.property.benefits),
                        'return_on_investment':pp.property.return_on_investment,
                        'finder_fee':pp.property.finder_fee,
                        'gross_income':pp.property.gross_income,
                        'price':pp.property.price,
                        'cashflow_pcm':pp.property.cashflow_pcm,
                        'total_termination_fee':pp.property.total_termination_fee,
                        'purchase_price':pp.property.purchase_price,
                        'potential_cashflow_pcm':pp.property.potential_cashflow_pcm,
                        'investment_finder_fee':pp.property.investment_finder_fee,
                        'investment_return_on_investment_fee':pp.property.investment_return_on_investment_fee,
                        'rental':pp.property.rental,
                        'the_vision':pp.property.the_vision,
                        'cost_to_consider':pp.property.cost_to_consider,
                        'capital_required':pp.property.capital_required,
                        'cashflow_forecast':pp.property.cashflow_forecast,
                        'investment_finder_fee':pp.property.investment_finder_fee,
                        'rent_to_landlord':pp.property.rent_to_landlord,
                        'bill_utilities':pp.property.bill_utilities,
                        'type':"PropertyProject"})
     
            elif property_type == "SaleProperty":	
                for saleobj in saleProperty:
                        allData.append({
                            'id':saleobj.sale.id,
                            'customer_id':saleobj.sale.customerId.id,
                            'fullname': saleobj.sale.customerId.firstName+' '+ saleobj.sale.customerId.lastName,
                            'customer_image':saleobj.sale.customerId.profileImage,
                            'title':saleobj.sale.title,
                            'main_category': saleobj.sale.main_category,
                            'sub_category': saleobj.sale.subCategory,
                            'image_data' : ast.literal_eval(saleobj.sale.image_data),
                            'video': saleobj.sale.video,
                            'videos_thumbnail': saleobj.sale.videos_thumbnail,

                            'property_name': saleobj.sale.property_name,
                            'house_number': saleobj.sale.house_number,
                            'postal_code': saleobj.sale.postal_code,
                            'youtubeUrl': saleobj.sale.youtubeUrl,
                            'phoneNumber': saleobj.sale.phoneNumber,
                            'price': saleobj.sale.price,
                            'property_demension': saleobj.sale.property_demension,
                            'vision': saleobj.sale.vision,
                            'rental': saleobj.sale.rental,
                            'descriptioon': saleobj.sale.descriptioon,
                            'closingFee': saleobj.sale.closingFee,
                            'bedrooms': saleobj.sale.bedrooms,
                            'bathrooms': saleobj.sale.bathrooms,
                            'readyBy': saleobj.sale.readyBy,
                            'propertyReferenceId': saleobj.sale.propertyReferenceId,
                            'maintenanceFee': saleobj.sale.maintenanceFee,
                            'state':saleobj.sale.state,
                            'city':saleobj.sale.city,
                               'country':saleobj.sale.country,
        
                            'cashflow_forecast': saleobj.sale.cashflow_forecast,
                            'disclaimer':saleobj.sale.disclaimer,
                            'property_information':saleobj.sale.property_information,
                            'required_capital':saleobj.sale.required_capital,
                            'residental_property_details':saleobj.sale.residental_property_details,
                            'facilities':ast.literal_eval(saleobj.sale.facilities),
                            'location':saleobj.sale.location,
                            'latitude':saleobj.sale.latitude,
                            'longitude':saleobj.sale.longitude,
                            'subscription_type':saleobj.sale.subscription_type,
                            'is_draft':saleobj.sale.is_draft,

                            'type':"SaleProperty"})
            elif property_type == "RentProperty":
                for rp in rentProperty:
                        allData.append({
                            'id':rp.rent.id,
                            'customer_id':rp.rent.customerId.id,
                            'fullname': rp.rent.customerId.firstName+' '+ rp.rent.customerId.lastName,
                            'customer_image':rp.rent.customerId.profileImage,
                            'title':rp.rent.title,
                            'category': rp.rent.category,
                            'sub_category': rp.rent.subCategory,
                            'image_data':  ast.literal_eval(rp.rent.image_data),
                            'video':rp.rent.video,
                            'floor': rp.rent.floor,
                            'rooms': rp.rent.rooms,
                            'bedrooms': rp.rent.bedrooms,
                            'size': rp.rent.size,
                            'country' : rp.rent.country,
                            'state' : rp.rent.state,
                            'city' :rp.rent.city,
                            'postal_code' : rp.rent.postal_code,
                            'house_number' : rp.rent.house_number,
                            'facilites': ast.literal_eval(rp.rent.facilites),
                            'deposit': rp.rent.deposit,
                            'rental_period': rp.rent.rental_period,
                            'avaiable_from_date': rp.rent.avaiable_from_date,
                            'monthly_rent': rp.rent.monthly_rent,
                            'monthly_rent_includes': rp.rent.monthly_rent_includes,
                            'security': rp.rent.security,
                            'security_amount': rp.rent.security_amount,
                            'heading': rp.rent.heading,
                            'description': rp.rent.description,
                            'display_information': rp.rent.display_information,
                            'name_of_ad': rp.rent.name_of_ad,
                            'visibilty': rp.rent.visibilty,
                            'location': rp.rent.location,
                            'latitude': rp.rent.latitude,
                            'longitude':rp.rent.longitude,
                            'subscription_type':rp.rent.subscription_type,
                            'is_draft': rp.rent.is_draft,
                
                            'property_overview': rp.rent.property_overview,
                            'type_property': rp.rent.type_property,
                            'description_home': rp.rent.description_home,
                            'spend_time': rp.rent.spend_time,
                            'useless_skill': rp.rent.useless_skill,
                            'fun_act': rp.rent.fun_act,
                            'biography': rp.rent.biography,
                            'primary_room': rp.rent.primary_room,
                            'housing_type': rp.rent.housing_type,
                            'key_info_bedroom': rp.rent.key_info_bedroom,
                            'story': rp.rent.story,
                            'type':"RentProperty"})
            elif property_type == 'property_developers':
                    for dev in propertyDeveloperObj:
                        allData.append({
                            'id': dev.property_developer.id,
                            'customer_id': dev.property_developer.customerId_id,
                            'image_data':  ast.literal_eval(dev.property_developer.property_image),
                            'videos': dev.property_developer.videos,
                            'videos_thumbnail': dev.property_developer.videos_thumbnail,
                            'document': dev.property_developer.document,
                            'property_name':dev.property_developer.property_name,
                            'property_type': dev.property_developer.property_type,
                            'assest_equality': dev.property_developer.assest_equality,
                            'investment_highlight': dev.property_developer.investment_highlight,
                            'equity_price': dev.property_developer.equity_price,
                            'lp_equity_percent': dev.property_developer.lp_equity_percent,
                            'gp_equity_percent': dev.property_developer.gp_equity_percent,
                            'debt_percent': dev.property_developer.debt_percent,
                            'short_title': dev.property_developer.short_title,
                            'description': dev.property_developer.description,
                            'bussiness_plan': dev.property_developer.bussiness_plan,
                            'minimum_investment': dev.property_developer.minimum_investment,
                            'investment_strategy': dev.property_developer.investment_strategy,
                            'expected_period': dev.property_developer.expected_period,
                            'financed': dev.property_developer.financed,
                            'target_return_on_cost': dev.property_developer.target_return_on_cost,
                            'target_irr': dev.property_developer.target_irr,
                            'offered_by': dev.property_developer.offered_by,
                            'estimated_first_distribution': dev.property_developer.estimated_first_distribution,
                            'type_of_investment': dev.property_developer.type_of_investment,
                            'phone_number': dev.property_developer.phone_number,
                            'measure_of_multiplier': dev.property_developer.measure_of_multiplier,
                            'address': dev.property_developer.address,
                            'minimum_goal': dev.property_developer.minimum_goal,
                            'nominal_share_price': dev.property_developer.nominal_share_price,
                            'the_valuation': dev.property_developer.the_valuation,
                            'minimum_drawing': dev.property_developer.minimum_drawing,
                            'no_of_drawings': dev.property_developer.no_of_drawings,
                            'share_for_sale': dev.property_developer.share_for_sale,
                            'remaining_share': dev.property_developer.remaining_share,
                            'maximum_drawing': dev.property_developer.maximum_drawing,
                            'short_description': dev.property_developer.short_description,
                            'why_invest': dev.property_developer.why_invest,
                            'problem_to_be_solved': dev.property_developer.problem_to_be_solved,
                            'our_solution': dev.property_developer.our_solution,
                            'start_date_data': dev.property_developer.start_date_data,
                            'end_date_data': dev.property_developer.end_date_data,
                            'number_of_share': dev.property_developer.number_of_share,
                            'price_of_share': dev.property_developer.price_of_share,
                            'issue_minimum_investment': dev.property_developer.issue_minimum_investment,
                            'issue_maximum_investment': dev.property_developer.issue_maximum_investment,
                            'value_before_issue': dev.property_developer.value_before_issue,
                            'raised_capital_minimum_limit': dev.property_developer.raised_capital_minimum_limit,
                            'raised_capital_maximum_limit': dev.property_developer.raised_capital_maximum_limit,
                            'share_of_company_sold_minimum_limit': dev.property_developer.share_of_company_sold_minimum_limit,
                            'share_of_company_sold_maximum_limit': dev.property_developer.share_of_company_sold_maximum_limit,
                            'self_report': dev.property_developer.self_report,
                            'discussion_description': dev.property_developer.discussion_description,
                            'new_exisiting_details': dev.property_developer.new_exisiting_details,
                            'drawing_on_behalf': dev.property_developer.drawing_on_behalf,
                            'foundation': dev.property_developer.foundation,
                            'satutes': dev.property_developer.satutes,
                            'annual_account': dev.property_developer.annual_account,
                            'valuation': dev.property_developer.valuation,
                            'agreement_on_co': dev.property_developer.agreement_on_co,
                            'conversion_of_debt': dev.property_developer.conversion_of_debt,
                            'balance_sheet': dev.property_developer.balance_sheet,
                            'result_report': dev.property_developer.result_report,
                            'country': dev.property_developer.country,
                            'state': dev.property_developer.state,
                            'city': dev.property_developer.city,
                            'postal_code': dev.property_developer.postal_code,
                            'landmark': dev.property_developer.landmark,
                            'house_number': dev.property_developer.house_number,
                            'location': dev.property_developer.location,
                            'latitude': dev.property_developer.latitude,
                            'longitude': dev.property_developer.longitude,
                            'agency': dev.property_developer.agency_id,
                            'status': dev.property_developer.status,
                               'type':"property_developer"
                        })

            else:
                    for bs in bussinessSale:
                        allData.append({
                            'id': bs.bussiness.id,
                            'customer_name' : bs.bussiness.customerId.firstName +' '+ bs.bussiness.customerId.lastName,
                            'company_name': bs.bussiness.company_name,
                            'short_title': bs.bussiness.short_title,
                            'image_data':ast.literal_eval(bs.bussiness.image_data),
                            'videos': bs.bussiness.videos,
                            'videos_thumbnail': bs.bussiness.videos_thumbnail,
                            'company_name': bs.bussiness.company_name,
                            'description': bs.bussiness.description,
                            'total_turnover': bs.bussiness.total_turnover,
                            'rent': bs.bussiness.rent,
                            'established_year': bs.bussiness.established_year,
                            'premises': bs.bussiness.premises,
                            'years_of_work': bs.bussiness.years_of_work,
                            'operation_concept': bs.bussiness.operation_concept,
                            'operation_opening_hours': bs.bussiness.operation_opening_hours,
                            'turnover_last_year': bs.bussiness.turnover_last_year,
                            'salary_percentage': bs.bussiness.salary_percentage,
                            'other_operating_cost': bs.bussiness.other_operating_cost,
                            'cost': bs.bussiness.cost,
                            'reason_for_sale':bs.bussiness.reason_for_sale,
                            'website_link':bs.bussiness.website_link,
                            'number_of_employes':bs.bussiness.number_of_employes,
                            'other_operating_cost':bs.bussiness.other_operating_cost,
                            'area':bs.bussiness.area,
                            'term_of_lease': bs.bussiness.term_of_lease,
                            'revenue_growth': bs.bussiness.revenue_growth,
                            'details': bs.bussiness.details,
                            'service':bs.bussiness.service,
                            'operations':bs.bussiness.operations,
                            'market_initatives':bs.bussiness.market_initatives,
                            'advantage_and_oppurtunity':bs.bussiness.advantage_and_oppurtunity,
                            'valuation':bs.bussiness.valuation,
                            'owner_name':bs.bussiness.owner_name,
                            'phone':bs.bussiness.phone,
                            'telephone':bs.bussiness.telephone,
                            'email':bs.bussiness.email,
                            'company':bs.bussiness.company,
                            'public_order':bs.bussiness.public_order,
                            'avaiable_attachment':bs.bussiness.avaiable_attachment,
                            'location':bs.bussiness.location,
                            'latitude':bs.bussiness.latitude,
                            'longitude':bs.bussiness.longitude,    
                            'subscription_type':bs.bussiness.subscription_type,
                            'created_date':bs.bussiness.start_date,
                            'type':"BusinessSale"
                        })
      
                    for cs in companyseekingObj:
                        allData.append({
                            'id': cs.company_seek.id,
                            'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                            'customer_id' : cs.customerId.id,
                            'customer_phone_number' : cs.customerId.phoneNumber,
                            'customer_images' : cs.customerId.profileImage,
                            'company_name':cs.company_seek.company_name,
                            'short_title': cs.company_seek.short_title,
                            'description': cs.company_seek.description,
                            'about_the_owner': cs.company_seek.about_the_owner,
                            'image_data': ast.literal_eval(cs.company_seek.property_image),
                            'videos': cs.company_seek.property_video,
                            'videos_thumbnail': cs.company_seek.videos_thumbnail,
                            'company_logo': cs.company_seek.company_logo,
                            'maximum_drawing': cs.company_seek.maximum_drawing,
                            'minimum_drawing': cs.company_seek.minimum_drawing,
                            'share_for_sale': cs.company_seek.share_for_sale,
                            'price_per_share': cs.company_seek.price_per_share,
                            'number_of_share': cs.company_seek.number_of_share,
                            'self_report': cs.company_seek.self_report,
                            'nominal_share_price': cs.company_seek.nominal_share_price,
                            'e_post': cs.company_seek.e_post,
                            'issue_account_number': cs.company_seek.issue_account_number,
                            'establish_year': cs.company_seek.establish_year,
                            'premises_from': cs.company_seek.premises_from,
                            'background_for_sale': cs.company_seek.background_for_sale,
                            'company_website': cs.company_seek.company_website,
                            'number_of_employee': cs.company_seek.number_of_employee,
                            'company_email': cs.company_seek.company_email,
                            'company_telephone': cs.company_seek.company_telephone,
                            'youtube': cs.company_seek.youtube,
                            'upload_team_data': cs.company_seek.upload_team_data,
                            'upload_board_data': cs.company_seek.upload_board_data,
                            'upload_partner_data': cs.company_seek.upload_partner_data,
                            'location': cs.company_seek.location,
                            'country': cs.company_seek.country,
                            'state': cs.company_seek.state,
                            'city': cs.company_seek.city,
                            'zip_code': cs.company_seek.zip_code,
                            'landmark': cs.company_seek.landmark,
                            'share_holder_image': cs.company_seek.share_holder_image,
                            'enter_shares': cs.company_seek.enter_shares,
                            'status': cs.company_seek.status,
                            'agency': cs.company_seek.agency.id if cs.company_seek.agency else None,
                            'subscription_type': cs.company_seek.subscription_type,
                            'latitude': cs.company_seek.latitude,
                            'longitude': cs.company_seek.longitude,
                            'start_date': cs.company_seek.start_date,
                            'end_date': cs.company_seek.end_date,
                            'type':"seeking_equity"
                        })
        
                    for hWr in houseWantedRent:
                        allData.append({
                            'id': hWr.house_rent.id,
                            'short_title':hWr.house_rent.short_title,
                            'customer_id':hWr.house_rent.customerId.id,
                            'fullname': hWr.house_rent.first_name+' '+ hWr.house_rent.last_name,
                            
                            'profile_visiblity':hWr.house_rent.profile_visiblity,
                            'profile_hidden':hWr.house_rent.profile_hidden,
                            'image': ast.literal_eval(hWr.house_rent.image),
                            'first_name': hWr.house_rent.first_name,
                            'last_name': hWr.house_rent.last_name,
                            'gender': hWr.house_rent.gender,
                            'dob': hWr.house_rent.dob,
                            'nationality': hWr.house_rent.nationality,
                            'phone_number':hWr.house_rent.phone_number,
                            'email': hWr.house_rent.email,
                            'quantity': hWr.house_rent.quantity,
                            'rental_period': hWr.house_rent.rental_period,
                            'max_rent': hWr.house_rent.max_rent,
                            'from_date': hWr.house_rent.from_date,
                            'housing_type':hWr.house_rent.housing_type,
                            'number_of_people':hWr.house_rent.number_of_people,
                            'max_month_price': hWr.house_rent.max_month_price,
                            'desired_start_date':hWr.house_rent.desired_start_date,
                            'desired_area': hWr.house_rent.desired_area,
                            'latitude':hWr.house_rent.latitude,
                            'longitude':hWr.house_rent.longitude,
                            'location':hWr.house_rent.location,
                            'about':hWr.house_rent.about,
                            'education':hWr.house_rent.education,
                            'martial_status':hWr.house_rent.martial_status,
                            'cleanliness':hWr.house_rent.cleanliness,
                            'party_habits':hWr.house_rent.party_habits,
                            'work':hWr.house_rent.work,
                            'interest':hWr.house_rent.interest,
                            'type':"HouseRent"
                            })
                    for ip in investmentProject:
                        allData.append({
                                'id': ip.invest_project.id,
                                'customer_id':ip.invest_project.customerId.id,
                                'fullname': ip.invest_project.customerId.firstName+' '+ ip.invest_project.customerId.lastName,
                                'property_name':ip.invest_project.property_name,
                                'image_data':ip.invest_project.image_data,
                                'videos':ip.invest_project.videos,
                                'documents_data':ip.invest_project.documents_data,
                                'property_type':ip.invest_project.property_type,
                                'assest_equality':ip.invest_project.assest_equality,
                                'investment_highlight':ip.invest_project.investment_highlight,
                                'equity_price':ip.invest_project.equity_price,
                                'lp_equity_percent':ip.invest_project.lp_equity_percent,
                                'gp_equity_percent':ip.invest_project.gp_equity_percent,
                                'debt_percent':ip.invest_project.debt_percent,
                                'property_at_glance_title':ip.invest_project.property_at_glance_title,
                                'description':ip.invest_project.description,
                                'bussiness_plan':ip.invest_project.bussiness_plan,
                                'minimum_investment':ip.invest_project.minimum_investment,
                                'investment_strategy':ip.invest_project.investment_strategy,
                                'expected_attitude_price':ip.invest_project.expected_attitude_price,
                                'financed':ip.invest_project.financed,
                                'target_return_on_cost':ip.invest_project.target_return_on_cost,
                                'target_irr':ip.invest_project.target_irr,
                                'lp_equity_percent':ip.invest_project.lp_equity_percent,
                                'offered_by':ip.invest_project.offered_by,
                                'estimated_first_distribution':ip.invest_project.estimated_first_distribution,
                                'type_of_investment':ip.invest_project.type_of_investment,
                                'phone_number':ip.invest_project.phone_number,
                                'measure_for_multiplier':ip.invest_project.measure_for_multiplier,
                                'address':ip.invest_project.address,
                                'location_details':ip.invest_project.location_details,
                                'property_summary':ip.invest_project.property_summary,
                                'property_details':ip.invest_project.property_details,
                                'overview':ip.invest_project.overview,
                                'debt_assumption':ip.invest_project.debt_assumption,
                                'location':ip.invest_project.location,
                                'latitude':ip.invest_project.latitude,
                                'longitude':ip.invest_project.longitude,
                                'subscription_type':ip.invest_project.subscription_type,
                                'status':ip.invest_project.status,
                                'is_draft':ip.invest_project.is_draft,
                                'type':"InvestmentProject"
                            })
                    for ic in investmentCompany:
                        allData.append({
                            'id': ic.invest_company.id,
                            'company_logo':ic.invest_company.company_logo,
                            'company_video':ic.invest_company.company_video,
                            'customer_id':ic.invest_company.customerId.id,
                            'fullname': ic.invest_company.customerId.firstName+' '+ ic.invest_company.customerId.lastName,
                            'property_name' :ic.invest_company.property_name,
                            'documents_data':ic.invest_company.documents_data,
                            'property_type' :ic.invest_company.property_type,
                            'company_established' :ic.invest_company.company_established,
                            'company_email' :ic.invest_company.company_email,
                            'company_phonenumber':ic.invest_company.company_phonenumber,
                            'company_address' :ic.invest_company.company_address,
                            'shareholders' :ic.invest_company.shareholders,
                            'share' :ic.invest_company.share,
                            'description' :ic.invest_company.description,
                            'the_valuation' :ic.invest_company.the_valuation,
                            'shares_for_sale' :ic.invest_company.shares_for_sale,
                            'price_per_share' :ic.invest_company.price_per_share,
                            'postal_code' :ic.invest_company.postal_code,
                            'bank_acc_created' :ic.invest_company.bank_acc_created,
                            'issue_account_no' :ic.invest_company.issue_account_no,
                            'post_number' :ic.invest_company.post_number,
                            'self_report' :ic.invest_company.self_report,
                            'minimum_drawing' :ic.invest_company.minimum_drawing,
                            'max_drawing' :ic.invest_company.max_drawing,
                            'remaninig_shares' :ic.invest_company.remaninig_shares,
                            'no_share_bfr_issue' :ic.invest_company.no_share_bfr_issue,
                            'nominal_share_price' :ic.invest_company.nominal_share_price,
                            'company_website' :ic.invest_company.company_website,
                            'subscription_type' :ic.invest_company.subscription_type,
                            'status' :ic.invest_company.status,
                            'is_draft' :ic.invest_company.is_draft,
                            'agency' :ic.invest_company.agency,
                            "location": ic.invest_company.location,
                            'latitude': ic.invest_company.latitude,
                            'longitude': ic.invest_company.longitude,
                            'type':"InvestmentCompany"
                            })
        
                    for pp in propertyProject:
                        allData.append({
                            'id': pp.property.id,
                            'customer_id':pp.property.customerId.id,
                            'fullname': pp.property.customerId.firstName+' '+ pp.property.customerId.lastName,
                            'customer_image':pp.property.customerId.profileImage,
                            'spend_too_much_time':pp.property.spend_too_much_time,
                            'most_useless_skill':pp.property.most_useless_skill,
                            'fun_act':pp.property.fun_act,
                            'biography':pp.property.biography,
                            'short_title':pp.property.short_title,
                            'property_overview':pp.property.property_overview,
                            'property_description':pp.property.property_description,
                            'image_data': ast.literal_eval(pp.property.image_data),
                            'videos':pp.property.videos,
                            'videos_thumbnail':pp.property.videos_thumbnail,
                            'property_document':pp.property.property_document,
                            'category':pp.property.category,
                            'property_name':pp.property.property_name,
                            'property_dimension':pp.property.property_dimension,
                            'country':pp.property.country,
                            'state':pp.property.state,
                            'city':pp.property.city,
                            'postal_code':pp.property.postal_code,
                            'landmark':pp.property.landmark,
                            'house_number':pp.property.house_number,
                            'location':pp.property.location,
                            'latitude':pp.property.latitude,
                            'longitude':pp.property.longitude,
                            'facility':ast.literal_eval(pp.property.facility),
                            'benefits':ast.literal_eval(pp.property.benefits),
                            'return_on_investment':pp.property.return_on_investment,
                            'finder_fee':pp.property.finder_fee,
                            'gross_income':pp.property.gross_income,
                            'price':pp.property.price,
                            'cashflow_pcm':pp.property.cashflow_pcm,
                            'total_termination_fee':pp.property.total_termination_fee,
                            'purchase_price':pp.property.purchase_price,
                            'potential_cashflow_pcm':pp.property.potential_cashflow_pcm,
                            'investment_finder_fee':pp.property.investment_finder_fee,
                            'investment_return_on_investment_fee':pp.property.investment_return_on_investment_fee,
                            'rental':pp.property.rental,
                            'the_vision':pp.property.the_vision,
                            'cost_to_consider':pp.property.cost_to_consider,
                            'capital_required':pp.property.capital_required,
                            'cashflow_forecast':pp.property.cashflow_forecast,
                            'investment_finder_fee':pp.property.investment_finder_fee,
                            'rent_to_landlord':pp.property.rent_to_landlord,
                            'bill_utilities':pp.property.bill_utilities,
                            'type':"PropertyProject"})
        
                    for saleobj in saleProperty:
                            allData.append({
                                'id':saleobj.sale.id,
                                'customer_id':saleobj.sale.customerId.id,
                                'fullname': saleobj.sale.customerId.firstName+' '+ saleobj.sale.customerId.lastName,
                                'customer_image':saleobj.sale.customerId.profileImage,
                                'title':saleobj.sale.title,
                                'main_category': saleobj.sale.main_category,
                                'sub_category': saleobj.sale.subCategory,
                                'image_data' : ast.literal_eval(saleobj.sale.image_data),
                                'video': saleobj.sale.video,
                                'videos_thumbnail': saleobj.sale.videos_thumbnail,

                                'property_name': saleobj.sale.property_name,
                                'house_number': saleobj.sale.house_number,
                                'postal_code': saleobj.sale.postal_code,
                                'youtubeUrl': saleobj.sale.youtubeUrl,
                                'phoneNumber': saleobj.sale.phoneNumber,
                                'price': saleobj.sale.price,
                                'property_demension': saleobj.sale.property_demension,
                                'vision': saleobj.sale.vision,
                                'rental': saleobj.sale.rental,
                                'descriptioon': saleobj.sale.descriptioon,
                                'closingFee': saleobj.sale.closingFee,
                                'bedrooms': saleobj.sale.bedrooms,
                                'bathrooms': saleobj.sale.bathrooms,
                                'readyBy': saleobj.sale.readyBy,
                                'propertyReferenceId': saleobj.sale.propertyReferenceId,
                                'maintenanceFee': saleobj.sale.maintenanceFee,
                                'state':saleobj.sale.state,
                                'city':saleobj.sale.city,
                                'country':saleobj.sale.country,
            
                                'cashflow_forecast': saleobj.sale.cashflow_forecast,
                                'disclaimer':saleobj.sale.disclaimer,
                                'property_information':saleobj.sale.property_information,
                                'required_capital':saleobj.sale.required_capital,
                                'residental_property_details':saleobj.sale.residental_property_details,
                                'facilities':ast.literal_eval(saleobj.sale.facilities),
                                'location':saleobj.sale.location,
                                'latitude':saleobj.sale.latitude,
                                'longitude':saleobj.sale.longitude,
                                'subscription_type':saleobj.sale.subscription_type,
                                'is_draft':saleobj.sale.is_draft,
                                'type':"SaleProperty"})
                    for rp in rentProperty:
                            allData.append({
                                'id':rp.rent.id,
                                'customer_id':rp.rent.customerId.id,
                                'fullname': rp.rent.customerId.firstName+' '+ rp.rent.customerId.lastName,
                                'customer_image':rp.rent.customerId.profileImage,
                                'title':rp.rent.title,
                                'category': rp.rent.category,
                                'sub_category': rp.rent.subCategory,
                                'image_data':  ast.literal_eval(rp.rent.image_data),
                                'video':rp.rent.video,
                                'floor': rp.rent.floor,
                                'rooms': rp.rent.rooms,
                                'bedrooms': rp.rent.bedrooms,
                                'size': rp.rent.size,
                                'facilites': ast.literal_eval(rp.rent.facilites),
                                'deposit': rp.rent.deposit,
                                'rental_period': rp.rent.rental_period,
                                'avaiable_from_date': rp.rent.avaiable_from_date,
                                'monthly_rent': rp.rent.monthly_rent,
                                'monthly_rent_includes': rp.rent.monthly_rent_includes,
                                'security': rp.rent.security,
                                'security_amount': rp.rent.security_amount,
                                'heading': rp.rent.heading,
                                'description': rp.rent.description,
                                'display_information': rp.rent.display_information,
                                'name_of_ad': rp.rent.name_of_ad,
                                'visibilty': rp.rent.visibilty,
                                'location': rp.rent.location,
                                'latitude': rp.rent.latitude,
                                'longitude':rp.rent.longitude,
                                'subscription_type':rp.rent.subscription_type,
                                'is_draft': rp.rent.is_draft,
                    
                                'property_overview': rp.rent.property_overview,
                                'type_property': rp.rent.type_property,
                                'description_home': rp.rent.description_home,
                                'spend_time': rp.rent.spend_time,
                                'useless_skill': rp.rent.useless_skill,
                                'fun_act': rp.rent.fun_act,
                                'biography': rp.rent.biography,
                                'primary_room': rp.rent.primary_room,
                                'housing_type': rp.rent.housing_type,
                                'key_info_bedroom': rp.rent.key_info_bedroom,
                                'story': rp.rent.story,
                                'type':"RentProperty"})
            
                    for dev in propertyDeveloperObj:
                        allData.append({
                            'id': dev.property_developer.id,
                            'customer_id': dev.property_developer.customerId.id,
                            'image_data': ast.literal_eval(dev.property_developer.property_image),
                            'videos': dev.property_developer.videos,
                            'videos_thumbnail': dev.property_developer.videos_thumbnail,
                            'document': dev.property_developer.document,
                               'property_name':dev.property_developer.property_name,
                            'property_type': dev.property_developer.property_type,
                            'assest_equality': dev.property_developer.assest_equality,
                            'investment_highlight': dev.property_developer.investment_highlight,
                            'equity_price': dev.property_developer.equity_price,
                            'lp_equity_percent': dev.property_developer.lp_equity_percent,
                            'gp_equity_percent': dev.property_developer.gp_equity_percent,
                            'debt_percent': dev.property_developer.debt_percent,
                            'short_title': dev.property_developer.short_title,
                            'description': dev.property_developer.description,
                            'bussiness_plan': dev.property_developer.bussiness_plan,
                            'minimum_investment': dev.property_developer.minimum_investment,
                            'investment_strategy': dev.property_developer.investment_strategy,
                            'expected_period': dev.property_developer.expected_period,
                            'financed': dev.property_developer.financed,
                            'target_return_on_cost': dev.property_developer.target_return_on_cost,
                            'target_irr': dev.property_developer.target_irr,
                            'offered_by': dev.property_developer.offered_by,
                            'estimated_first_distribution': dev.property_developer.estimated_first_distribution,
                            'type_of_investment': dev.property_developer.type_of_investment,
                            'phone_number': dev.property_developer.phone_number,
                            'measure_of_multiplier': dev.property_developer.measure_of_multiplier,
                            'address': dev.property_developer.address,
                            'minimum_goal': dev.property_developer.minimum_goal,
                            'nominal_share_price': dev.property_developer.nominal_share_price,
                            'the_valuation': dev.property_developer.the_valuation,
                            'minimum_drawing': dev.property_developer.minimum_drawing,
                            'no_of_drawings': dev.property_developer.no_of_drawings,
                            'share_for_sale': dev.property_developer.share_for_sale,
                            'remaining_share': dev.property_developer.remaining_share,
                            'maximum_drawing': dev.property_developer.maximum_drawing,
                            'short_description': dev.property_developer.short_description,
                            'why_invest': dev.property_developer.why_invest,
                            'problem_to_be_solved': dev.property_developer.problem_to_be_solved,
                            'our_solution': dev.property_developer.our_solution,
                            'start_date_data': dev.property_developer.start_date_data,
                            'end_date_data': dev.property_developer.end_date_data,
                            'number_of_share': dev.property_developer.number_of_share,
                            'price_of_share': dev.property_developer.price_of_share,
                            'issue_minimum_investment': dev.property_developer.issue_minimum_investment,
                            'issue_maximum_investment': dev.property_developer.issue_maximum_investment,
                            'value_before_issue': dev.property_developer.value_before_issue,
                            'raised_capital_minimum_limit': dev.property_developer.raised_capital_minimum_limit,
                            'raised_capital_maximum_limit': dev.property_developer.raised_capital_maximum_limit,
                            'share_of_company_sold_minimum_limit': dev.property_developer.share_of_company_sold_minimum_limit,
                            'share_of_company_sold_maximum_limit': dev.property_developer.share_of_company_sold_maximum_limit,
                            'self_report': dev.property_developer.self_report,
                            'discussion_description': dev.property_developer.discussion_description,
                            'new_exisiting_details': dev.property_developer.new_exisiting_details,
                            'drawing_on_behalf': dev.property_developer.drawing_on_behalf,
                            'foundation': dev.property_developer.foundation,
                            'satutes': dev.property_developer.satutes,
                            'annual_account': dev.property_developer.annual_account,
                            'valuation': dev.property_developer.valuation,
                            'agreement_on_co': dev.property_developer.agreement_on_co,
                            'conversion_of_debt': dev.property_developer.conversion_of_debt,
                            'balance_sheet': dev.property_developer.balance_sheet,
                            'result_report': dev.property_developer.result_report,
                            'country': dev.property_developer.country,
                            'state': dev.property_developer.state,
                            'city': dev.property_developer.city,
                            'postal_code': dev.property_developer.postal_code,
                            'landmark': dev.property_developer.landmark,
                            'house_number': dev.property_developer.house_number,
                            'location': dev.property_developer.location,
                            'latitude': dev.property_developer.latitude,
                            'longitude': dev.property_developer.longitude,
                            'agency': dev.property_developer.agency_id,
                            'status': dev.property_developer.status,
                               'type':"property_developers"
                        })

    
            return Response({'status_code':status.HTTP_200_OK,'message':'my favourite data fetched successfully','data':allData},status=status.HTTP_200_OK)
        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 removeFavouriteProperties(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            property_id = data.get('id')
            if not property_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            Type = data.get('type')
            if not Type:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'type is required'},status=status.HTTP_400_BAD_REQUEST)
            
            # Delete BussinessForSaleFavourite
            if Type == 'BusinessSale':
                bussinessSale = BussinessForSaleFavourite.objects.filter(bussiness=property_id).first()
                bussinessSale.delete()

            # Delete HouseRentFavourite
            if Type == 'HouseRent':
                houseWantedRent = HouseRentFavourite.objects.filter(house_rent=property_id).first()
                houseWantedRent.delete()

            # Delete InvestmentMyProjectFavourite
            if Type == 'InvestmentProject':
                investmentProject = InvestmentMyProjectFavourite.objects.filter(invest_project=property_id).first()
                investmentProject.delete()

            # Delete InvestmentMyCompanyFavourite
            if Type == 'InvestmentCompany':
                investmentCompany = CompanySeekingEquityFavourite.objects.filter(invest_company=property_id).first()
                investmentCompany.delete()

            # Delete PropertyProjectFavourite
            if Type == 'PropertyProject':
                propertyProject = PropertyProjectFavourite.objects.filter(property=property_id).first()
                propertyProject.delete()

            if Type == 'SaleProperty':
                saleproperty = SalePropertyFavourite.objects.filter(sale=property_id).first()
                saleproperty.delete()

            if Type == 'RentProperty':
                rentproperty = RentPropertyFavourite.objects.filter(rent=property_id).first()
                rentproperty.delete()
    
    
            if Type == 'seeking_equity':
                companyseek = CompanySeekingEquityFavourite.objects.filter(company_seek=property_id).first()
                companyseek.delete()
    
            if Type == 'property_developers':
                companyseek = PropertyDevelopersFavourite.objects.filter(property_developer=property_id).first()
                companyseek.delete()

            return Response({'status':status.HTTP_200_OK,'message':'favourite properties removed successfully'},status=status.HTTP_200_OK)

        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 deleteProperties(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            property_id = data.get('id')
            if not property_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            Type = data.get('type')
            if not Type:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'type is required'},status=status.HTTP_400_BAD_REQUEST)
            
            # Delete SaleRent
            if Type =='SaleRent':
                saleRentProperty = SaleAndRentProperty.objects.filter(id=property_id).first()
                if not saleRentProperty:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No rent sale property found'},status=status.HTTP_400_BAD_REQUEST)
                saleRentProperty.end_date = datetime.now()
                saleRentProperty.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)
            
            # Delete BusinessSale
            if Type == 'BusinessSale':
                bussinessSale = BussinessForSale.objects.filter(id=property_id).first()
                if not bussinessSale:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No business for sale found'},status=status.HTTP_400_BAD_REQUEST)
                bussinessSale.end_date = datetime.now()
                bussinessSale.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)

            # Delete HouseRent
            if Type == 'HouseRent':
                houseWantedRent = HouseWantedForRent.objects.filter(id=property_id).first()
                if not houseWantedRent:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No house wanted for rent found'},status=status.HTTP_400_BAD_REQUEST)
                houseWantedRent.end_date = datetime.now()
                houseWantedRent.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)

            # Delete InvestmentProject
            if Type == 'InvestmentProject':
                investmentProject = InvestmentMyProject.objects.filter(id=property_id).first()
                if not investmentProject:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No investment for project found'},status=status.HTTP_400_BAD_REQUEST)
                investmentProject.end_date = datetime.now()
                investmentProject.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)

            # Delete InvestmentCompany
            if Type == 'InvestmentCompany':
                investmentCompany = InvestmentMyCompany.objects.filter(id=property_id).first()
                if not investmentCompany:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No investment for company found'},status=status.HTTP_400_BAD_REQUEST)
                investmentCompany.end_date = datetime.now()
                investmentCompany.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)

            # Delete PropertyProject
            if Type == 'PropertyProject':
                propertyProject = PropertyProject.objects.filter(id=property_id).first()
                if not propertyProject:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No property project found'},status=status.HTTP_400_BAD_REQUEST)
                propertyProject.end_date = datetime.now()
                propertyProject.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)

            if Type == 'SaleProperty':
                salepropertyProject = SaleProperty.objects.filter(id=property_id).first()
                if not salepropertyProject:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No sale for property found'},status=status.HTTP_400_BAD_REQUEST)
                salepropertyProject.end_date = datetime.now()
                salepropertyProject.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)

            if Type == 'RentProperty':
                rentpropertyProject = RentProperty.objects.filter(id=property_id).first()
                if not rentpropertyProject:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No rent for property found'},status=status.HTTP_400_BAD_REQUEST)
                rentpropertyProject.end_date = datetime.now()
                rentpropertyProject.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)
    
            if Type == 'CompanySeeking':
                rentpropertyProject = CompanySeekingEquity.objects.filter(id=property_id).first()
                if not rentpropertyProject:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No company seeking found'},status=status.HTTP_400_BAD_REQUEST)
                rentpropertyProject.end_date = datetime.now()
                rentpropertyProject.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)
            
            if Type == 'PropertyDeveloper':
                rentpropertyProject = PropertyDevelopers.objects.filter(id=property_id).first()
                if not rentpropertyProject:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'No property developer found found'},status=status.HTTP_400_BAD_REQUEST)
                rentpropertyProject.end_date = datetime.now()
                rentpropertyProject.save()
                return Response({'status_code':status.HTTP_200_OK,'message':'properties deleted successfully'},status=status.HTTP_200_OK)

            else:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Something went wrong'},status=status.HTTP_400_BAD_REQUEST)
        
        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 salePropertyInquire(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data=request.data
            property_id = data.get('id')
            name = data.get('name')
            telephone = data.get('telephone')
            email = data.get('email')
            message = data.get('message')
            if not property_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not telephone:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'telephone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not message:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'message is required'},status=status.HTTP_400_BAD_REQUEST)
            saleRentObj = SaleProperty.objects.filter(id=property_id).first()
            inquireSaleRentObj= inquireSaleProperty.objects.create(sale=saleRentObj,customerId=customerObj)
            inquireSaleRentObj.name = name
            inquireSaleRentObj.telephone = telephone
            inquireSaleRentObj.email = email
            inquireSaleRentObj.message = message
            inquireSaleRentObj.start_date = datetime.now()
            inquireSaleRentObj.save()
            message = "Someone is interested in your property"
            context = {}
            to_emails = saleRentObj.customerId.email
            subject = "Reeipo Property"
            message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
            message.send(fail_silently=False)
            AdminNotifications.objects.create(message= customerObj.firstName+''+customerObj.lastName+' has inquire on a property',is_read=True,notification_type='property_inquire')
            return Response({'status':status.HTTP_200_OK,'message':'Added successfully'},status=status.HTTP_200_OK)
        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 inquireBusinessForSale(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data=request.data
            property_id = data.get('id')
            name = data.get('name')
            company_name  =data.get('company_name')
            telephone = data.get('telephone')
            email = data.get('email')
            message = data.get('message')
            if not property_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not telephone:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'telephone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not message:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'message is required'},status=status.HTTP_400_BAD_REQUEST)
            businessSaleObj = BussinessForSale.objects.filter(id=property_id).first()
            inquireBusinessSaleObj= inquireBusinessSaleProperty.objects.create(business_sale=businessSaleObj,customerId=customerObj)
            inquireBusinessSaleObj.name = name
            inquireBusinessSaleObj.company_name = company_name
            inquireBusinessSaleObj.telephone = telephone
            inquireBusinessSaleObj.email = email
            inquireBusinessSaleObj.message = message
            inquireBusinessSaleObj.start_date = datetime.now()
            inquireBusinessSaleObj.save()
            message = "Someone is interested in your property"
            context = {}
            # context['message'] = message
            # context['email'] = email
            # email_data = render_to_string('forgot-link.html',context)
            to_emails = businessSaleObj.customerId.email
            subject = "Reeipo Property"
            message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
            # message.attach_alternative(email_data, "text/html")
            message.send(fail_silently=False)
            AdminNotifications.objects.create(message= customerObj.firstName+''+customerObj.lastName+' has inquire on a property',is_read=True,notification_type='property_inquire')
            return Response({'status':status.HTTP_200_OK,'message':'Added successfully'},status=status.HTTP_200_OK)
        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 postInquirePropertyProject(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data=request.data
            if contains_vulgarity(request.data):
                pass_status = 2
            else:
                pass_status = 1
            property_id = data.get('project_id')
            print(property_id)
            name = data.get('name')
            company_name  =data.get('company_name')
            telephone = data.get('telephone')
            email = data.get('email')
            message = data.get('message')
            property_type = data.get('property_type')
            investment_amount = data.get('investment_amount')

            if not property_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Project id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not telephone:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'telephone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not message:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'message is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_type:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)

            if property_type=='sale_rent_property':
                propertyProjectObj = SaleAndRentProperty.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(sale_rent_property=propertyProjectObj,customerId=customerObj,property_type='sale_rent_property')

            
            elif property_type=='sale_property':
                propertyProjectObj = SaleProperty.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(sale_property=propertyProjectObj,customerId=customerObj,property_type='SaleProperty')


            elif property_type=='rent_property':
                print("in here ")
                propertyProjectObj = RentProperty.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(rent_property=propertyProjectObj,customerId=customerObj,property_type='RentProperty')
                
                print(propertyProjectObj)

            elif property_type=='bussiness_for_sale':
                propertyProjectObj = BussinessForSale.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(bussiness_for_sale=propertyProjectObj,customerId=customerObj,property_type='BusinessSale',investment_amount=investment_amount)

    
            elif property_type=='house_wanted_for_rent':
                propertyProjectObj = HouseWantedForRent.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(house_wanted_for_rent=propertyProjectObj,customerId=customerObj,property_type='HouseRent')


            elif property_type=='investment_my_project':
                propertyProjectObj = InvestmentMyProject.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(investment_my_project=propertyProjectObj,customerId=customerObj,property_type='InvestmentProject')


            elif property_type=='investment_my_company':
                propertyProjectObj = InvestmentMyCompany.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(investment_my_company=propertyProjectObj,customerId=customerObj,property_type='InvestmentCompany')


            elif property_type=='property_project':
                propertyProjectObj = PropertyProject.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(property_project=propertyProjectObj,customerId=customerObj,property_type='PropertyProject')


            elif property_type=='company_seeking_equity':
                propertyProjectObj = CompanySeekingEquity.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(company_seeking_equity=propertyProjectObj,customerId=customerObj,property_type='company_seeking_equity',investment_amount=investment_amount)



            elif property_type=='property_developers':
                propertyProjectObj = PropertyDevelopers.objects.filter(id=property_id).first()
                inquirePropertyProjectObj= inquirePropertyProject.objects.create(property_developers=propertyProjectObj,customerId=customerObj,property_type='property_developers',investment_amount=investment_amount)
                
            inquirePropertyProjectObj.name = name
            inquirePropertyProjectObj.company_name = company_name
            inquirePropertyProjectObj.telephone = telephone
            inquirePropertyProjectObj.email = email
            inquirePropertyProjectObj.message = message
            inquirePropertyProjectObj.start_date = datetime.now()
            inquirePropertyProjectObj.status = pass_status
            inquirePropertyProjectObj.save() 
            message = "Someone is interested in your property please check My-Leads in your Profile"
            context = {}
            to_emails = propertyProjectObj.customerId.email
            subject = "Reeipo Property"
            message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
            message.send(fail_silently=False)
            AdminNotifications.objects.create(message= customerObj.firstName+''+customerObj.lastName+' has inquire on a property project',is_read=True,notification_type='property_inquire')
            CustomerNotifications.objects.create(customer_id=propertyProjectObj.customerId,message= customerObj.firstName+''+customerObj.lastName+' has inquire on your project',notification_type='property_inquire')
            return Response({'status':status.HTTP_200_OK,'message':'Added successfully','user_id':uid},status=status.HTTP_200_OK)
        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 rentPropertyInquire(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data=request.data
            if contains_vulgarity(request.data):
                pass_status = 2
            else:
                pass_status = 1
            rent_id = data.get('rent_id')
            name = data.get('name')
            company_name  =data.get('company_name')
            telephone = data.get('telephone')
            email = data.get('email')
            message = data.get('message')
            if not rent_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Rent id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not telephone:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'telephone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not message:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'message is required'},status=status.HTTP_400_BAD_REQUEST)
            rentPropertyObj = RentProperty.objects.filter(id=rent_id).first()
            inquireRentObj= inquireRentProperty.objects.create(rent_property=rentPropertyObj,customerId=customerObj)
            inquireRentObj.name = name
            inquireRentObj.company_name = company_name
            inquireRentObj.telephone = telephone
            inquireRentObj.email = email
            inquireRentObj.message = message
            inquireRentObj.start_date = datetime.now()
            inquireRentObj.status = pass_status
            inquireRentObj.save()
            AdminNotifications.objects.create(message= customerObj.firstName+''+customerObj.lastName+' has inquire on a rent property',is_read=True,notification_type='property_inquire')
            return Response({'status':status.HTTP_200_OK,'message':'Added successfully'},status=status.HTTP_200_OK)
        except Exception as e:
                return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
from collections import defaultdict

"""class getInquireList(APIView):
    def get(self, request):
        # try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()
            inquirePropertyProjectObj = inquirePropertyProject.objects.filter(customerId=customerObj,status=1)
            print('inquirePropertyProjectObj',inquirePropertyProjectObj)

            allData = []

            for ppinquire in inquirePropertyProjectObj:
                property_type = ppinquire.property_type  # e.g., "property_project", "sale_property", etc.
                item_data = {
                    'id': ppinquire.id,
                    'customer_id': ppinquire.customerId_id,
                    'name': ppinquire.name,
                    'company_name': ppinquire.company_name,
                    'telephone': ppinquire.telephone,
                    'email': ppinquire.email,
                    'message': ppinquire.message,
                    'status': ppinquire.status,
                    'contract_status': ppinquire.contract_status,
                    'contract_id': ppinquire.contract_id,
                    'start_date': ppinquire.start_date,
                    'end_date': ppinquire.end_date,
                    'investment_amount': ppinquire.investment_amount,
                }

                # Add simplified keys per type
                property_type = ppinquire.property_type

                if property_type == 'sale_rent_property':
                    prop = ppinquire.sale_rent_property
                    favourite_obj = RentPropertyFavourite.objects.filter(rent=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.sale_rent_property_id if ppinquire.sale_rent_property_id else None,
                        'property_image': ast.literal_eval(prop.image) if prop and prop.image else None,
                        'property_title': prop.title if prop and prop.title else None,
                        'property_price': prop.price if prop and prop.price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'RentProperty'
                        
                    })

                elif property_type == 'SaleProperty':
                    prop = ppinquire.sale_property
                    favourite_obj = SalePropertyFavourite.objects.filter(sale=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.sale_property_id if ppinquire.sale_property_id else None,
                        'property_image': ast.literal_eval(prop.image_data) if prop and prop.image_data else None,
                        'property_title': prop.title if prop and prop.title else None,
                        'property_price': prop.price if prop and prop.price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'SaleProperty'


                    })

                elif property_type == 'BusinessSale':
                    prop = ppinquire.bussiness_for_sale
                    favourite_obj = BussinessForSaleFavourite.objects.filter(bussiness=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.bussiness_for_sale_id if ppinquire.bussiness_for_sale_id else None,
                        'property_image': ast.literal_eval(prop.image_data) if prop and prop.image_data else None,
                        'property_title': prop.short_title if prop and prop.short_title else None,
                        'property_price': prop.cost if prop and prop.cost else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'BusinessSale'

                        
                    })

                elif property_type == 'HouseRent':
                    prop = ppinquire.house_wanted_for_rent
                    favourite_obj = HouseRentFavourite.objects.filter(house_rent=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.house_wanted_for_rent_id if ppinquire.house_wanted_for_rent_id else None,
                        'property_image': ast.literal_eval(prop.image) if prop and prop.image else None,
                        'property_title': prop.short_title if prop and prop.short_title else None,
                        'property_price': prop.max_month_price if prop and prop.max_month_price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'HouseRent'

                    })

                elif property_type == 'InvestmentProject':
                    prop = ppinquire.investment_my_project
                    favourite_obj = InvestmentMyProjectFavourite.objects.filter(invest_project=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.investment_my_project_id if ppinquire.investment_my_project_id else None,
                        'property_image': ast.literal_eval(prop.image_data) if prop and prop.image_data else None,
                        'property_title': prop.property_name if prop and prop.property_name else None,
                        'property_price': prop.equity_price if prop and prop.equity_price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'favourite':favourite,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'property_type' : 'InvestmentProject'

                    })

                elif property_type == 'PropertyProject':
                    prop = ppinquire.property_project
                    favourite_obj = PropertyProjectFavourite.objects.filter(property=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.property_project_id if ppinquire.property_project_id else None,
                        'property_image': ast.literal_eval(prop.image_data) if prop and prop.image_data else None,
                        'property_title': prop.property_name if prop and prop.property_name else None,
                        'property_price': prop.purchase_price if prop and prop.purchase_price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'favourite':favourite,
                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        
                        'property_type' : 'PropertyProject'

                    })

                elif property_type == 'company_seeking_equity':
                    prop = ppinquire.company_seeking_equity
                    favourite_obj = CompanySeekingEquityFavourite.objects.filter(company_seek=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.company_seeking_equity_id if ppinquire.company_seeking_equity_id else None,
                        'property_image': ast.literal_eval(prop.property_image) if prop and prop.property_image else None,
                        'property_title': prop.short_title if prop and prop.short_title else None,
                        'property_price': prop.price_per_share if prop and prop.price_per_share else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'favourite':favourite,
                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'property_type' : 'companySeeking'
                    })

                elif property_type == 'InvestmentCompany':
                    prop = ppinquire.investment_my_company
                    favourite_obj = InvestmentMyCompanyFavourite.objects.filter(invest_company=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.investment_my_company_id if ppinquire.investment_my_company_id else None,
                        'property_image': prop.company_logo if prop and prop.company_logo else None,
                        'property_title': prop.property_name if prop and prop.property_name else None,
                        'property_price': None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'InvestmentCompany'
                    })

                allData.append(item_data)


                
            return Response({'status':status.HTTP_200_OK,'message':'inquire list fetched successfully','data':allData,'id':uid},status=status.HTTP_200_OK,)
        # 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 getInquireList(APIView):
    def get(self, request):
        # try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()
            inquirePropertyProjectObj = inquirePropertyProject.objects.filter(customerId=customerObj,status=1)
            print('inquirePropertyProjectObj',inquirePropertyProjectObj)

            allData = []

            for ppinquire in inquirePropertyProjectObj:
                investments = inquirePropertyProject.objects.filter(
                property_project= ppinquire.id,
                contract_status='Deal-Completed',
                property_type='PropertyProject'
                ).first()
                if investments:
                    fee = investments.finder_free_status,
                else:
                    fee = "Pending"
                investment_amount=ppinquire.investment_amount or 0.0
            
                property_type = ppinquire.property_type
                item_data = {
                    'id': ppinquire.id,
                    'customer_id': ppinquire.customerId_id,
                    'name': ppinquire.name,
                    'company_name': ppinquire.company_name,
                    'telephone': ppinquire.telephone,
                    'email': ppinquire.email,
                    'message': ppinquire.message,
                    'status': ppinquire.status,
                    'contract_status': ppinquire.contract_status,
                    'contract_id': ppinquire.contract_id,
                    'start_date': ppinquire.start_date,
                    'end_date': ppinquire.end_date,
                    'investments':fee,
                    'investment_amount':investment_amount
                }

                # Add simplified keys per type
                property_type = ppinquire.property_type

                if property_type == 'sale_rent_property':
                    prop = ppinquire.sale_rent_property
                    favourite_obj = RentPropertyFavourite.objects.filter(rent=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.sale_rent_property_id if ppinquire.sale_rent_property_id else None,
                        'property_image': ast.literal_eval(prop.image) if prop and prop.image else None,
                        'property_title': prop.title if prop and prop.title else None,
                        'property_price': prop.price if prop and prop.price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'RentProperty'
                        
                    })

                elif property_type == 'SaleProperty':
                    prop = ppinquire.sale_property
                    favourite_obj = SalePropertyFavourite.objects.filter(sale=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.sale_property_id if ppinquire.sale_property_id else None,
                        'property_image': ast.literal_eval(prop.image_data) if prop and prop.image_data else None,
                        'property_title': prop.title if prop and prop.title else None,
                        'property_price': prop.price if prop and prop.price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'SaleProperty'


                    })

                elif property_type == 'BusinessSale':
                    prop = ppinquire.bussiness_for_sale
                    favourite_obj = BussinessForSaleFavourite.objects.filter(bussiness=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.bussiness_for_sale_id if ppinquire.bussiness_for_sale_id else None,
                        'property_image': ast.literal_eval(prop.image_data) if prop and prop.image_data else None,
                        'property_title': prop.short_title if prop and prop.short_title else None,
                        'property_price': prop.cost if prop and prop.cost else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'BusinessSale'

                        
                    })

                elif property_type == 'HouseRent':
                    prop = ppinquire.house_wanted_for_rent
                    favourite_obj = HouseRentFavourite.objects.filter(house_rent=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.house_wanted_for_rent_id if ppinquire.house_wanted_for_rent_id else None,
                        'property_image': ast.literal_eval(prop.image) if prop and prop.image else None,
                        'property_title': prop.short_title if prop and prop.short_title else None,
                        'property_price': prop.max_month_price if prop and prop.max_month_price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'HouseRent'

                    })

                elif property_type == 'InvestmentProject':
                    prop = ppinquire.investment_my_project
                    favourite_obj = InvestmentMyProjectFavourite.objects.filter(invest_project=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.investment_my_project_id if ppinquire.investment_my_project_id else None,
                        'property_image': ast.literal_eval(prop.image_data) if prop and prop.image_data else None,
                        'property_title': prop.property_name if prop and prop.property_name else None,
                        'property_price': prop.equity_price if prop and prop.equity_price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'favourite':favourite,

                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'property_type' : 'InvestmentProject'

                    })

                elif property_type == 'PropertyProject':
                    prop = ppinquire.property_project
                    favourite_obj = PropertyProjectFavourite.objects.filter(property=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.property_project_id if ppinquire.property_project_id else None,
                        'property_image': ast.literal_eval(prop.image_data) if prop and prop.image_data else None,
                        'property_title': prop.property_name if prop and prop.property_name else None,
                        'property_price': prop.purchase_price if prop and prop.purchase_price else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'favourite':favourite,
                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        
                        'property_type' : 'PropertyProject'

                    })

                elif property_type == 'company_seeking_equity':
                    prop = ppinquire.company_seeking_equity
                    favourite_obj = CompanySeekingEquityFavourite.objects.filter(company_seek=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.company_seeking_equity_id if ppinquire.company_seeking_equity_id else None,
                        'property_image': ast.literal_eval(prop.property_image) if prop and prop.property_image else None,
                        'property_title': prop.short_title if prop and prop.short_title else None,
                        'property_price': prop.price_per_share if prop and prop.price_per_share else None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'favourite':favourite,
                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'property_type' : 'companySeeking'
                    })

                elif property_type == 'InvestmentCompany':
                    prop = ppinquire.investment_my_company
                    favourite_obj = InvestmentMyCompanyFavourite.objects.filter(invest_company=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.investment_my_company_id if ppinquire.investment_my_company_id else None,
                        'property_image': prop.company_logo if prop and prop.company_logo else None,
                        'property_title': prop.property_name if prop and prop.property_name else None,
                        'property_price': None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'InvestmentCompany'
                    })

                elif property_type == 'property_developers':
                    prop = ppinquire.property_developers
                    favourite_obj = PropertyDevelopersFavourite.objects.filter(property_developer=prop.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    item_data.update({
                        'property_id': ppinquire.property_developers_id if ppinquire.property_developers_id else None,
                        'property_image': prop.property_image if prop and prop.property_image else None,
                        'property_title': prop.property_name if prop and prop.property_name else None,
                        'property_price': None,
                        'location': prop.location if prop and prop.location else None,
                        'message_to_id': prop.customerId.id if prop and prop.customerId else None,
                        'message_to': prop.customerId.firstName+''+prop.customerId.lastName if prop and prop.customerId else None,
                        'favourite':favourite,
                        'property_type' : 'property_developers'
                    })

                allData.append(item_data)


                
            return Response({'status':status.HTTP_200_OK,'message':'inquire list fetched successfully','data':allData,'id':uid},status=status.HTTP_200_OK,)
    
class myLeadsList(APIView):
    def get(self, request):
        # try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            inquirePropertyProjectObj = inquirePropertyProject.objects.filter(
                Q(status=1) & (
                    Q(sale_rent_property__customerId=customerObj) |
                    Q(property_project__customerId=customerObj) |
                    Q(sale_property__customerId=customerObj) |
                    Q(rent_property__customerId=customerObj) |
                    Q(bussiness_for_sale__customerId=customerObj) |
                    Q(house_wanted_for_rent__customerId=customerObj) |
                    Q(investment_my_project__customerId=customerObj) |
                    Q(investment_my_company__customerId=customerObj) |
                    Q(company_seeking_equity__customerId=customerObj) |
                    Q(property_developers__customerId=customerObj)
                )
            ) 
            allData = []
            for ppinquire in inquirePropertyProjectObj:
                item_data = {
                    'id': ppinquire.id,
                    'customerId_id': ppinquire.customerId_id,
                    'name': ppinquire.name,
                    'company_name': ppinquire.company_name,
                    'telephone': ppinquire.telephone,
                    'email': ppinquire.email,
                    'message': ppinquire.message,
                    'status': ppinquire.status,
                    'contract_status': ppinquire.contract_status,
                    'contract_id': ppinquire.contract_id,
                    'start_date': ppinquire.start_date,
                    'end_date': ppinquire.end_date,
                    'investment_amount':ppinquire.investment_amount,
                }
                print(item_data,'---------------item data')
                property_type = ppinquire.property_type

                if property_type == 'sale_rent_property':
                    sale_rent = ppinquire.sale_rent_property
                    item_data.update({
                        'property_id': ppinquire.sale_rent_property_id,
                        'property_image': ast.literal_eval(sale_rent.image) if sale_rent and sale_rent.image else None,
                        'property_title': sale_rent.title if sale_rent and sale_rent.title else None,
                        'property_price': sale_rent.price if sale_rent and sale_rent.price else None,
                        'location': sale_rent.location if sale_rent and sale_rent.location else None,
                        'message_from_id':sale_rent.customerId.id if sale_rent and sale_rent.customerId else None,
                        'message_from':sale_rent.customerId.firstName+''+sale_rent.customerId.lastName if sale_rent and sale_rent.customerId else None,
                        'property_type' : 'SaleRentProperty'
                        
                    })
                if property_type == 'RentProperty':
                    sale_rent = ppinquire.rent_property
                    item_data.update({
                        'property_id': ppinquire.sale_rent_property_id,
                        'property_image': ast.literal_eval(sale_rent.image_data) if sale_rent and sale_rent.image_data else None,
                        'property_title': sale_rent.title if sale_rent and sale_rent.title else None,
                        'property_price': sale_rent.monthly_rent if sale_rent and sale_rent.monthly_rent else None,
                        'location': sale_rent.location if sale_rent and sale_rent.location else None,
                        'message_from_id':sale_rent.customerId.id if sale_rent and sale_rent.customerId else None,
                        'message_from':sale_rent.customerId.firstName+''+sale_rent.customerId.lastName if sale_rent and sale_rent.customerId else None,
                        'property_type' : 'RentProperty'
                        
                    })

                elif property_type == 'sale_property':
                    sale = ppinquire.sale_property
                    item_data.update({
                        'property_id': ppinquire.sale_property_id,
                        'property_image': ast.literal_eval(sale.image_data) if sale and sale.image_data else None,
                        'property_title': sale.title if sale and sale.title else None,
                        'property_price': sale.price if sale and sale.price else None,
                        'location': sale.location if sale and sale.location else None,
                        'message_from_id':sale.customerId.id if sale and sale.customerId else None,
                        'message_from':sale.customerId.firstName+''+sale.customerId.lastName if sale and sale.customerId else None,

                        'property_type' : 'SaleProperty'
                    })

                elif property_type == 'BusinessSale':
                    bussiness = ppinquire.bussiness_for_sale
                    item_data.update({
                        'property_id': ppinquire.bussiness_for_sale_id,
                        'property_image': ast.literal_eval(bussiness.image_data) if bussiness and bussiness.image_data else None,
                        'property_title': bussiness.short_title if bussiness and bussiness.short_title else None,
                        'property_price': bussiness.cost if bussiness and bussiness.cost else None,
                        'location': bussiness.location if bussiness and bussiness.location else None,
                        'message_from_id':bussiness.customerId.id if bussiness and bussiness.customerId else None,

                        'message_from':bussiness.customerId.firstName+''+bussiness.customerId.lastName if bussiness and bussiness.customerId else None,
                        'property_type' : 'BusinessSale'

                    })

                elif property_type == 'HouseRent':
                    house = ppinquire.house_wanted_for_rent
                    item_data.update({
                        'property_id': ppinquire.house_wanted_for_rent_id,
                        'property_image': ast.literal_eval(house.image) if house and house.image else None,
                        'property_title': house.short_title if house and house.short_title else None,
                        'property_price': house.max_month_price if house and house.max_month_price else None,
                        'location': house.location if house and house.location else None,
                         'message_from_id':house.customerId.id if house and house.customerId else None,
                         'message_from':house.customerId.firstName+''+house.customerId.lastName if house and house.customerId else None,

                        'property_type' : 'HouseRent'
                    })

                elif property_type == 'InvestmentProject':
                    invest_proj = ppinquire.investment_my_project
                    item_data.update({
                        'property_id': ppinquire.investment_my_project_id,
                        'property_image': ast.literal_eval(invest_proj.image_data) if invest_proj and invest_proj.image_data else None,
                        'property_title': invest_proj.property_name if invest_proj and invest_proj.property_name else None,
                        'property_price': invest_proj.equity_price if invest_proj and invest_proj.equity_price else None,
                        'location': invest_proj.location if invest_proj and invest_proj.location else None,
                        'message_from_id':invest_proj.customerId.id if invest_proj and invest_proj.customerId else None,

                        'message_from':invest_proj.customerId.firstName+''+invest_proj.customerId.lastName if invest_proj and invest_proj.customerId else None,

                        'property_type' : 'InvestmentProject'
                    })

                elif property_type == 'PropertyProject':
                    
                    prop_proj = ppinquire.property_project
                    # print(prop_proj,'///////////')
                    # print(prop_proj.property_id,'====rghrthdrth=======')
                    investments = inquirePropertyProject.objects.filter(
                        property_project= prop_proj,
                        # contract_status='Deal-Completed',
                        property_type='PropertyProject'
                        ).first()
                    print(investments,'===========')
                    # investments=''
                    # qa = inquirePropertyProject.objects.filter(property_project= ppinquire.id)
                    # print(qa.count(),'-------------------------')
                    if investments:
                        fee = investments.finder_free_status
                    else:
                        fee = "Pending"
                    # ff_found= PropertyProject.objects.filter(
                    # )
                    print(fee,'feeeeeeeeeeeeeeeeeeeeeeeeeee')
                    item_data.update({
                        'property_id': ppinquire.property_project_id,
                        'property_image': ast.literal_eval(prop_proj.image_data) if prop_proj and prop_proj.image_data else None,
                        'property_title': prop_proj.property_name if prop_proj and prop_proj.property_name else None,
                        'property_price': prop_proj.purchase_price if prop_proj and prop_proj.purchase_price else None,
                        'location': prop_proj.location if prop_proj and prop_proj.location else None,
                        'message_from_id':prop_proj.customerId.id if prop_proj and prop_proj.customerId else None,

                        'message_from':prop_proj.customerId.firstName+''+prop_proj.customerId.lastName if prop_proj and prop_proj.customerId else None,
                        'property_type' : 'PropertyProject',
                        'ff_payment_status':fee,
                        'finder_fee': prop_proj.finder_fee if prop_proj and prop_proj.finder_fee else None,

                    })

                elif property_type == 'company_seeking_equity':
                    equity = ppinquire.company_seeking_equity
                    item_data.update({
                        'property_id': ppinquire.company_seeking_equity_id,
                        'property_image': ast.literal_eval(equity.property_image) if equity and equity.property_image else None,
                        'property_title': equity.short_title if equity and equity.short_title else None,
                        'property_price': equity.price_per_share if equity and equity.price_per_share else None,
                        'location': equity.location if equity and equity.location else None,
                        'message_from_id':equity.customerId.id if equity and equity.customerId else None,

                        'message_from':equity.customerId.firstName+''+equity.customerId.lastName if equity and equity.customerId else None,
                        'property_type' : 'companySeeking'
                    })

                elif property_type == 'InvestmentCompany':
                    invest_comp = ppinquire.investment_my_company
                    item_data.update({
                        'property_id': ppinquire.investment_my_company_id,
                        'property_image': invest_comp.company_logo if invest_comp and invest_comp.company_logo else None,
                        'property_title': invest_comp.property_name if invest_comp and invest_comp.property_name else None,
                        'property_price': None,  # No price field found in this case
                        'location': invest_comp.location if invest_comp and invest_comp.location else None,
                        'message_from_id':invest_comp.customerId.id if invest_comp and invest_comp.customerId else None,

                        'message_from':invest_comp.customerId.firstName+''+invest_comp.customerId.lastName if invest_comp and invest_comp.customerId else None,
                        'property_type' : 'InvestmentCompany'
                    })

                elif property_type == 'property_developers':
                    print(property_type,'------------------')
                    invest_comp = ppinquire.property_developers
                    print(invest_comp,'\n\n',ppinquire.property_developers_id,'00000000000')
                    item_data.update({
                        'property_id': ppinquire.property_developers_id,
                        'property_image': invest_comp.property_image if invest_comp and invest_comp.property_image else None,
                        'property_title': invest_comp.property_name if invest_comp and invest_comp.property_name else None,
                        'property_price': None,  # No price field found in this case
                        'location': invest_comp.location if invest_comp and invest_comp.location else None,
                        'message_from_id':invest_comp.customerId.id if invest_comp and invest_comp.customerId else None,

                        'message_from':invest_comp.customerId.firstName+''+invest_comp.customerId.lastName if invest_comp and invest_comp.customerId else None,
                        'property_type' : 'property_developers'
                    })

                allData.append(item_data)


                
            return Response({'status':status.HTTP_200_OK,'message':'my leads list successfully','data':allData,'id':uid},status=status.HTTP_200_OK)
        # 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 customerNotifications(APIView):
    def get (self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()
            notificationObj =  CustomerNotifications.objects.filter(customer_id=customerObj,end_date__isnull = True).order_by('-id')
            allData = []
            for notify in notificationObj:
                alldata = {
                    'id':notify.id,
                    'message':notify.message,
                    'notification_type':notify.notification_type,
                    'is_read':notify.is_read,
                    'date':notify.start_date
                }
                allData.append(alldata)
            return Response({'status':status.HTTP_200_OK,'message':'customer notifications fetched successfully','data':allData},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 

class deleteNotifications(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data = request.data
            notificaton_ids = data.get('id')
            if not notificaton_ids:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'id required'},status=status.HTTP_400_BAD_REQUEST)
            for i in notificaton_ids:
                CustomerNotifications.objects.filter(id=i).update(end_date = datetime.now())
            return Response({'status':status.HTTP_200_OK,'message':'notification deleted successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 

class readNotifications(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data = request.data
            notificaton_ids = data.get('id')
            if notificaton_ids:
                for i in notificaton_ids:
                    CustomerNotifications.objects.filter(id=i).update(is_read = True)
            else:
                not_obj = CustomerNotifications.objects.filter(is_read = False)
                for notify in not_obj:
                    notify.is_read = True
                    notify.save()
            return Response({'status':status.HTTP_200_OK,'message':'notification read successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 	

class showNumber(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data = request.query_params
            inquery_id = data.get('id')
            property_type = data.get('type')
            if not inquery_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_type:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'type is required'},status=status.HTTP_400_BAD_REQUEST)
            
            if property_type =='PropertyProject':
                inquirePropertyProjectObj = inquirePropertyProject.objects.filter(id=inquery_id).first()
                inquirePropertyProjectObj.contract_status = 'In-Progress'
                inquirePropertyProjectObj.save()
            # CustomerNotifications.objects.create(customer_id=inquirePropertyProjectObj.customerId,message= 'Contract start from Seller side please check My-Deals.',is_read=True,notification_type='start_contract')
            return Response({'status':status.HTTP_200_OK,'message':'Updated successfully'},status=status.HTTP_200_OK,)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 

class contractStatus(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            inquiry_id = request.data.get('id')
            status_type = request.data.get('status_type')
            if not inquiry_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'inquiry id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not status_type:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'status_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if status_type == 'Rejected' or status_type == 'Accepted':
                inquirePropertyProjectObj = inquirePropertyProject.objects.filter(id=inquiry_id).first()
                inquirePropertyProjectObj.contract_status = status_type
                inquirePropertyProjectObj.save()
                CustomerNotifications.objects.create(customer_id=inquirePropertyProjectObj.customerId,message= f'The request has been {status_type} by the owning party.',notification_type='contract_status')
                return Response({'status':status.HTTP_200_OK,'message':f'The contract has been {status_type} by the owning party.'},status=status.HTTP_200_OK)
            else:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Status type must be Accepted/Rejected'},status=status.HTTP_400_BAD_REQUEST)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
class startContract(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data = request.data
            contract_file = data.get('contract_file')
            company_name = data.get('company_name')
            full_name = data.get('full_name')
            tasks  =data.get('tasks')
            inquiry_id = request.data.get('id')
            if not contract_file:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Please select contract file'},status=status.HTTP_400_BAD_REQUEST)
            if not full_name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'full_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company_name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'company_name is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not tasks:
            #     return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Please add a task'},status=status.HTTP_400_BAD_REQUEST)
            if not inquiry_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'inquiry id is required'},status=status.HTTP_400_BAD_REQUEST)
            inquireObj = inquirePropertyProject.objects.filter(id=inquiry_id).first()
            if inquireObj.contract_status == 'Completed':
                return Response({'status':status.HTTP_403_FORBIDDEN,'message':'Contract is already created'},status=status.HTTP_403_FORBIDDEN)
            contractObj = Contract.objects.create(inquiry_id=inquireObj,contract_file=contract_file,company_name=company_name,full_name=full_name)
            inquireObj = inquirePropertyProject.objects.filter(id=contractObj.inquiry_id.id).first()
            inquireObj.contract_status = 'Completed'
            inquireObj.contract_id = contractObj.id
            inquireObj.save()
            CustomerNotifications.objects.create(customer_id=inquireObj.customerId,message= 'Contract start from Seller side please check My-Deals.',notification_type='start_contract')
            return Response({'status':status.HTTP_200_OK,'message':'Contract start from Seller Successfully','contract_id':contractObj.id},status=status.HTTP_200_OK)

        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 contractSignee(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data = request.query_params
            contract_id = data.get('id')
            if not contract_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'contract id is required'},status=status.HTTP_400_BAD_REQUEST)
            contractObj = Contract.objects.filter(id=contract_id).first()
            inquireObj = inquirePropertyProject.objects.filter(id=contractObj.inquiry_id.id).first()
            if contractObj.inquiry_id.customerId == customerObj:
                alldata = {
                    'id': contractObj.id,
                    
                    'owner_full_name':contractObj.owner_full_name,
                    'owner_email':contractObj.owner_email,
                    'owner_signature':contractObj.owner_signature,
                    'contract_file':contractObj.contract_file,
                    "buyer_full_name":contractObj.buyer_full_name,
                    "buyer_email":contractObj.buyer_email,
                    "buyer_signature":contractObj.buyer_signature,
                    'contract_status':inquireObj.contract_status,
                    'user_type':'buyer',
                }
            else:
                alldata = {
                    'id': contractObj.id,
                    
                    'owner_full_name':contractObj.owner_full_name,
                    'owner_email':contractObj.owner_email,
                    'owner_signature':contractObj.owner_signature,
                    'contract_file':contractObj.contract_file,
                    "buyer_full_name":contractObj.buyer_full_name,
                    "buyer_email":contractObj.buyer_email,
                    "buyer_signature":contractObj.buyer_signature,
                    'contract_status':inquireObj.contract_status,
                    'user_type':'seller',
                }
            return Response({'status':status.HTTP_200_OK,'message':'contract signed successfully','data':alldata},status=status.HTTP_200_OK,)
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data = request.data
            contract_id = data.get('id')
            owner_full_name = data.get('owner_full_name')
            owner_email = data.get('owner_email')
            owner_signature = data.get('owner_signature')
            buyer_full_name = data.get('buyer_full_name')
            buyer_email = data.get('buyer_email')
            buyer_signature = data.get('buyer_signature')
            if not contract_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'contract id is required'},status=status.HTTP_400_BAD_REQUEST)
            contractObj = Contract.objects.filter(id=contract_id).first()
            if not contractObj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'invalid contract id'},status=status.HTTP_400_BAD_REQUEST)
            if contractObj.inquiry_id.customerId == customerObj:
                if not buyer_full_name:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'buyer_full_name is required'},status=status.HTTP_400_BAD_REQUEST)
                if not buyer_email:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'buyer_email is required'},status=status.HTTP_400_BAD_REQUEST)
                if not buyer_signature:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'buyer_signature is required'},status=status.HTTP_400_BAD_REQUEST)
                contractObj.buyer_full_name= buyer_full_name
                contractObj.buyer_email= buyer_email
                contractObj.buyer_signature= buyer_signature
                contractObj.save()
            else:
                if not owner_full_name:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'owner_full_name is required'},status=status.HTTP_400_BAD_REQUEST)
                if not owner_email:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'owner_email is required'},status=status.HTTP_400_BAD_REQUEST)
                if not owner_signature:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'owner_signature is required'},status=status.HTTP_400_BAD_REQUEST)
                contractObj.owner_full_name= owner_full_name
                contractObj.owner_email= owner_email
                contractObj.owner_signature= owner_signature
                contractObj.save()
                inquireObj = inquirePropertyProject.objects.filter(id=contractObj.inquiry_id.id).first()
                inquireObj.contract_status = 'Signed'
                inquireObj.contract_id = contractObj.id
                inquireObj.save()
                CustomerNotifications.objects.create(customer_id=inquireObj.customerId,message= 'Contract Updated successfully',notification_type='contract_created')
            return Response({'status':status.HTTP_200_OK,'message':'contract signed successfully'},status=status.HTTP_200_OK)

        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 getPurchasedetail(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data = request.query_params
            contract_id = data.get('id')
            if not contract_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'contract id is required'},status=status.HTTP_400_BAD_REQUEST)
            contractObj = Contract.objects.filter(id=contract_id).first()
            if not contractObj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'contract not found'},status=status.HTTP_400_BAD_REQUEST)
            inquireObj = inquirePropertyProject.objects.filter(id=contractObj.inquiry_id.id).first()
            property_type = inquireObj.property_type
            
            allData = []

            
            item_data = {
                    'id': contractObj.id,
                }
            if property_type == 'sale_rent_property':
                item_data.update({
                    'property_image': inquireObj.sale_rent_property.image if inquireObj.sale_rent_property and inquireObj.sale_rent_property.image else None,
                    'property_name': inquireObj.sale_rent_property.title if inquireObj.sale_rent_property and inquireObj.sale_rent_property.title else None,
                    'price': inquireObj.sale_rent_property.price if inquireObj.sale_rent_property and inquireObj.sale_rent_property.price else None,
                    'location': inquireObj.sale_rent_property.location if inquireObj.sale_rent_property and inquireObj.sale_rent_property.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type
                })

            elif property_type == 'sale_property':
                
                item_data.update({
                    'property_image': inquireObj.sale_property.image_data if inquireObj.sale_property and inquireObj.sale_property.image_data else None,
                    'property_name': inquireObj.sale_property.title if inquireObj.sale_property and inquireObj.sale_property.title else None,
                    'price': inquireObj.sale_property.price if inquireObj.sale_property and inquireObj.sale_property.price else None,
                    'location': inquireObj.sale_property.location if inquireObj.sale_property and inquireObj.sale_property.location else None  ,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type            
                })

            elif property_type == 'bussiness_for_sale':
                
                item_data.update({
                    'property_image': inquireObj.bussiness_for_sale.image_data if inquireObj.bussiness_for_sale and inquireObj.bussiness_for_sale.image_data else None,
                    'property_name': inquireObj.bussiness_for_sale.short_title if inquireObj.bussiness_for_sale and inquireObj.bussiness_for_sale.short_title else None,
                    'price': inquireObj.bussiness_for_sale.cost if inquireObj.bussiness_for_sale and inquireObj.bussiness_for_sale.cost else None,
                    'location': inquireObj.bussiness_for_sale.location if inquireObj.bussiness_for_sale and inquireObj.bussiness_for_sale.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type                    
                })

            elif property_type == 'HouseRent':
                
                item_data.update({
                    'property_image': inquireObj.house_wanted_for_rent.image if inquireObj.house_wanted_for_rent and inquireObj.house_wanted_for_rent.image else None,
                    'property_name': inquireObj.house_wanted_for_rent.short_title if inquireObj.house_wanted_for_rent and inquireObj.house_wanted_for_rent.short_title else None,
                    'price': inquireObj.house_wanted_for_rent.max_month_price if inquireObj.house_wanted_for_rent and inquireObj.house_wanted_for_rent.max_month_price else None,
                    'location': inquireObj.house_wanted_for_rent.location if inquireObj.house_wanted_for_rent and inquireObj.house_wanted_for_rent.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type                    
                })

            elif property_type == 'investment_my_project':
                
                item_data.update({
                    'property_image': inquireObj.investment_my_project.image_data if inquireObj.investment_my_project and inquireObj.investment_my_project.image_data else None,
                    'property_name': inquireObj.investment_my_project.property_name if inquireObj.investment_my_project and inquireObj.investment_my_project.property_name else None,
                    'price': inquireObj.investment_my_project.equity_price if inquireObj.investment_my_project and inquireObj.investment_my_project.equity_price else None,
                    'location': inquireObj.investment_my_project.location if inquireObj.investment_my_project and inquireObj.investment_my_project.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type                    
                })

            elif property_type == 'PropertyProject':
                
                item_data.update({
                    'property_image': inquireObj.property_project.image_data if inquireObj.property_project and inquireObj.property_project.image_data else None,
                     'property_name': inquireObj.property_project.property_name if inquireObj.property_project and inquireObj.property_project.property_name else None,
                    'price': inquireObj.property_project.purchase_price if inquireObj.property_project and inquireObj.property_project.purchase_price else None,
                    'location': inquireObj.property_project.location if inquireObj.property_project and inquireObj.property_project.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type                    
                })

            elif property_type == 'company_seeking_equity':
                
                item_data.update({
                    'property_image': inquireObj.company_seeking_equity.property_image if inquireObj.company_seeking_equity and inquireObj.company_seeking_equity.property_image else None,
                    'property_name': inquireObj.company_seeking_equity.short_title if inquireObj.company_seeking_equity and inquireObj.company_seeking_equity.short_title else None,
                    'price': inquireObj.company_seeking_equity.price_per_share if inquireObj.company_seeking_equity and inquireObj.company_seeking_equity.price_per_share else None,
                    'location': inquireObj.company_seeking_equity.location if inquireObj.company_seeking_equity.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type                    
                })

            elif property_type == 'investment_my_company':
                
                item_data.update({
                    'property_image': inquireObj.investment_my_company.company_logo if inquireObj.investment_my_company and inquireObj.investment_my_company.company_logo else None,
                    'property_name': inquireObj.investment_my_company.property_name if inquireObj.investment_my_company and inquireObj.investment_my_company.property_name else None,
                    'price': None,
                    'location': inquireObj.investment_my_company.location if inquireObj.investment_my_company.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type                    
                })

            elif property_type == 'property_developers':
                
                item_data.update({
                    'property_image': inquireObj.property_developers.property_image if inquireObj.property_developers and inquireObj.property_developers.property_image else None,
                    'property_name': inquireObj.property_developers.property_name if inquireObj.property_developers and inquireObj.property_developers.property_name else None,
                    'price': None,
                    'location': inquireObj.property_developers.location if inquireObj.property_developers.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type                    
                })

            elif property_type == 'BusinessSale':
    
                item_data.update({
                    'property_image': inquireObj.bussiness_for_sale.image_data if inquireObj.bussiness_for_sale and inquireObj.bussiness_for_sale.image_data else None,
                    'property_name': inquireObj.bussiness_for_sale.short_title if inquireObj.bussiness_for_sale and inquireObj.bussiness_for_sale.short_title else None,
                    'price': inquireObj.bussiness_for_sale.cost if inquireObj.bussiness_for_sale and inquireObj.bussiness_for_sale.cost else None,
                    'location': inquireObj.bussiness_for_sale.location if inquireObj.bussiness_for_sale and inquireObj.bussiness_for_sale.location else None,
                    'investment_amount':inquireObj.investment_amount,
                    'property_type':inquireObj.property_type                    
                })


            

            allData.append(item_data)
            return Response({'status':status.HTTP_200_OK,'message':'Purchase detail fetched successfully','data':item_data},status=status.HTTP_200_OK)
        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 inquireMail(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            data=request.data
            property_id = data.get('id')
            Type = data.get('type')
            telephone = data.get('telephone')
            message = data.get('message')
            email = data.get('email')
            if not email:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not telephone:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Telephone is required'},status=status.HTTP_400_BAD_REQUEST)
            if not message:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Message is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not Type:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'type is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
            # BusinessSale
            if Type == 'BusinessSale':
                bussinessSale = BussinessForSale.objects.filter(id=property_id).first()
                if not bussinessSale:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No business for sale found'},status=status.HTTP_400_BAD_REQUEST)
                customer_email = bussinessSale.customerId.email 
                customer_id = bussinessSale.customerId


            # HouseRent
            if Type == 'HouseRent':
                houseWantedRent = HouseWantedForRent.objects.filter(id=property_id).first()
                if not houseWantedRent:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No house wanted for rent found'},status=status.HTTP_400_BAD_REQUEST)
                customer_email = houseWantedRent.customerId.email 
                customer_id = houseWantedRent.customerId


            # # InvestmentProject
            # if Type == 'InvestmentProject':
            # 	investmentProject = InvestmentMyProject.objects.filter(id=property_id).first()
            # 	if not investmentProject:
            # 		return Response({'message':'No investment for project found'},status=status.HTTP_400_BAD_REQUEST)
            # 	customer_email = investmentProject.customerId.email 

            # # InvestmentCompany
            # if Type == 'InvestmentCompany':
            # 	investmentCompany = InvestmentMyCompany.objects.filter(id=property_id).first()
            # 	if not investmentCompany:
            # 		return Response({'message':'No investment for company found'},status=status.HTTP_400_BAD_REQUEST)
            # 	customer_email = investmentCompany.customerId.email 

            # # PropertyProject
            # if Type == 'PropertyProject':
            # 	propertyProject = PropertyProject.objects.filter(id=property_id).first()
            # 	if not propertyProject:
            # 		return Response({'message':'No property project found'},status=status.HTTP_400_BAD_REQUEST)
            # 	customer_email = propertyProject.customerId.email 

            # Sale
            if Type == 'SaleProperty':
                salepropertyProject = SaleProperty.objects.filter(id=property_id).first()
                if not salepropertyProject:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No sale for property found'},status=status.HTTP_400_BAD_REQUEST)
                customer_email = salepropertyProject.customerId.email 
                customer_id = salepropertyProject.customerId


            # Rent
            if Type == 'RentProperty':
                rentpropertyProject = RentProperty.objects.filter(id=property_id).first()
                if not rentpropertyProject:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No rent for property found'},status=status.HTTP_400_BAD_REQUEST)
                customer_email = rentpropertyProject.customerId.email
                customer_id = rentpropertyProject.customerId

            context = {}
            context['message'] = message
            context['telephone'] = telephone
            context['name'] = customerObj.firstName
            context['email'] = email
            email_data = render_to_string('inquiry_mail.html',context)
            to_emails = customer_email
            subject = "Reeipo Property"
            message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
            message.attach_alternative(email_data, "text/html")
            message.send(fail_silently=False)
            AdminNotifications.objects.create(message= customerObj.firstName+''+customerObj.lastName+' has inquire on a property',notification_type='property_inquire')
            CustomerNotifications.objects.create(customer_id=customer_id,message= customerObj.firstName+' '+customerObj.lastName+' has inquire your property',notification_type='property_inquire')
            return Response({'status':status.HTTP_200_OK,'message':'Inquired successfully'},status=status.HTTP_200_OK)
        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 propertyPayment(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            payment_mode = request.data.get('payment_mode')
            if not payment_mode:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'payment mode is required'},status=status.HTTP_400_BAD_REQUEST)
            contract_id = request.data.get('contract_id')
            if not contract_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Contract Id is required'},status=status.HTTP_400_BAD_REQUEST)
            contract_obj = Contract.objects.filter(id=contract_id).first()
            if payment_mode == 'Online':
                # url = 'https://api.escrow.com/2017-09-01/transaction'
                # auth = ('info@bobben.no', '3277_xmU2gd1mM9B80Fyq6AQFA3OD22ZXG5ocboauhuuh8xmDnODNZQpHw32olN43R5Nc')
                # data = {
                # 	"parties": [
                # 		{
                # 			"role": "buyer",
                # 			"customer": contract_obj.inquiry_id.customerId.email
                # 		},
                # 		{
                # 			"role": "seller",
                # 			"customer": contract_obj.owner_email
                # 		}
                # 	],
                # 	"currency": "usd",
                # 	"description": contract_obj.inquiry_id.property_project.short_title,
                # 	"items": [
                # 		{
                # 			"title": contract_obj.inquiry_id.property_project.short_title,
                # 			"description": contract_obj.inquiry_id.property_project.short_title,
                # 			"type": "general_merchandise",
                # 			"inspection_period": 259200,
                # 			"quantity": 1,
                # 			"schedule": [
                # 				{
                # 					"amount": contract_obj.inquiry_id.property_project.price,
                # 					"payer_customer": contract_obj.inquiry_id.customerId.email,
                # 					"beneficiary_customer":contract_obj.owner_email,
                # 				}
                # 			]
                # 		}
                # 	]
                # }

                # parties = data.get("parties", [])
    
                # for party in parties:
                # 	if party.get("role") == "seller":
                # 		next_step_url = party.get("next_step")




                Payment.objects.create(mode = payment_mode,payment_status = 'Success',contract = contract_obj,Customer =customerObj)
                inquireObj = inquirePropertyProject.objects.filter(id=contract_obj.inquiry_id.id).first()
                inquireObj.contract_status = 'Deal-Completed'
                inquireObj.save()
                return Response({'status':status.HTTP_200_OK,'message':'Online payment done successfully','customer_id':inquireObj.customerId.id,'url':next_step_url},status=status.HTTP_200_OK)
            else:
                payment_recipet = request.data.get('payment_recipet')
                if not payment_recipet:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'payment recipet is required'},status=status.HTTP_400_BAD_REQUEST)
                Payment.objects.create(mode = 'Offline',payment_status = 'Success',contract = contract_obj,recipet_status='Pending',payment_recipet=payment_recipet,Customer =customerObj)
                inquireObj = inquirePropertyProject.objects.filter(id=contract_obj.inquiry_id.id).first()
                inquireObj.contract_status = 'Payment-Completed'
                inquireObj.save()
                return Response({'status':status.HTTP_200_OK,'message':'Offline payment applied successfully','customer_id':inquireObj.customerId.id},status=status.HTTP_200_OK,)
        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 uploadRecipet(APIView):
    def post(self,request):
        try:
            data = request.data
            recipet_data = data.get('file')
            if recipet_data:
                from django.conf import settings
                fileUrl=uploadTheRecipet(recipet_data)
                fileUrl=str(settings.BASE_URL)+fileUrl
            return Response({'status':status.HTTP_200_OK,'message':'recipet uploaded Successfully','url':str(fileUrl)},status=status.HTTP_200_OK,)
        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 myPaymentDeals(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            payment_obj = Payment.objects.filter(Customer=customerObj)
            all_Data = []
            for pay in payment_obj:
                all_data = {
                    'id':pay.id,
                    'mode' : pay.mode,
                    'payment_status':pay.payment_status,
                    'contract_id':pay.contract.id,
                    'recipet_status':pay.recipet_status,
                    'payment_recipet':pay.payment_recipet,
                    'property_name':pay.contract.inquiry_id.property_project.property_name,
                    'created_at':pay.start_date,
                }
                all_Data.append(all_data)
            return Response({'status':status.HTTP_200_OK,'message':'payment deals fetched successfully','data':all_Data},status=status.HTTP_200_OK)
        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 approveOfflinePayment(APIView):
    # list the property FKs in the priority you want
    PROPERTY_FKS = [
        "property_project",
        "sale_rent_property",
        "sale_property",
        "rent_property",
        "bussiness_for_sale",
        "house_wanted_for_rent",
        "investment_my_project",
        "investment_my_company",
        "company_seeking_equity",
        "property_developers",
    ]

    def _get_inquiry_title(self, inquiry):
        # pick the first non-null property FK
        for field in self.PROPERTY_FKS:
            obj = getattr(inquiry, field, None)
            if obj is not None:
                # try common title attrs; fallback to str(obj)
                for attr in ("short_title", "title", "name"):
                    val = getattr(obj, attr, None)
                    if val:
                        return val
                return str(obj)
        # if none set, raise (or return a default)
        raise ValueError("No property reference set on this inquiry.")

    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response(
                    {"status_code": status.HTTP_401_UNAUTHORIZED, "message": str(e)},
                    status=status.HTTP_401_UNAUTHORIZED,
                )

            customerObj = Customer.objects.filter(user=uid).first()

            inquiry_id = request.data.get("inquiry_id")
            payment_response = request.data.get("payment_response")

            if not inquiry_id:
                return Response(
                    {"status": status.HTTP_400_BAD_REQUEST, "message": "Inquiry id is required"},
                    status=status.HTTP_400_BAD_REQUEST,
                )

            inquireObj = inquirePropertyProject.objects.filter(contract_id=inquiry_id).first()
            if not inquireObj:
                return Response(
                    {"status": status.HTTP_400_BAD_REQUEST, "message": "No inquiry found."},
                    status=status.HTTP_400_BAD_REQUEST,
                )

            try:
                title = self._get_inquiry_title(inquireObj)
            except ValueError as e:
                return Response(
                    {"status": status.HTTP_400_BAD_REQUEST, "message": str(e)},
                    status=status.HTTP_400_BAD_REQUEST,
                )

            if payment_response == "Accepted":
                inquireObj.contract_status = "Deal-Completed"
                CustomerNotifications.objects.create(
                    customer_id=inquireObj.customerId,
                    message=f"Your payment for {title} has been accepted.",
                )
            else:
                inquireObj.contract_status = "Payment-Rejected"
                EmailMultiAlternatives(
                    subject="Payment Rejected",
                    from_email=settings.EMAIL_HOST_USER,
                    to=[inquireObj.email],
                    body=f"Hello {inquireObj.name}, your payment has been rejected for {title}.",
                ).send(fail_silently=False)
                CustomerNotifications.objects.create(
                    customer_id=inquireObj.customerId,
                    message=f"Your payment for {title} has been rejected.",
                )

            inquireObj.save()
            return Response(
                {"status": status.HTTP_200_OK, "message": "Offline payment processed successfully"},
                status=status.HTTP_200_OK,
            )

        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 paymentDetails(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            contract_id = request.query_params.get('contract_id')
            if not contract_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Contract Id is required'},status=status.HTTP_400_BAD_REQUEST)
            payment_obj = Payment.objects.filter(contract=contract_id).first()
            if not payment_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No payment details found.'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'id':payment_obj.id,
                'mode' : payment_obj.mode,
                'payment_status':payment_obj.payment_status,
                'contract_id':payment_obj.contract,
                'recipet_status':payment_obj.recipet_status,
                'payment_recipet':payment_obj.payment_recipet,
            }
            return Response({'status':status.HTTP_200_OK,'message':'payment detail fetched successfully','data':all_data},status=status.HTTP_200_OK)
        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 getRecipetData(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            contract_id = request.query_params.get('contract_id')
            if not contract_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Contract Id is required'},status=status.HTTP_400_BAD_REQUEST)
            payment_obj = Payment.objects.filter(contract=contract_id).first()
            if not payment_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No payment details found.'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'id':payment_obj.id,
                'payment_recipet':payment_obj.payment_recipet,
            }
            return Response({'status':status.HTTP_200_OK,'message':'Recipet data fetched successfully','data':all_data},status=status.HTTP_200_OK)

        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 draftListing(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

            customerObj=Customer.objects.filter(user=uid).first()
            bussinessSale = BussinessForSale.objects.filter(customerId=customerObj,is_draft=True,end_date__isnull = True)
            houseWantedRent = HouseWantedForRent.objects.filter(customerId=customerObj,is_draft=True,end_date__isnull = True)
            investmentProject = InvestmentMyProject.objects.filter(customerId=customerObj,is_draft=True,end_date__isnull = True)
            investmentCompany = InvestmentMyCompany.objects.filter(customerId=customerObj,is_draft=True,end_date__isnull = True)
            propertyProject = PropertyProject.objects.filter(customerId=customerObj,is_draft=True,end_date__isnull = True)
            saleProperty = SaleProperty.objects.filter(customerId=customerObj,is_draft=True,end_date__isnull = True)
            rentProperty = RentProperty.objects.filter(customerId=customerObj,is_draft=True,end_date__isnull = True)

            allData= []
            for bs in bussinessSale:
                allData.append({'id':bs.id,
                    'company_name':bs.company_name,
                    'image_data':bs.image_data,
                    'price':bs.purchase_price,
                    'note_to_purchase':bs.note_to_purchase,
                    'total_turnover':bs.total_turnover,
                    'operating_profit':bs.operating_profit,
                    'salary_percentage':bs.salary_percentage,
                    'type':"BusinessSale",})
            for hWr in houseWantedRent:
                allData.append({'id':hWr.id,
                    'first_name':hWr.first_name,
                    'image_data':hWr.image,
                    'gender':hWr.gender,
                    'address':hWr.address,
                    'nationality':hWr.nationality,
                    'about':hWr.about,
                    'property_type':hWr.property_type,
                    'max_month_price':hWr.max_month_price,
                    'no_of_resident':hWr.no_of_resident,
                    'property_type':hWr.property_type,
                    'wanted_from':hWr.wanted_from,
                    'type':"HouseRent"})
            for ip in investmentProject:
                allData.append({'id':ip.id,
                    'project_name':ip.project_name,
                    'image_data':ip.image_data,
                    'location':ip.location,
                    'investment_strategy':ip.investment_strategy,
                    'investment_type':ip.investment_type,
                    'target_irr':ip.target_irr,
                    'target_return_on_cost':ip.target_return_on_cost,
                    'offered_by':ip.offered_by,
                    'overview':ip.overview,
                    'type':"InvestmentProject"})
            for ic in investmentCompany:
                allData.append({'id':ic.id,
                    'company_name':ic.company_name,
                    'image_data':ic.image_data,
                    'description':ic.description,
                    'the_valuation':ic.the_valuation,
                    'shares_for_sale':ic.shares_for_sale,
                    'remaninig_shares':ic.remaninig_shares,
                    'minimum_drawing':ic.minimum_drawing,
                    'max_drawing':ic.max_drawing,
                    'type':"InvestmentCompany"})
            for pp in propertyProject:
                allData.append({'id':pp.id,
                    'short_title':pp.short_title,
                    'image_data':pp.image_data,
                    'property_name':pp.property_name,
                    'purchase_price':pp.price,
                    'propert_rent':pp.rent_to_landlord,
                    'cashflow_pcm':pp.cashflow_pcm,
                    'finder_fees':pp.finder_fees,
                    'return_on_investment':pp.return_on_investment,
                    'town':pp.town,
                    'type':"PropertyProject"})
            for sp in saleProperty:
                alldata = {
                    'id':sp.id,
                    'title':sp.title,
                    'image_data':sp.image_data,
                    'price':sp.price,
                    'descriptioon':sp.descriptioon,
                    'latitude':sp.latitude,
                    'longitude':sp.longitude,
                    'size':sp.size,
                    'bedrooms':sp.bedrooms,
                    'bathrooms':sp.bathrooms,
                    'type':"SaleProperty",
                }
                allData.append(alldata)
            for rp in rentProperty:
                alldata = {
                    'id':rp.id,
                    'title':rp.title,
                    'image_data':rp.image_data,
                    'descriptioon':rp.description,
                    'monthly_rent':rp.monthly_rent,
                    'rented_from':rp.rented_from,
                    'rented_to':rp.rented_to,
                    'latitude':rp.latitude,
                    'longitude':rp.longitude,
                    'use_area':rp.use_area,
                    'street_address':rp.street_address,
                    'bathrooms':rp.bathrooms,
                    'bedrooms':rp.bedrooms,
                    'type':"RentProperty",
                }
                allData.append(alldata)


            return Response({'status':status.HTTP_200_OK,'message':'draft listing fetched successfully','data':allData},status=status.HTTP_200_OK)
        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 SendPropertyRequestReeipoAgent(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            
            customerObj=Customer.objects.filter(user=uid).first()
            data=request.data
            mobile_number = data.get('mobile_number')
            name = data.get('name')
            email = data.get('email')
            property_type = data.get('property_type')
            buyer_signature = data.get('signature')
            if not email:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not mobile_number:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'mobile_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not name:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_type:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if not buyer_signature:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'signature is required'},status=status.HTTP_400_BAD_REQUEST)
            do_obj = DoItByReeipoRequests.objects.create(customer=customerObj,mobile_number=mobile_number,name=name,email=email,property_type=property_type,buyer_signature=buyer_signature)
            AdminNotifications.objects.create(message= customerObj.firstName+' '+customerObj.lastName+' has request to upload his property by Reeipo Team',is_read=True,notification_type='upload_property_request')
            return Response({'status':status.HTTP_200_OK,'message':'Request sent successfully','form_id':do_obj.id},status=status.HTTP_200_OK)
        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 customerSaveSearches(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            
            customerObj=Customer.objects.filter(user=uid).first()
            save_searches =  request.data.get('save_searches')

            if not save_searches:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'save_searches is required'},status=status.HTTP_400_BAD_REQUEST)
            CustomerSaveSearches.objects.create(customer=customerObj,save_searches=save_searches)
            return Response({'status':status.HTTP_200_OK,'message':'Customer save searches Added successfully'},status=status.HTTP_200_OK)
        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 customerSaveSearchEdit(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            
            customerObj=Customer.objects.filter(user=uid).first()
            search_id = request.data.get('search_id')
            if not search_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'search_id is required'},status=status.HTTP_400_BAD_REQUEST)

            save_searches =  request.data.get('save_searches')

            if not save_searches:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'save_searches is required'},status=status.HTTP_400_BAD_REQUEST)
            


            CustomerSaveSearches.objects.filter(id=search_id).update(customer=customerObj,save_searches=save_searches)
            return Response({'status':status.HTTP_200_OK,'message':'Customer save searches edited success'},status=status.HTTP_200_OK)
        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 customerSaveSearchDelete(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            
            customerObj=Customer.objects.filter(user=uid).first()

            search_id = request.data.get('search_id')
            if not search_id:
                return Response({'message':'search_id is required'},status=status.HTTP_400_BAD_REQUEST)
            search_obj = CustomerSaveSearches.objects.filter(id=search_id).first()
            if not search_obj:
                return Response({'message':'Save search not found'},status=status.HTTP_400_BAD_REQUEST)
            search_obj.delete()
            return Response({'status':status.HTTP_200_OK,'message':'customer save search deleted successfully'},status=status.HTTP_200_OK,)
        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 getSaveSearchCustomer(APIView):
    def get(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

            customerObj = Customer.objects.filter(user=uid).first()

            search_obj = CustomerSaveSearches.objects.filter(customer=customerObj).order_by('-id')
            all_Data = []
            for search in search_obj:
                search_name = search.save_searches
                try:
                    search_name_json = ast.literal_eval(search_name)
                            
                    all_data = {
                        'id': search.id,
                        'type': search_name_json['type'],
                        'min_price': search_name_json['min_price'],
                        'max_price': search_name_json['max_price'],
                        'min_beds': search_name_json['min_beds'],
                        'max_beds': search_name_json['max_beds'],
                        'amenities': search_name_json['amenities'],
                        'location': search_name_json['location'],
                        'lat': search_name_json['lat'],
                        'lng': search_name_json['lng'],
                        'type_url': search_name_json['type_url'],
                        'is_default':'true',
                        'created_at':search.start_date,
                
                    }
                    all_Data.append(all_data)
                except json.JSONDecodeError:
                    pass  

            return Response({'status':status.HTTP_200_OK,'message': 'Save search customer fetched successfully','data': all_Data},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 addRatingReview(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()
            rating_data = request.data.get('rating_data')
            if not rating_data:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'rating_data is required'},status=status.HTTP_400_BAD_REQUEST)
            review_data = request.data.get('review_data')
            if not review_data:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'review_data is required'},status=status.HTTP_400_BAD_REQUEST)
            receive_customer_id = request.data.get('receive_customer_id')
            if not receive_customer_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'receive_customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            receieve_customer_obj = Customer.objects.filter(id = receive_customer_id).first()
            RatingAndReview.objects.create(send_customer=customerObj,receive_customer=receieve_customer_obj,rating=rating_data,review=review_data)
            return Response({'status':status.HTTP_200_OK,'message': 'Rating review Added successfully'},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 editRatingReview(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()	
            rating_id =  request.query_params.get('rating_id')
            if not rating_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'rating_id is required'},status=status.HTTP_400_BAD_REQUEST)
            rating_obj = RatingAndReview.objects.filter(id=rating_id).first()
            if not rating_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No rating data found is required'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'rating': rating_obj.rating,
                'review': rating_obj.review,

            }
            return Response({'status':status.HTTP_200_OK,'message': 'Rating review fetched successfully','data':all_data},status=status.HTTP_200_OK)
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
        
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()
            rating_id = request.data.get('rating_id')
            if not rating_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'rating_id is required'},status=status.HTTP_400_BAD_REQUEST)
            rating_data = request.data.get('rating_data')
            if not rating_data:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'rating_data is required'},status=status.HTTP_400_BAD_REQUEST)
            review_data = request.data.get('review_data')
            if not review_data:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'review_data is required'},status=status.HTTP_400_BAD_REQUEST)
            RatingAndReview.objects.filter(id=rating_id).update(rating=rating_data,review=review_data)
            return Response({'status':status.HTTP_200_OK,'message': 'Rating review edited successfully'},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 deleteRatingReview(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()	
            rating_id = request.data.get('rating_id')
            if not rating_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'rating_id is required'},status=status.HTTP_400_BAD_REQUEST)
            rating_obj = RatingAndReview.objects.filter(id = rating_id).first()
            rating_obj.delete()
            return Response({'status':status.HTTP_200_OK,'message': 'Rating review deleted successfully'},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 getMyRatings(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()	
            rating_obj = RatingAndReview.objects.filter(receive_customer=customerObj )
            all_Data = []
            for rating in rating_obj:
                all_data = {
                    'customer_name': rating.send_customer.firstName +" "+ rating.send_customer.lastName,
                    'customer_image': rating.send_customer.profileImage,
                    'rating': rating.rating,
                    'rating_date': rating.created_at,
                }
                all_Data.append(all_data)
            return Response({'status':status.HTTP_200_OK,'message': 'My rating fetched successfully','data':all_Data},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 getMyReviews(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()	
            review_obj = RatingAndReview.objects.filter(receive_customer=customerObj )
            all_Data = []
            for review in review_obj:
                all_data = {
                    'customer_name':review.send_customer.firstName+" "+review.send_customer.lastName,
                    'customer_image':review.send_customer.profileImage,
                    'reviews':review.review,
                    'review_date':review.start_date,
                }
                all_Data.append(all_data)
            return Response({'status':status.HTTP_200_OK,'message': 'My reviews fetched successfully','data':all_Data},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 viewRatingReviews(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()	
            customer_id =  request.query_params.get('customer_id')
            if not customer_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            rating_obj = RatingAndReview.objects.filter(receive_customer = customer_id)
            if rating_obj:
                average_rating = RatingAndReview.objects.filter(receive_customer=customer_id).aggregate(Avg('rating'))['rating__avg']
                total_reviews = RatingAndReview.objects.filter(receive_customer = customer_id).count()
                rating_review_data = []
                for rating in rating_obj:
                    all_data = {
                        'customer_name':rating.send_customer.firstName+" "+rating.send_customer.firstName,
                        'customer_image':rating.send_customer.profileImage,
                        'rating':rating.rating,
                        'review':rating.review,
                        'rating_review_date':rating.start_date,

                    }
                    rating_review_data.append(all_data)
                return Response({'status':status.HTTP_200_OK,'message': 'rating review viewed successfully','rating_review_data':rating_review_data,'average_rating':round(average_rating),'total_reviews':total_reviews},status=status.HTTP_200_OK)			
            else:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message': 'rating review does not exist','rating_review_data':" ",'average_rating':" ",'total_reviews':" "},status=status.HTTP_400_BAD_REQUEST)			

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

class CustomerProfileDetails(APIView):
    def get(self,request):
        try:
            customer_id =  request.query_params.get('customer_id')
            if not customer_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            customer_data = Customer.objects.filter(id = customer_id).first()
            if not customer_data:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No customer found'},status=status.HTTP_400_BAD_REQUEST)
            filter_data =  request.GET.get('filter_data')
            sort_price = request.GET.get('sort_price')
            selected_type = request.GET.get('type')
            sort_upload_date = request.GET.get('sort_upload_date')
            average_rating = RatingAndReview.objects.filter(receive_customer=customer_id).aggregate(Avg('rating'))['rating__avg']
            total_reviews = RatingAndReview.objects.filter(receive_customer = customer_id).count()
            customer_all_data = {
                'customer_name':customer_data.firstName+" "+customer_data.lastName,
                'customer_email':customer_data.email,
                'phone_number':customer_data.phoneNumber,
                'whatsapp_number':customer_data.whatsappNumber,
                'date_of_birth':customer_data.dob,
                'profile_image':customer_data.profileImage,
                'gender':customer_data.gender,
                'address':customer_data.address,
                'nationality':customer_data.nationality,
                'bio':customer_data.bio,
                'facebook_url':customer_data.facebook_url,
                'instagram_url':customer_data.instagram_url,
                'linkedin_url':customer_data.linkedin_url,
                'pintrest_url':customer_data.pintrest_url,
                'twitter_url':customer_data.twitter_url,
                'youtube_url':customer_data.youtube_url,
            }
            saleProperty = SaleProperty.objects.filter(end_date__isnull = True,customerId=customer_id)
            rentProperty = RentProperty.objects.filter(end_date__isnull = True,customerId=customer_id)
            bussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,customerId=customer_id)
            houseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,customerId=customer_id)
            investmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,customerId=customer_id)
            investmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,customerId=customer_id)
            propertyProject = PropertyProject.objects.filter(end_date__isnull = True,customerId=customer_id)
            propertyData= []
            if saleProperty:
                for salelist in saleProperty:
                    alldata = {
                        'id':salelist.id,
                        'title':salelist.title,
                        'image_data':salelist.image_data,
                        'price':salelist.price,
                        'filter_price':salelist.price,
                        'descriptioon':salelist.descriptioon,
                        'bedrooms':salelist.bedrooms,
                        'bathrooms':salelist.bathrooms,
                        'latitude':salelist.latitude,
                        'longitude':salelist.longitude,
                        'readyBy':salelist.readyBy,
                        'size':salelist.size,
                        'subscription_type':salelist.subscription_type,
                        'created_date':salelist.created_at,
                        'type':"SaleProperty",
                    }
                    propertyData.append(alldata)
            if rentProperty:
                for rentlist in rentProperty:
                    alldata = {
                        'id':rentlist.id,
                        'title':rentlist.title,
                        'image_data':rentlist.image_data,
                        'monthly_rent':rentlist.monthly_rent,
                        'filter_price':rentlist.monthly_rent,
                        'descriptioon':rentlist.description,
                        'bedrooms':rentlist.bedrooms,
                        'bathrooms':rentlist.bathrooms,
                        'latitude':rentlist.latitude,
                        'longitude':rentlist.longitude,
                        'subscription_type':rentlist.subscription_type,
                        'created_date':rentlist.created_at,
                        'type':"RentProperty",
                    }
                    propertyData.append(alldata)
            if bussinessSale:
                for bs in bussinessSale:
                    propertyData.append({'id':bs.id,
                        'company_name':bs.company_name,
                        'image_data':bs.image_data,
                        'price':bs.purchase_price,
                        'filter_price':bs.purchase_price,
                        'note_to_purchase':bs.note_to_purchase,
                        'total_turnover':bs.total_turnover,
                        'operating_profit':bs.operating_profit,
                        'salary_percentage':bs.salary_percentage,
                        'subscription_type':bs.subscription_type,
                        'created_date':bs.start_date,
                        'type':"BusinessSale",})
            if houseWantedRent:
                for hWr in houseWantedRent:
                    propertyData.append({'id':hWr.id,
                        'first_name':hWr.first_name,
                        'image_data':hWr.image,
                        'gender':hWr.gender,
                        'address':hWr.address,
                        'nationality':hWr.nationality,
                        'about':hWr.about,
                        'property_type':hWr.property_type,
                        'max_month_price':hWr.max_month_price,
                        'filter_price':hWr.max_month_price,
                        'no_of_resident':hWr.no_of_resident,
                        'property_type':hWr.property_type,
                        'wanted_from':hWr.wanted_from,
                        'subscription_type':hWr.subscription_type,
                        'created_date':hWr.start_date,
                        'type':"HouseRent"})
            if investmentProject:
                for ip in investmentProject:
                    propertyData.append({'id':ip.id,
                        'project_name':ip.project_name,
                        'image_data':ip.image_data,
                        'location':ip.location,
                        'investment_strategy':ip.investment_strategy,
                        'investment_type':ip.investment_type,
                        'target_irr':ip.target_irr,
                        'target_return_on_cost':ip.target_return_on_cost,
                        'minimum_investment':ip.minimum_investment,
                        'filter_price':ip.minimum_investment,
                        'offered_by':ip.offered_by,
                        'overview':ip.overview,
                        'subscription_type':ip.subscription_type,
                        'created_date':ip.start_date,
                        'type':"InvestmentProject"})
            if investmentCompany:
                for ic in investmentCompany:
                    propertyData.append({'id':ic.id,
                        'company_name':ic.company_name,
                        'image_data':ic.image_data,
                        'description':ic.description,
                        'the_valuation':ic.the_valuation,
                        'shares_for_sale':ic.shares_for_sale,
                        'remaninig_shares':ic.remaninig_shares,
                        'minimum_drawing':ic.minimum_drawing,
                        'nomial_share_price':ic.nominal_share_price,
                        'filter_price':ic.nominal_share_price,
                        'max_drawing':ic.max_drawing,
                        'subscription_type':ic.subscription_type,
                        'created_date':ic.start_date,
                        'type':"InvestmentCompany"})
            if propertyProject:
                for pp in propertyProject:
                    propertyData.append({'id':pp.id,
                        'short_title':pp.short_title,
                        'image_data':pp.image_data,
                        'property_name':pp.property_name,
                        'purchase_price':pp.price,
                        'filter_price':pp.price,
                        'propert_rent':pp.rent_to_landlord,
                        'cashflow_pcm':pp.cashflow_pcm,
                        'return_on_investment':pp.return_on_investment,
                        'finder_fees':pp.finder_fees,
                        'gross_income':pp.gross_income,
                        'status':pp.status,
                        'town':pp.town,
                        'subscription_type':pp.subscription_type,
                        'created_date':pp.start_date,
                        'type':"PropertyProject"})
            if filter_data == 'true':
                if selected_type:
                    propertyData = [data for data in propertyData if data['type'] == selected_type]
                if sort_price == 'ascending':
                    propertyData = sorted(propertyData, key=lambda x: x['filter_price'])
                elif sort_price == 'desending':
                    propertyData = sorted(propertyData, key=lambda x: x['filter_price'], reverse=True)
                if sort_upload_date == "oldest":
                    propertyData = sorted(propertyData, key=lambda x: x['created_date'])
                elif sort_upload_date == "latest":
                    propertyData = sorted(propertyData, key=lambda x: x['created_date'], reverse=True)

            return Response({'status':status.HTTP_200_OK,'message': 'customer profile details fetched successfully','customer_all_data':customer_all_data,'propertyData':propertyData,'average_rating':float(format(average_rating,".2f")) if average_rating else 0,'total_reviews':total_reviews if total_reviews else 0},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 viewAllCustomerRatingReview(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()	
            customer_id =  request.query_params.get('customer_id')
            if not customer_id:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message':'customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            review_obj = RatingAndReview.objects.filter(receive_customer=customer_id )
            if not review_obj:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message':'No review data'},status=status.HTTP_400_BAD_REQUEST)
            all_Data = []
            for review in review_obj:
                all_data = {
                    'customer_name':review.send_customer.firstName+" "+review.send_customer.lastName,
                    'customer_image':review.send_customer.profileImage,
                    'reviews':review.review,
                    'review_date':review.start_date,
                }
                all_Data.append(all_data)
            return Response({'status':status.HTTP_200_OK,'message': 'Customer rating review fetched successfully','data':all_Data},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 SendBookMeetings(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()	
            booking_time = request.data.get('booking_time')
            if not booking_time:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'booking_time is required'},status=status.HTTP_400_BAD_REQUEST)
            booking_date = request.data.get('booking_date')
            if not booking_date:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'booking_date is required'},status=status.HTTP_400_BAD_REQUEST)
            property_id = request.data.get('property_id')
            if not property_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)
            bussiness_obj = BussinessForSale.objects.filter(id=property_id).first()
            if not bussiness_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No property found'},status=status.HTTP_400_BAD_REQUEST)
            message = request.data.get('message')
            if not message:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'message is required'},status=status.HTTP_400_BAD_REQUEST)
            phone_number = request.data.get('phone_number')
            if not phone_number:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            BookMeetings.objects.create(property = bussiness_obj,phone_number=phone_number,customerId=customerObj,book_date=booking_date,book_time=booking_time,message=message)
            CustomerNotifications.objects.create(customer_id=bussiness_obj.customerId,message= customerObj.firstName+ "booked a meeting with you regarding your added company "+bussiness_obj.company_name+'.',notification_type='property_meeting')
            return Response({'status':status.HTTP_200_OK,'message': 'Book meeting sent successfully'},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 BookingMeetingList(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()	
            booking_type =  request.query_params.get('booking_type')
            if not booking_type:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'booking_type is required'},status=status.HTTP_400_BAD_REQUEST)
            if booking_type == "sent":
                booking_obj = BookMeetings.objects.filter(customerId=customerObj)
            else:
                booking_obj = BookMeetings.objects.filter(property__customerId =customerObj)
            all_Data = []
            for booking in booking_obj:
                all_data = {
                    'meeting_id': booking.id,
                    'customer_name':booking.customerId.firstName+" "+booking.customerId.lastName,
                    'customer_image':booking.customerId.profileImage,
                    'property_name':booking.property.company_name,
                    'property_id':booking.property.id,
                    'book_date':booking.book_date,
                    'book_time':booking.book_time,
                    'phone_number':booking.phone_number,
                    'message':booking.message,
                    'meeting_status':booking.meeting_status,
                    'phone_number':booking.phone_number,
                    'created_date':booking.start_date,
                }
                all_Data.append(all_data)
            return Response({'status':status.HTTP_200_OK,'message': 'Booking meeting list fetched successfully','data':all_Data},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 BookingMeetingStatus(APIView):
    def post(self,request):
        try:
            meeting_id = request.data.get('meeting_id')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            status =  request.data.get('status')
            if not status:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'status is required'},status=status.HTTP_400_BAD_REQUEST)
            
            booking_obj = BookMeetings.objects.filter(id=meeting_id).first()
            if not booking_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No meeting found'},status=status.HTTP_400_BAD_REQUEST)
            
            booking_obj.meeting_status = status
            booking_obj.save()
            CustomerNotifications.objects.create(customer_id=booking_obj.customerId,message= 'You booking meeting for'+ booking_obj.property.company_name +' has been '+ status,notification_type='property_meeting')
            return Response({'status':status.HTTP_200_OK,'message': 'Status changed successfully'},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 AcceptBookingsMeeting(APIView):
    def post(self,request):
        try:
            meeting_id = request.data.get('meeting_id')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj = BookMeetings.objects.filter(id=meeting_id).first()
            if not booking_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No meeting found'},status=status.HTTP_400_BAD_REQUEST)
            accept_message = request.data.get('accept_message')
            booking_obj.meeting_status = 'accepted'
            booking_obj.save()

            html_message = render_to_string('accept_meeting.html',{'accept_message':accept_message,'property_name':booking_obj.property.company_name})
            plain_message = html_message
            from_email = settings.EMAIL_HOST_USER
            to = booking_obj.customerId.email
            subject = 'Meeting Accepted'
            mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            return Response({'status':status.HTTP_200_OK,'message': 'booking meeting accepted successfully'},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 RejectBookingsMeeting(APIView):
    def post(self,request):
        try:
            meeting_id = request.data.get('meeting_id')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj = BookMeetings.objects.filter(id=meeting_id).first()
            if not booking_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No meeting found'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj.meeting_status = 'rejected'
            booking_obj.save()

            reject_reason =  request.data.get('reject_reason')
            html_message = render_to_string('reject_meeting.html',{'reject_reason':reject_reason,'property_name':booking_obj.property.company_name})
            plain_message = html_message
            from_email = settings.EMAIL_HOST_USER
            to = booking_obj.customerId.email
            subject = 'Meeting Rejected'
            mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            return Response({'status':status.HTTP_200_OK,'message': 'Booked meeting rejected successfully'},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 ConfirmDealMeeting(APIView):
    def post(self,request):
        try:
            meeting_id = request.data.get('meeting_id')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj = BookMeetings.objects.filter(id=meeting_id).first()
            if not booking_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No meeting found'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj.meeting_status = 'confirm_deal'
            booking_obj.save()
            return Response({'status':status.HTTP_200_OK,'message': 'Deal confirmed successfully'},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 CancelDealMeeting(APIView):
    def post(self,request):
        try:
            meeting_id = request.data.get('meeting_id')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj = BookMeetings.objects.filter(id=meeting_id).first()
            if not booking_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No meeting found'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj.meeting_status = 'cancle_deal'
            booking_obj.save()
            return Response({'status':status.HTTP_200_OK,'message': 'Deal meeting canceled successfully'},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 CancelRequestMeeting(APIView):
    def post(self,request):
        try:
            meeting_id = request.data.get('meeting_id')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj = BookMeetings.objects.filter(id=meeting_id).first()
            if not booking_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No meeting found'},status=status.HTTP_400_BAD_REQUEST)
            booking_obj.meeting_status = 'cancle_request'
            booking_obj.save()
            return Response({'status':status.HTTP_200_OK,'message': 'request meeting canceled successfully'},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 MeetingDealPayment(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            payment_mode = request.data.get('payment_mode')
            if not payment_mode:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'payment mode is required'},status=status.HTTP_400_BAD_REQUEST)
            meeting_id = request.data.get('meeting_id')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            contract_obj = BookMeetings.objects.filter(id=meeting_id).first()
            if payment_mode == 'Online':
                MeetingPayment.objects.create(mode = payment_mode,payment_status = 'Success',contract = contract_obj,Customer =customerObj)
                contract_obj.meeting_status = 'deal_completed'
                contract_obj.save()
                return Response({'status':status.HTTP_200_OK,'message':'Online payment done successfully','customer_id':contract_obj.customerId.id},status=status.HTTP_200_OK)
            else:
                payment_recipet = request.data.get('payment_recipet')
                if not payment_recipet:
                    return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'payment recipet is required'},status=status.HTTP_400_BAD_REQUEST)
                MeetingPayment.objects.create(mode = 'Offline',payment_status = 'Success',contract = contract_obj,recipet_status='Pending',payment_recipet=payment_recipet,Customer =customerObj)
                contract_obj.meeting_status = 'deal_completed'
                contract_obj.save()
                return Response({'status':status.HTTP_200_OK,'message':'Offline payment applied successfully','customer_id':contract_obj.customerId.id},status=status.HTTP_200_OK)
        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 MyMeetingPaymentDeals(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            payment_obj = MeetingPayment.objects.filter(Customer=customerObj)
            all_Data = []
            for pay in payment_obj:
                all_data = {
                    'id':pay.id,
                    'mode' : pay.mode,
                    'payment_status':pay.payment_status,
                    'contract_id':pay.contract.id,
                    'recipet_status':pay.recipet_status,
                    'payment_recipet':pay.payment_recipet,
                    'property_name':pay.contract.property.company_name,
                    'created_at':pay.start_date,
                }
                all_Data.append(all_data)
            return Response({'status':status.HTTP_200_OK,'message':'meeting payment details fetched successfully','data':all_Data},status=status.HTTP_200_OK)
        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 ApproveOfflineMeetingPayment(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            meeting_id = request.data.get('meeting_id')
            payment_response = request.data.get('payment_response')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            inquireObj = BookMeetings.objects.filter(id=meeting_id).first()
            if not inquireObj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No meeting found.'},status=status.HTTP_400_BAD_REQUEST)
            if payment_response == "Accepted":
                inquireObj.meeting_status = "deal_finished"
                CustomerNotifications.objects.create(customer_id=inquireObj.customerId,message= "You payment for "+inquireObj.property.company_name+' has been accepted.',notification_type='property_meeting')
            else:
                inquireObj.meeting_status = "payment_rejected"
                to_emails = inquireObj.customerId.email
                subject = "Payment Rejected:"
                message_send = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=f"hello {inquireObj.customerId.firstName} {inquireObj.customerId.lastName}, your payment has been rejected for the {inquireObj.property.company_name}")
                message_send.send(fail_silently=False)
                CustomerNotifications.objects.create(customer_id=inquireObj.customerId,message= "You payment for "+inquireObj.property.company_name+' has been rejected.',notification_type='property_meeting')
            inquireObj.save()
            return Response({'status':status.HTTP_200_OK,'message':'Offline meeting payment approved '},status=status.HTTP_200_OK)
        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 MyMeetingPaymentDetails(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            meeting_id = request.query_params.get('meeting_id')
            if not meeting_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            payment_obj = MeetingPayment.objects.filter(contract=meeting_id).first()
            if not payment_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No payment details found.'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'id':payment_obj.id,
                'mode' : payment_obj.mode,
                'payment_status':payment_obj.payment_status,
                'contract_id':payment_obj.contract,
                'recipet_status':payment_obj.recipet_status,
                'payment_recipet':payment_obj.payment_recipet,
            }
            return Response({'status':status.HTTP_200_OK,'message':'meeting payment detail fetched successfully','data':all_data},status=status.HTTP_200_OK)
        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 GetMeetingRecipetData(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            contract_id = request.query_params.get('meeting_id')
            if not contract_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'meeting_id is required'},status=status.HTTP_400_BAD_REQUEST)
            payment_obj = MeetingPayment.objects.filter(contract=contract_id).first()
            if not payment_obj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No payment details found.'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'id':payment_obj.id,
                'payment_recipet':payment_obj.payment_recipet,
            }
            return Response({'status':status.HTTP_200_OK,'message':'Meeting recipet fetched successfully','data':all_data},status=status.HTTP_200_OK)

        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 GetNewsletter(APIView):
    def post(self,request):
        try:
            email = request.data.get('email')
            if not email: 
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            email_check =  Newsletter.objects.filter(email=email).first()
            if email_check:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'This email already enabled the newsletter'},status=status.HTTP_400_BAD_REQUEST)
            Newsletter.objects.create(email = email)
            return Response({'status':status.HTTP_200_OK,'message':'news letter fetched successfully'},status=status.HTTP_200_OK)
        
        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 SendAgencyPropertyRequest(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            
            customerObj=Customer.objects.filter(user=uid).first()
            full_name = request.data.get('full_name')
            email_address = request.data.get('email_address')
            phone_number = request.data.get('phone_number')
            amount=request.data.get('amount')
            category = request.data.get('category')
            property_video = request.data.get('property_video')
            property_doc = request.data.get('property_doc')
            property_image = request.data.get('property_image')
            property_name = request.data.get('property_name')
            payment_status = request.data.get('payment_status')



            if not full_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'full_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email_address:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'email_address is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not business_for_sale:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'business_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone_number:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not category:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_image:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_image is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_video:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_doc:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_doc is required'},status=status.HTTP_400_BAD_REQUEST)
            if not amount:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'amount is required'},status=status.HTTP_400_BAD_REQUEST)
            
            customer_lat = customerObj.latitude
            customer_long = customerObj.longitude
            lookups = Q()
            lat = float(customer_lat)
            long = float(customer_long)
            kmrange = 10
            lookups.add(Q(latitude__gte= (lat - kmrange/111.1),latitude__lte=(lat + kmrange/111.1),longitude__gte=(long - kmrange/111.1),longitude__lte=(long + kmrange/111.1)),Q.AND)
            agency_obj = Customer.objects.filter(lookups,loginUserType = "agency").exclude(id=customerObj.id)
            
            for agency in agency_obj:
                check_plans= AgencySubscriptions.objects.filter(customer=agency).last()
                if check_plans:
                    print(f"Request sent yo agency if  :{agency.id}")
                    check_request=AgencyPropertyRequests.objects.filter(customer=customerObj,mobile_number=phone_number,name=full_name,email=email_address,agency = agency,price=amount,property_name=property_name,property_type=category,property_image=property_image,property_video=property_video,property_doc=property_doc).first()

                    if not check_request:
                        AgencyPropertyRequests.objects.create(customer=customerObj,mobile_number=phone_number,name=full_name,email=email_address,agency = agency,price=amount,property_name=property_name,property_type=category,property_image=property_image,property_video=property_video,property_doc=property_doc) 
            return Response({'status':status.HTTP_200_OK,'message':'Request sent successfully'},status=status.HTTP_200_OK)
        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 MyAgencySendReceivedRequest(APIView):
    def get(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            
            customerObj = Customer.objects.filter(user=uid).first()
            request_type = request.query_params.get('request_type')
            all_Data = []

            if request_type == "sent":
                sendrequestObj = AgencyPropertyRequests.objects.filter(customer=customerObj)
                for req in sendrequestObj:
                    send_all_data = {
                        'id': req.id,
                        'mobile_number': req.mobile_number,
                        'email': req.email,
                        'name': req.name,
                        'property': req.property_type,
                        'status': req.property_status,
                    }
                    all_Data.append(send_all_data)
            else:
                recrequestObj = AgencyApprovedProperty.objects.filter(customer=customerObj.id)
                for req in recrequestObj:
                    average_rating = AgencyRatingAndReview.objects.filter(agency_receive_customer=req.agency.id).aggregate(Avg('rating'))['rating__avg']
                    recived_all_data = {
                        'id': req.property_request.id,
                        'agency_id': req.agency.id,
                        'agency_name': req.agency.firstName + " " + req.agency.lastName,
                        'agency_phone_number': req.agency.phoneNumber,
                        'agency_email': req.agency.email,
                        'property': req.property_request.property_type,
                        'status': req.property_request.property_status,
                        'average_rating':int(average_rating),

                    }
                    all_Data.append(recived_all_data)

            return Response({'status':status.HTTP_200_OK,'message': 'success', 'data': all_Data},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)

import ast

class MyAgencyAcceptedRequest(APIView):
    def get(self, request):
        try:
            uid = authenticated(request)
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

        customerObj = Customer.objects.filter(user=uid).first()
        property_qs = AgencyPropertyRequests.objects.filter(
            customer=customerObj,
        )

        data_list = []
        for prop in property_qs:
            # safely parse image list or default to []
            if prop.property_image:
                try:
                    images = ast.literal_eval(prop.property_image)
                except (ValueError, SyntaxError):
                    images = []
            else:
                images = []

            data_list.append({
                'id': prop.id,
                'mobile_number': prop.mobile_number,
                'name': prop.name,
                'email': prop.email,
                'property_type': prop.property_type,
                'customer_id': prop.customer.id,
                'property_name': prop.property_name,
                'property_image': images,
                'property_video': prop.property_video,
                'property_doc': prop.property_doc,
                'status': prop.property_status,
                'agency_id': prop.agency_id,
                'agency_name': prop.agency.firstName,
                'agency_email': prop.agency.email,
                'agency_phoneNumber': prop.agency.phoneNumber,
                'agency_address': prop.agency.address,
                # 'created_at':prop.created_at,
                # return the actual finalized_status field, not status again
                'finalized_status': prop.finalized_status,
                'start_date':get_time_ago(prop.start_date),
            })

        return Response({
            'status_code': status.HTTP_200_OK,
            'status_message': 'Success',
            'data': data_list
        })

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


from django.forms.models import model_to_dict

class MyLawyerAcceptedRequest(APIView):
    def get(self, request):
        try:
            uid = authenticated(request)
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

        customerObj = Customer.objects.filter(user=uid).first()
        property_qs = LawyerContractDeals.objects.filter(customer=customerObj)

        data_list = []
        for prop in property_qs:
            data_list.append({
                'id': prop.id,
                'customer': model_to_dict(prop.customer) if prop.customer else None,
                'lawyer': model_to_dict(prop.lawyer) if prop.lawyer else None,
                'req_status': prop.req_status
            })

        return Response({
            'status_code': status.HTTP_200_OK,
            'status_message': 'Success',
            'data': data_list
        })

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

class AcceptAgencyRequest(APIView):
    def post(self, request): 
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj = Customer.objects.filter(user=uid).first()
            request_id = request.data.get("request_id")
            if not request_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'request_id is required'},status=status.HTTP_400_BAD_REQUEST)
            agency_id = request.data.get("agency_id")
            if not agency_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'agency_id is required'},status=status.HTTP_400_BAD_REQUEST)
            agency_obj = Customer.objects.filter(id=agency_id).first()
            prop_obj = AgencyPropertyRequests.objects.filter(id=request_id).first()
            AgencyPropertyRequests.objects.filter(id=request_id).update(property_status = "Accepted",agency = agency_obj)
            AgencyNotifications.objects.create(agency = agency_obj,message="You request has been accepted from "+prop_obj.name,notification_type="customer_agency_accept")
            return Response({'status':status.HTTP_200_OK,'message':'request accepted successfully'},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 SendLawyerContractDeal(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            print(customerObj)
            inquire_id = request.data.get('inquire_id')
            if not inquire_id:
                return Response({'status': status.HTTP_400_BAD_REQUEST,'message':'inquire_id is required'},status = status.HTTP_400_BAD_REQUEST)
                        
            inquireObj = inquirePropertyProject.objects.filter(id=inquire_id).first()
            print(inquireObj)
            if not inquireObj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'No inquire found'},status = status.HTTP_400_BAD_REQUEST)
            if inquireObj.contract_status == 'Completed':
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Contract is already created'},status=status.HTTP_403_FORBIDDEN)
            
            customer_lat = customerObj.latitude
            customer_long = customerObj.longitude
            lookups = Q()
            lat = float(customer_lat)
            long = float(customer_long)
            kmrange = 10
            # lookups.add(Q(latitude__gte= (lat - kmrange/111.1),latitude__lte=(lat + kmrange/111.1),longitude__gte=(long - kmrange/111.1),longitude__lte=(long + kmrange/111.1)),Q.AND)
            lawyer_obj = Customer.objects.filter(loginUserType = "lawyer")
            print(lawyer_obj)
            for lawyer in lawyer_obj:
                check_sub = LawyerSubscriptions.objects.filter(customer=lawyer).first()  
                if check_sub:
                    check_deal=LawyerContractDeals.objects.filter(inquiry = inquireObj,customer = customerObj,lawyer=lawyer).first()
                    if not check_deal:
                        LawyerContractDeals.objects.create(inquiry = inquireObj,customer = customerObj,lawyer=lawyer)
                        lawyer_obj = Customer.objects.filter(loginUserType="lawyer")
                        message_body = "\nA new contract request for propety project is generated by:\n" + customerObj.firstName + " " + customerObj.lastName
                        
                        for lawyer in lawyer_obj:
                            to_emails = lawyer.email
                            subject = "Contract Request:"
                            message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails], body=message_body)
                            message.send(fail_silently=False)
            return Response({'status':status.HTTP_200_OK,'message':'contract deal sent successfully'},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 myLawyerContractDeal(APIView):
    def get(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            contractObj = LawyerContractDeals.objects.filter(customer = customerObj)
            print(contractObj)
            all_Data = []
            if contractObj:
                for contract in contractObj:
                    all_data = {
                            'id': contract.id,  # LawyerContractDeals ID
                            
                            'inquire_id': contract.inquiry.id if contract.inquiry else None,  
                            # FK to inquirePropertyProject
                            # Full name of customer who made the inquiry (inquirePropertyProject.customerId)

                            'property_project_customer_email': (
                                contract.inquiry.customerId.email
                                if contract.inquiry and contract.inquiry.customerId else None
                            ),
                            # Email of the inquiry customer

                            'property_project_customer_phone_number': (
                                contract.inquiry.customerId.phoneNumber
                                if contract.inquiry and contract.inquiry.customerId else None
                            ),
                            # Phone number of the inquiry customer

                            'customer_id': contract.customer.id if contract.customer else None,
                            'customer_email': contract.customer.email if contract.customer else None,
                            # Email entered manually in the inquiry

                            'customer_phone_number': contract.customer.phoneNumber if contract.customer else None,
                            # Phone number entered manually in the inquiry

                            'customer_name': contract.customer.firstName if contract.customer else None,
                            'lawyer_id': contract.lawyer.id if contract.lawyer else None,
                            'lawyer_email': contract.lawyer.email if contract.lawyer else None,
                            'lawyer_image': contract.lawyer.image_video if contract.lawyer else None,
                            # Email entered manually in the inquiry

                            'lawyer_phone_number': contract.lawyer.phoneNumber if contract.lawyer else None,
                            # Phone number entered manually in the inquiry

                            'lawyer_name': contract.lawyer.firstName if contract.lawyer else None,
                            # Name entered manually in the inquiry
                            # Name entered manually in the inquiry

                            'company_name': contract.inquiry.company_name if contract.inquiry else None,
                            # Company name entered manually in the inquiry
                        }


                    all_Data.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Lawyer deal fetched successfully','data':all_Data}) 
        except Exception as e:
            return Response({'status':status.HTTP_500_INTERNAL_SERVER_ERROR,'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class getCurrencyListing(APIView):
    def get(self,request):
        try:
            currency_obj =  CurrencyHandler.objects.filter(end_date__isnull = True)
            all_Data = []
            for currency in currency_obj:
                all_data = {
                    'id':currency.id,
                    'symbol':currency.symbol,
                    'name':currency.name,
                    'converted_price':currency.converted_price,
                }
                all_Data.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'currency listing fetched successfully','data':all_Data},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 getCurrencyDetails(APIView):
    def get(self,request):
        try:
            currency_id =  request.GET.get('currency_id')
            if not currency_id:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Currency id is required'},status = status.HTTP_400_BAD_REQUEST)

            currency_obj =  CurrencyHandler.objects.filter(id=currency_id,end_date__isnull = True).first()
            all_data = {
                'id':currency_obj.id,
                'symbol':currency_obj.symbol,
                'name':currency_obj.name,
                'converted_price':currency_obj.converted_price,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'currency details fetched successfully','data':all_data},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 homePageDataListing(APIView):
#         def get(self,request):
#         # try:
#             token = get_authorization_header(request)
#             if token:
#                 decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
#                 user_id = decoded['user_id']
#                 customerObj=Customer.objects.filter(user=user_id).first()
#             else:
#                 customerObj= 0
#             saleProperty = SaleProperty.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
#             rentProperty = RentProperty.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
#             bussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
#             houseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
#             investmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
#             investmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
#             propertyProject = PropertyProject.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
   
#             popular_sale_property = SalePropertyFavourite.objects.filter(is_favourite = True).order_by('-id')
#             popular_rent_property = RentPropertyFavourite.objects.filter(is_favourite = True).order_by('-id')
#             popular_invest_company = InvestmentMyCompanyFavourite.objects.filter(is_favourite = True).order_by('-id')
#             popular_invest_project = InvestmentMyProjectFavourite.objects.filter(is_favourite = True).order_by('-id')
#             popular_bussiness_sale = BussinessForSaleFavourite.objects.filter(is_favourite = True).order_by('-id')
#             popular_property_project = PropertyProjectFavourite.objects.filter(is_favourite = True).order_by('-id')
#             companySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True).order_by('-id')
#             propertyDeveloper =  PropertyDevelopers.objects.filter(end_date__isnull = True).order_by('-id')
   
#             selected_type = request.GET.get('type')
#             filter_data =  request.GET.get('filter_data')
#             search_data =  request.GET.get('search_data')
#             min_price = request.GET.get('min_price')
#             max_price = request.GET.get('max_price')
#             subscription_tyre = request.GET.get('subscription_tyre')
#             latitude = request.GET.get('latitude')
#             longitude = request.GET.get('longitude')



#             allData= []
#             if propertyDeveloper:
#                 for pd in propertyDeveloper:
#                     if pd.status == 0:
#                         status_info = "Pending"
#                     elif pd.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                         allData.append({
#                             'id': pd.id,
#                             'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
#                             'customer_id' : pd.customerId.id,
#                             'customer_phone_number' : pd.customerId.phoneNumber,
#                             'customer_images' : pd.customerId.profileImage,
#                             'image_data': ast.literal_eval(pd.property_image),
#                             'videos': pd.videos,
#                             'videos_thumbnail': pd.videos_thumbnail,
#                             'document': pd.document,
#                             'property_name':pd.property_name,
#                                'property_type': pd.property_type,
#                             'assest_equality': pd.assest_equality,
#                             'investment_highlight': pd.investment_highlight,
#                             'equity_price': pd.equity_price,
#                             'lp_equity_percent': pd.lp_equity_percent,
#                             'gp_equity_percent': pd.gp_equity_percent,
#                             'debt_percent': pd.debt_percent,
#                             'short_title': pd.short_title,
#                             'description': pd.description,
#                             'bussiness_plan': pd.bussiness_plan,
#                             'minimum_investment': pd.minimum_investment,
#                             'investment_strategy': pd.investment_strategy,
#                             'expected_period': pd.expected_period,
#                             'financed': pd.financed,
#                             'target_return_on_cost': pd.target_return_on_cost,
#                             'target_irr': pd.target_irr,
#                             'offered_by': pd.offered_by,
#                             'estimated_first_distribution': pd.estimated_first_distribution,
#                             'type_of_investment': pd.type_of_investment,
#                             'phone_number': pd.phone_number,
#                             'measure_of_multiplier': pd.measure_of_multiplier,
#                             'address': pd.address,
#                             'minimum_goal': pd.minimum_goal,

#                             'nominal_share_price': pd.nominal_share_price,
#                             'the_valuation': pd.the_valuation,
#                             'minimum_drawing': pd.minimum_drawing,
#                             'filter_price':pd.nominal_share_price,
#                             'no_of_drawings': pd.no_of_drawings,
#                             'share_for_sale': pd.share_for_sale,
#                             'remaining_share': pd.remaining_share,
#                             'maximum_drawing': pd.maximum_drawing,
#                             'short_description': pd.short_description,
#                             'why_invest': pd.why_invest,
#                             'problem_to_be_solved': pd.problem_to_be_solved,
#                             'our_solution': pd.our_solution,
#                             'start_date_data': pd.start_date_data,
#                             'end_date_data': pd.end_date_data,
#                             'number_of_share': pd.number_of_share,
#                             'issue_minimum_investment': pd.issue_minimum_investment,
#                             'issue_maximum_investment': pd.issue_maximum_investment,
#                             'value_before_issue': pd.value_before_issue,
#                             'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
#                             'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
#                             'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
#                             'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
#                             'self_report': pd.self_report,
#                             'discussion_description': pd.discussion_description,
#                             'new_exisiting_details': pd.new_exisiting_details,
#                             'drawing_on_behalf': pd.drawing_on_behalf,
#                             'foundation': pd.foundation,
#                             'satutes': pd.satutes,
#                             'annual_account': pd.annual_account,
#                             'valuation': pd.valuation,
#                             'agreement_on_co': pd.agreement_on_co,
#                             'conversion_of_debt': pd.conversion_of_debt,
#                             'balance_sheet': pd.balance_sheet,
#                             'result_report': pd.result_report,
#                             'location': pd.location,
#                             'country': pd.country,
#                             'state': pd.state,
#                             'city': pd.city,
#                             'zip_code': pd.postal_code,
#                             'landmark': pd.landmark,
#                             'latitude': pd.latitude,
#                             'longitude': pd.longitude,
#                             'status': pd.status,
#                             'agency': pd.agency.id if pd.agency else None,
#                             'subscription_type': pd.subscription_type,
#                             'start_date': pd.start_date,
#                             'end_date': pd.end_date,
#                             'status':status_info,
#                             'is_ad_featured':pd.is_featured,
#                             'type':"property_developers",
#                     })
#             if companySeeking:
#                 for cs in companySeeking:
#                     favourite_obj = CompanySeekingEquityFavourite.objects.filter(company_seek=cs.id,customerId=customerObj).first()
#                     if favourite_obj:
#                         favourite = True
#                     else:
#                         favourite = False
#                     if cs.status == 0:
#                         status_info = "Pending"
#                     elif cs.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                     allData.append({
#                         'id': cs.id,
#                         'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
#                         'company_name': cs.company_name,
#                         'short_title': cs.short_title,
#                         'description': cs.description,
#                         'about_the_owner': cs.about_the_owner,
#                         'image_data': ast.literal_eval(cs.property_image) if cs.property_image else None,
#                         'videos': cs.property_video,
#                         'videos_thumbnail': cs.videos_thumbnail,
#                         'company_logo': cs.company_logo,
#                         'maximum_drawing': cs.maximum_drawing,
#                         'minimum_drawing': cs.minimum_drawing,
#                         'share_for_sale': cs.share_for_sale,
#                         'price_per_share': cs.price_per_share,
#                         'filter_price': cs.price_per_share,
#                         'number_of_share': cs.number_of_share,
#                         'self_report': cs.self_report,
#                         'nominal_share_price': cs.nominal_share_price,
#                         'e_post': cs.e_post,
#                         'issue_account_number': cs.issue_account_number,
#                         'establish_year': cs.establish_year,
#                         'premises_from': cs.premises_from,
#                         'background_for_sale': cs.background_for_sale,
#                         'company_website': cs.company_website,
#                         'number_of_employee': cs.number_of_employee,
#                         'company_email': cs.company_email,
#                         'company_telephone': cs.company_telephone,
#                         'youtube': cs.youtube,
#                         'upload_team_data': cs.upload_team_data,
#                         'upload_team_name': cs.upload_team_name,
#                         'upload_team_size': cs.upload_team_size,
      
#                         'upload_board_data': cs.upload_board_data,
#                         'upload_board_name': cs.upload_board_name,
#                         'upload_board_size': cs.upload_board_size,
      
#                         'upload_partner_data': cs.upload_partner_data,
#                         'upload_partner_name': cs.upload_partner_name,
#                         'upload_partner_size': cs.upload_partner_size,
      
#                         'location': cs.location,
#                         'country': cs.country,
#                         'state': cs.state,
#                         'city': cs.city,
#                         'zip_code': cs.zip_code,
#                         'landmark': cs.landmark,
#                         'share_holder_image': cs.share_holder_image,
#                         'enter_shares': cs.enter_shares,
#                         'status': cs.status,
#                         'agency': cs.agency.id if cs.agency else None,
#                         'subscription_type': cs.subscription_type,
#                         'latitude': cs.latitude,
#                         'longitude': cs.longitude,
#                         'start_date': cs.start_date,
#                         'end_date': cs.end_date,
#                         # 'is_favourite': cs.is_favourite,
#                         # 'favourite_date': cs.favourite_date,
#                         'is_favourite':favourite,
#                         'status':status_info,
#                           'is_ad_featured':cs.is_featured,
#                         'type':"companySeeking"
#                     })
#             if saleProperty:
#                 for salelist in saleProperty:
#                     favourite_obj = SalePropertyFavourite.objects.filter(sale=salelist.id,customerId=customerObj).first()
#                     if favourite_obj:
#                         favourite = True
#                     else:
#                         favourite = False
        
#                     if salelist.status == 0:
#                         status_info = "Pending"
#                     elif salelist.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                     alldata = {
#                         'id':salelist.id,
#                         'title':salelist.title,
#                         'image_data':salelist.image_data,
#                         'price':salelist.price,
#                         'descriptioon':salelist.descriptioon,
#                         'latitude':salelist.latitude,
#                         'longitude':salelist.longitude,
#                         'location':salelist.location,
#                         'property_demension':salelist.property_demension,
#                         'filter_price':salelist.price,
#                         'bedrooms':salelist.bedrooms,
#                         'bathrooms':salelist.bathrooms,
#                         'created_date':salelist.created_at,
#                         'location':salelist.location,
#                         'is_favourite':favourite,
#                         'subscription_type':salelist.subscription_type,
#                         'created_date':salelist.created_at,
#                         'is_ad_featured':salelist.is_featured,
#                         'type':"SaleProperty",
#                         'status':status_info,
#                     }
#                     allData.append(alldata)
#             if rentProperty:
#                 for rentlist in rentProperty:
#                     favourite_obj = RentPropertyFavourite.objects.filter(rent=rentlist.id,customerId=customerObj).first()
#                     if favourite_obj:
#                         favourite = True
#                     else:
#                         favourite = False
#                     alldata = {
#                         'id':rentlist.id,
#                         'title':rentlist.title,
#                         'image_data':rentlist.image_data,
#                         'video':rentlist.video,
#                         'rooms':rentlist.rooms,
#                         'bedrooms':rentlist.bedrooms,
#                         'size':rentlist.size,
#                         'country': rentlist.country,
#                         'state': rentlist.state,
#                         'city': rentlist.city,
#                         'postal_code':rentlist.postal_code,
#                         'landmark': rentlist.landmark,
#                         'house_number': rentlist.house_number,
#                         'filter_price':rentlist.monthly_rent,
#                         'rental_period':rentlist.rental_period,
#                         'heading':rentlist.heading,
#                         'name_of_ad':rentlist.name_of_ad,
#                         'visibilty':rentlist.visibilty,
#                         'location':rentlist.location,
#                         'latitude':rentlist.latitude,
#                         'longitude':rentlist.longitude,
#                           'is_ad_featured':rentlist.is_featured,
#                         'is_favourite':favourite,
#                         'type':"RentProperty",
#                     }
#                     allData.append(alldata)
#             if bussinessSale:
#                 for bs in bussinessSale:
#                     favourite_obj = BussinessForSaleFavourite.objects.filter(bussiness=bs.id,customerId=customerObj).first()
#                     if favourite_obj:
#                         favourite = True
#                     else:
#                         favourite = False
#                     allData.append({
#                          'id': bs.id,
#                         'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
#                         'company_name': bs.company_name,
#                         'short_title': bs.short_title,
#                         'image_data':ast.literal_eval(bs.image_data),
#                         'videos': bs.videos,
#                         'videos_thumbnail': bs.videos_thumbnail,
#                         'company_name': bs.company_name,
#                         'description': bs.description,
#                         'total_turnover': bs.total_turnover,
#                         'rent': bs.rent,
#                         'established_year': bs.established_year,
#                         'premises': bs.premises,
#                         'years_of_work': bs.years_of_work,
#                         'operation_concept': bs.operation_concept,
#                         'operation_opening_hours': bs.operation_opening_hours,
#                         'turnover_last_year': bs.turnover_last_year,
#                         'salary_percentage': bs.salary_percentage,
#                         'other_operating_cost': bs.other_operating_cost,
#                           'filter_price':bs.cost,
#                         'cost': bs.cost,
#                         'reason_for_sale':bs.reason_for_sale,
#                         'website_link':bs.website_link,
#                         'number_of_employes':bs.number_of_employes,
#                         'other_operating_cost':bs.other_operating_cost,
#                         'area':bs.area,
#                         'term_of_lease': bs.term_of_lease,
#                         'document':ast.literal_eval(bs.document),
#                         'details': bs.details,
#                         'service':bs.service,
#                         'operations':bs.operations,
#                         'market_initatives':bs.market_initatives,
#                         'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
#                         'valuation':bs.valuation,
#                         'owner_name':bs.owner_name,
#                         'phone':bs.phone,
#                         'telephone':bs.telephone,
#                         'email':bs.email,
#                         'company':bs.company,
#                         'public_order':bs.public_order,
#                         'avaiable_attachment':bs.avaiable_attachment,
#                         'location':bs.location,
#                         'latitude':bs.latitude,
#                         'longitude':bs.longitude,    
#                         'subscription_type':bs.subscription_type,
#                         'created_date':bs.start_date,
#                         'is_favourite':favourite,
#                          'is_ad_featured':bs.is_featured,
#                         'type':"BusinessSale"})
#             if houseWantedRent:
#                 for hWr in houseWantedRent:
#                     favourite_obj = HouseRentFavourite.objects.filter(house_rent=hWr.id,customerId=customerObj).first()
#                     if favourite_obj:
#                         favourite = True
#                     else:
#                         favourite = False
      
#                     if hWr.status == 0:
#                         status_info = "Pending"
#                     elif hWr.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                     allData.append({
#                         'id': hWr.id,
#                         'short_title':hWr.short_title,
#                         'customer_id':hWr.customerId.id,
#                         'fullname': hWr.first_name+' '+ hWr.last_name,
#                         'profile_visiblity':hWr.profile_visiblity,
#                         'profile_hidden':hWr.profile_hidden,
#                         'image': ast.literal_eval(hWr.image),
#                         'first_name': hWr.first_name,
#                         'last_name': hWr.last_name,
#                         'gender': hWr.gender,
#                         'dob': hWr.dob,
#                         'nationality': hWr.nationality,
#                         'phone_number':hWr.phone_number,
#                         'email': hWr.email,
#                         'quantity': hWr.quantity,
#                         'rental_period': hWr.rental_period,
#                         'max_rent': hWr.max_rent,
#                         'from_date': hWr.from_date,
#                         'housing_type':hWr.housing_type,
#                         'number_of_people':hWr.number_of_people,
#                           'filter_price':hWr.max_month_price,
#                         'max_month_price': hWr.max_month_price,
#                         'desired_start_date':hWr.desired_start_date,
#                         'desired_area': hWr.desired_area,
#                         'latitude':hWr.latitude,
#                         'longitude':hWr.longitude,
#                         'location':hWr.location,
#                         'about':hWr.about,
#                         'education':hWr.education,
#                         'martial_status':hWr.martial_status,
#                         'cleanliness':hWr.cleanliness,
#                         'party_habits':hWr.party_habits,
#                         'work':hWr.work,
#                         'interest':hWr.interest,
#                         'subscription_type':hWr.subscription_type,
#                         'is_draft':hWr.is_draft,
#                         'is_favourite':favourite,
#                         'created_date':hWr.start_date,
#                         'status':status_info,
#                           'country':hWr.country,
#                         'state':hWr.state,
#                         'city':hWr.city,
#                         'postal_code':hWr.postal_code,
#                         'landmark':hWr.landmark,
#                         'floor':hWr.floor,
#                         'description':hWr.description,
#                           'is_ad_featured':hWr.is_featured,
#                         'type':"HouseRent"})
#             if investmentProject:
#                 for ip in investmentProject:
#                     favourite_obj = InvestmentMyProjectFavourite.objects.filter(invest_project=ip.id,customerId=customerObj).first()
#                     if favourite_obj:
#                         favourite = True
#                     else:
#                         favourite = False
#                     allData.append({'id':ip.id,
#                         'customer_id':ip.customerId.id,
#                         'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
#                         'property_name':ip.property_name,
#                         'image_data':ip.image_data,
#                         'videos':ip.videos,
#                         'documents_data':ip.documents_data,
#                         'property_type':ip.property_type,
#                         'assest_equality':ip.assest_equality,
#                         'investment_highlight':ip.investment_highlight,
#                         'filter_price':ip.equity_price,
#                         'equity_price':ip.equity_price,
#                         'lp_equity_percent':ip.lp_equity_percent,
#                         'gp_equity_percent':ip.gp_equity_percent,
#                         'debt_percent':ip.debt_percent,
#                         'property_at_glance_title':ip.property_at_glance_title,
#                         'description':ip.description,
#                         'bussiness_plan':ip.bussiness_plan,
#                         'minimum_investment':ip.minimum_investment,
#                         'investment_strategy':ip.investment_strategy,
#                         'expected_attitude_price':ip.expected_attitude_price,
#                         'financed':ip.financed,
#                         'target_return_on_cost':ip.target_return_on_cost,
#                         'target_irr':ip.target_irr,
#                         'lp_equity_percent':ip.lp_equity_percent,
#                         'offered_by':ip.offered_by,
#                         'estimated_first_distribution':ip.estimated_first_distribution,
#                         'type_of_investment':ip.type_of_investment,
#                         'phone_number':ip.phone_number,
#                         'measure_for_multiplier':ip.measure_for_multiplier,
#                         'address':ip.address,
#                         'location_details':ip.location_details,
#                         # 'property_summary':ip.property_summary,
#                         # 'property_details':ip.property_details,
#                         # 'overview':ip.overview,
#                         # 'debt_assumption':ip.debt_assumption,
#                         'location':ip.location,
#                         'latitude':ip.latitude,
#                         'longitude':ip.longitude,
#                         'subscription_type':ip.subscription_type,
#                         'status':ip.status,
#                         'is_draft':ip.is_draft,
#                         'type':"InvestmentProject"})
#             if investmentCompany:
#                 for ic in investmentCompany:
#                     favourite_obj = InvestmentMyCompanyFavourite.objects.filter(invest_company=ic.id,customerId=customerObj).first()
#                     if favourite_obj:
#                         favourite = True
#                     else:
#                         favourite = False
#                     allData.append({'id':ic.id,
#                          'title':ic.property_name,
#                         'company_name':ic.property_name,
#                         'image_data':ic.company_logo,
#                         'description':ic.description,
#                         'the_valuation':ic.the_valuation,
#                         'nomial_share_price':ic.nominal_share_price,
#                         'filter_price':ic.nominal_share_price,
#                         'is_favourite':favourite,
#                         'subscription_type':ic.subscription_type,
#                         'created_date':ic.start_date,
#                         'type':"InvestmentCompany"})
#             if propertyProject:
#                 for pp in propertyProject:
#                     favourite_obj = PropertyProjectFavourite.objects.filter(property=pp.id,customerId=customerObj).first()
#                     if favourite_obj:
#                         favourite = True
#                     else:
#                         favourite = False
      
#                     if pp.status == 0:
#                         status_info = "Pending"
#                     elif pp.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                     allData.append({
#                          'id': pp.id,
#                         'customer_id':pp.customerId.id,
#                         'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
#                         'spend_too_much_time':pp.spend_too_much_time,
#                         'most_useless_skill':pp.most_useless_skill,
#                         'fun_act':pp.fun_act,
#                         'biography':pp.biography,
#                         'short_title':pp.short_title,
#                         'property_overview':pp.property_overview,
#                         'property_description':pp.property_description,
#                         'image_data':pp.image_data,
#                         'videos':pp.videos,
#                         'property_document':pp.property_document,
#                         'category':pp.category,
#                         'property_name':pp.property_name,
#                         'property_dimension':pp.property_dimension,
#                         'country':pp.country,
#                         'state':pp.state,
#                         'city':pp.city,
#                         'postal_code':pp.postal_code,
#                         'landmark':pp.landmark,
#                         'house_number':pp.house_number,
#                         'location':pp.location,
#                         'latitude':pp.latitude,
#                         'longitude':pp.longitude,
#                         'facility':pp.facility,
#                         'benefits':pp.benefits,
#                         'return_on_investment':pp.return_on_investment,
#                         'finder_fee':pp.finder_fee,
#                         'gross_income':pp.gross_income,
#                         'price':pp.price,
#                         'cashflow_pcm':pp.cashflow_pcm,
#                         'total_termination_fee':pp.total_termination_fee,
#                         'purchase_price':pp.purchase_price,
#                         'potential_cashflow_pcm':pp.potential_cashflow_pcm,
#                         'investment_finder_fee':pp.investment_finder_fee,
#                         'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
#                         'rental':pp.rental,
#                         'the_vision':pp.the_vision,
#                         'cost_to_consider':pp.cost_to_consider,
#                         'capital_required':pp.capital_required,
#                         'cashflow_forecast':pp.cashflow_forecast,
#                         'investment_finder_fee':pp.investment_finder_fee,
#                         'is_draft':pp.is_draft,
#                           'filter_price':pp.price,
#                            'created_date':pp.start_date,
#                            'is_favourite':favourite,
#                         'subscription_type':pp.subscription_type,
#                         'status':status_info,
#                           'is_ad_featured':pp.is_featured,
#                            'type':"PropertyProject"
                        
#                         })
            
   
   
#             popularData= []
#             if popular_sale_property:
#                 for salelist in popular_sale_property:
#                     alldata = {
#                         'id':salelist.sale.id,
#                         'title':salelist.sale.title,
#                         'image_data':salelist.sale.image_data,
#                         'price':salelist.sale.price,
#                         'descriptioon':salelist.sale.descriptioon,
#                         'latitude':salelist.sale.latitude,
#                         'longitude':salelist.sale.longitude,
#                         'location':salelist.sale.location,
#                         'property_demension':salelist.sale.property_demension,
#                         'filter_price':salelist.sale.price,
#                         'bedrooms':salelist.sale.bedrooms,
#                         'bathrooms':salelist.sale.bathrooms,
#                         'created_date':salelist.sale.created_at,
#                         'location':salelist.sale.location,
#                         'subscription_type':salelist.sale.subscription_type,
#                         'created_date':salelist.sale.created_at,
#                         'type':"SaleProperty",
#                     }
#                     popularData.append(alldata)
#             if popular_rent_property:
#                 for rentlist in popular_rent_property:
#                     alldata = {
#                         'id':rentlist.rent.id,
#                         'title':rentlist.rent.title,
#                         'image_data':rentlist.rent.image_data,
#                         'video':rentlist.rent.video,
#                         'rooms':rentlist.rent.rooms,
#                         'bedrooms':rentlist.rent.bedrooms,
#                         'size':rentlist.rent.size,
#                         'filter_price':rentlist.rent.monthly_rent,
#                         'rental_period':rentlist.rent.rental_period,
#                         'heading':rentlist.rent.heading,
#                         'name_of_ad':rentlist.rent.name_of_ad,
#                         'visibilty':rentlist.rent.visibilty,
#                         'location':rentlist.rent.location,
#                         'latitude':rentlist.rent.latitude,
#                         'longitude':rentlist.rent.longitude,
#                     }
#                     popularData.append(alldata)
#             if popular_bussiness_sale:
#                 for bs in popular_bussiness_sale:
#                     popularData.append({
#                          'id': bs.bussiness.id,
#                         'customer_name' : bs.bussiness.customerId.firstName +' '+ bs.bussiness.customerId.lastName,
#                         'company_name': bs.bussiness.company_name,
#                         'short_title': bs.bussiness.short_title,
#                         'image_data':ast.literal_eval(bs.bussiness.image_data),
#                         'videos': bs.bussiness.videos,
#                         'videos_thumbnail': bs.bussiness.videos_thumbnail,
#                         'company_name': bs.bussiness.company_name,
#                         'description': bs.bussiness.description,
#                         'total_turnover': bs.bussiness.total_turnover,
#                         'rent': bs.bussiness.rent,
#                         'established_year': bs.bussiness.established_year,
#                         'premises': bs.bussiness.premises,
#                         'years_of_work': bs.bussiness.years_of_work,
#                         'operation_concept': bs.bussiness.operation_concept,
#                         'operation_opening_hours': bs.bussiness.operation_opening_hours,
#                         'turnover_last_year': bs.bussiness.turnover_last_year,
#                         'salary_percentage': bs.bussiness.salary_percentage,
#                         'other_operating_cost': bs.bussiness.other_operating_cost,
#                           'filter_price':bs.bussiness.cost,
#                         'cost': bs.bussiness.cost,
#                         'reason_for_sale':bs.bussiness.reason_for_sale,
#                         'website_link':bs.bussiness.website_link,
#                         'number_of_employes':bs.bussiness.number_of_employes,
#                         'other_operating_cost':bs.bussiness.other_operating_cost,
#                         'area':bs.bussiness.area,
#                         'term_of_lease': bs.bussiness.term_of_lease,
#                         'document':ast.literal_eval(bs.bussiness.document),
#                         'details': bs.bussiness.details,
#                         'service':bs.bussiness.service,
#                         'operations':bs.bussiness.operations,
#                         'market_initatives':bs.bussiness.market_initatives,
#                         'advantage_and_oppurtunity':bs.bussiness.advantage_and_oppurtunity,
#                         'valuation':bs.bussiness.valuation,
#                         'owner_name':bs.bussiness.owner_name,
#                         'phone':bs.bussiness.phone,
#                         'telephone':bs.bussiness.telephone,
#                         'email':bs.bussiness.email,
#                         'company':bs.bussiness.company,
#                         'public_order':bs.bussiness.public_order,
#                         'avaiable_attachment':bs.bussiness.avaiable_attachment,
#                         'location':bs.bussiness.location,
#                         'latitude':bs.bussiness.latitude,
#                         'longitude':bs.bussiness.longitude,    
#                         'subscription_type':bs.bussiness.subscription_type,
#                         'created_date':bs.bussiness.start_date,
#                         'type':"BusinessSale"})
#             if popular_invest_project:
#                 for ip in popular_invest_project:
#                     popularData.append({'id':ip.invest_project.id,
#                         'customer_id':ip.invest_project.customerId.id,
#                         'fullname': ip.invest_project.customerId.firstName+' '+ ip.invest_project.customerId.lastName,
#                         'property_name':ip.invest_project.property_name,
#                         'image_data':ip.invest_project.image_data,
#                         'videos':ip.invest_project.videos,
#                         'documents_data':ip.invest_project.documents_data,
#                         'property_type':ip.invest_project.property_type,
#                         'assest_equality':ip.invest_project.assest_equality,
#                         'investment_highlight':ip.invest_project.investment_highlight,
#                         'filter_price':ip.invest_project.equity_price,
#                         'equity_price':ip.invest_project.equity_price,
#                         'lp_equity_percent':ip.invest_project.lp_equity_percent,
#                         'gp_equity_percent':ip.invest_project.gp_equity_percent,
#                         'debt_percent':ip.invest_project.debt_percent,
#                         'property_at_glance_title':ip.invest_project.property_at_glance_title,
#                         'description':ip.invest_project.description,
#                         'bussiness_plan':ip.invest_project.bussiness_plan,
#                         'minimum_investment':ip.invest_project.minimum_investment,
#                         'investment_strategy':ip.invest_project.investment_strategy,
#                         'expected_attitude_price':ip.invest_project.expected_attitude_price,
#                         'financed':ip.invest_project.financed,
#                         'target_return_on_cost':ip.invest_project.target_return_on_cost,
#                         'target_irr':ip.invest_project.target_irr,
#                         'lp_equity_percent':ip.invest_project.lp_equity_percent,
#                         'offered_by':ip.invest_project.offered_by,
#                         'estimated_first_distribution':ip.invest_project.estimated_first_distribution,
#                         'type_of_investment':ip.invest_project.type_of_investment,
#                         'phone_number':ip.invest_project.phone_number,
#                         'measure_for_multiplier':ip.invest_project.measure_for_multiplier,
#                         'address':ip.invest_project.address,
#                         'location_details':ip.invest_project.location_details,
#                         'location':ip.invest_project.location,
#                         'latitude':ip.invest_project.latitude,
#                         'longitude':ip.invest_project.longitude,
#                         'type':"InvestmentProject"})
#             if popular_invest_company:
#                 for ic in popular_invest_company:
#                     popularData.append({'id':ic.invest_company.id,
#                          'title':ic.invest_company.property_name,
#                         'company_name':ic.invest_company.property_name,
#                         'image_data':ic.invest_company.company_logo,
#                         'description':ic.invest_company.description,
#                         'the_valuation':ic.invest_company.the_valuation,
#                         'nomial_share_price':ic.invest_company.nominal_share_price,
#                         'filter_price':ic.invest_company.nominal_share_price,
#                         'created_date':ic.invest_company.start_date,
#                         'type':"InvestmentCompany"})
#             if popular_property_project:
#                 for pp in popular_property_project:
#                     popularData.append({
#                          'id': pp.property.id,
#                         'customer_id':pp.property.customerId.id,
#                         'fullname': pp.property.customerId.firstName+' '+ pp.property.customerId.lastName,
#                         'spend_too_much_time':pp.property.spend_too_much_time,
#                         'most_useless_skill':pp.property.most_useless_skill,
#                         'fun_act':pp.property.fun_act,
#                         'biography':pp.property.biography,
#                         'short_title':pp.property.short_title,
#                         'property_overview':pp.property.property_overview,
#                         'property_description':pp.property.property_description,
#                         'image_data':pp.property.image_data,
#                         'videos':pp.property.videos,
#                         'property_document':pp.property.property_document,
#                         'category':pp.property.category,
#                         'property_name':pp.property.property_name,
#                         'property_dimension':pp.property.property_dimension,
#                         'country':pp.property.country,
#                         'state':pp.property.state,
#                         'city':pp.property.city,
#                         'postal_code':pp.property.postal_code,
#                         'landmark':pp.property.landmark,
#                         'house_number':pp.property.house_number,
#                         'location':pp.property.location,
#                         'latitude':pp.property.latitude,
#                         'longitude':pp.property.longitude,
#                         'facility':pp.property.facility,
#                         'benefits':pp.property.benefits,
#                         'return_on_investment':pp.property.return_on_investment,
#                         'finder_fee':pp.property.finder_fee,
#                         'gross_income':pp.property.gross_income,
#                         'price':pp.property.price,
#                         'cashflow_pcm':pp.property.cashflow_pcm,
#                         'total_termination_fee':pp.property.total_termination_fee,
#                         'purchase_price':pp.property.purchase_price,
#                         'potential_cashflow_pcm':pp.property.potential_cashflow_pcm,
#                         'investment_finder_fee':pp.property.investment_finder_fee,
#                         'investment_return_on_investment_fee':pp.property.investment_return_on_investment_fee,
#                         'rental':pp.property.rental,
#                         'the_vision':pp.property.the_vision,
#                         'cost_to_consider':pp.property.cost_to_consider,
#                         'capital_required':pp.property.capital_required,
#                         'cashflow_forecast':pp.property.cashflow_forecast,
#                         'investment_finder_fee':pp.property.investment_finder_fee,
#                         'is_draft':pp.property.is_draft,
#                           'filter_price':pp.property.price,
#                            'created_date':pp.property.start_date,
#                         'subscription_type':pp.property.subscription_type,
#                            'type':"PropertyProject"
        
#                         })
   
    
#             if filter_data == 'true':
#                 if selected_type:
#                     allData = [data for data in allData if data['type'] == selected_type]
#                 if subscription_tyre:
#                     allData = [data for data in allData if data['subscription_type'] == int(subscription_tyre)]
#                 if min_price and max_price:
#                     min_price = int(min_price) 
#                     max_price = int(max_price) 
#                     allData = [data for data in allData if min_price <= int(data['filter_price']) <= max_price]
                
#                 if latitude and longitude:
#                     if allData:
#                         if allData[0]['latitude'] and allData[0]['longitude']:
#                             allData = [data for data in allData if float(latitude) == data['latitude'] and float(longitude) == data['longitude']]  
#                 if search_data:
#                     allData = [data for data in allData if data['title'] == search_data]

#                     filtered_data = []
#                     for data in allData:
#                         filtered_data.append(data)
                    
#                     allData = filtered_data
#                     allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', True), -x.get('subscription_type', 3)))
#             else:
#                 if selected_type:
#                     allData = [data for data in allData if data['type'] == selected_type]
#                 random.shuffle(allData)
#                 allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', True), -x.get('subscription_type', 3)))

#                 # allData = sorted(allData, key=lambda x: x['subscription_type'], reverse=True)
            
#             return Response({'status_code':status.HTTP_200_OK,'message':'home page data listed successfully','data':allData,'popular_data':popularData},status=status.HTTP_200_OK)
#         # 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 homePageDataListing(APIView):
    def get(self, request):
        try:
            token = get_authorization_header(request).decode('utf-8')
            customerObj = None
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
                user_id = decoded.get('user_id')
                customerObj = Customer.objects.filter(user_id=user_id).first()

            # Prefetch favourite IDs in sets
            sale_fav_ids = set(SalePropertyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('sale_id', flat=True))
            rent_fav_ids = set(RentPropertyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('rent_id', flat=True))
            business_fav_ids = set(BussinessForSaleFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('bussiness_id', flat=True))
            house_rent_fav_ids = set(HouseRentFavourite.objects.filter(customerId=customerObj).values_list('house_rent_id', flat=True))
            invest_proj_fav_ids = set(InvestmentMyProjectFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('invest_project_id', flat=True))
            invest_comp_fav_ids = set(InvestmentMyCompanyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('invest_company_id', flat=True))
            company_seek_fav_ids = set(CompanySeekingEquityFavourite.objects.filter(customerId=customerObj).values_list('company_seek_id', flat=True))
            property_proj_fav_ids = set(PropertyProjectFavourite.objects.filter(customerId=customerObj).values_list('property_id', flat=True))

            selected_type = request.GET.get('type')
            filter_data = request.GET.get('filter_data') == 'true'
            search_data = request.GET.get('search_data')
            country = request.GET.get('country')
            countries = request.GET.get('countries')

            min_price = request.GET.get('min_price')
            max_price = request.GET.get('max_price')
            subscription_tyre = request.GET.get('subscription_tyre')
            latitude = request.GET.get('latitude')
            longitude = request.GET.get('longitude')
            # property_date = request.GET.get('created_at')
            # print(property_date,'-------------')
            # filter_date = parse_date(property_date) if property_date else None
            allData = []
            # Sale Properties
            sale_props = SaleProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'title', 'image_data', 'price', 'latitude', 'longitude', 'location','country',
                'property_demension', 'bedrooms', 'bathrooms', 'created_at', 'subscription_type', 'is_featured','customerId__profileImage'
            )
            for sp in sale_props:
                sp.update({
                    'filter_price': sp['price'],
                    'type': "SaleProperty",
                    'filter_date':sp['created_at'],
                    'status': "Approved",
                    'is_favourite': sp['id'] in sale_fav_ids
                })
                allData.append(sp)

            # Rent Properties
            rent_props = RentProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'title', 'image_data', 'video', 'rooms', 'bedrooms', 'size', 'monthly_rent',
                'rental_period', 'heading', 'name_of_ad', 'visibilty', 'location', 'latitude', 'longitude',
                'country', 'state', 'city', 'postal_code', 'landmark', 'house_number', 'subscription_type', 'is_featured','customerId__profileImage'
            )
            for rp in rent_props:
                rp.update({
                    'filter_price': rp['monthly_rent'],
                    'type': "RentProperty",
                    'is_favourite': rp['id'] in rent_fav_ids
                })
                allData.append(rp)

            # Business for Sale
            business_props = BussinessForSale.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'company_name', 'short_title', 'image_data', 'videos', 'videos_thumbnail', 'description',
                'total_turnover', 'rent', 'established_year', 'premises', 'years_of_work', 'operation_concept',
                'operation_opening_hours', 'turnover_last_year', 'salary_percentage', 'other_operating_cost',
                'cost', 'reason_for_sale', 'website_link', 'number_of_employes', 'area', 'term_of_lease',
                'document', 'details', 'service', 'operations', 'market_initatives', 'advantage_and_oppurtunity',
                'valuation', 'owner_name', 'phone', 'telephone', 'email', 'company', 'public_order','country',
                'avaiable_attachment', 'location', 'latitude', 'longitude', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
            )
            for bp in business_props:
                bp.update({
                    'filter_price': bp['cost'],
                    'type': "BusinessSale",
                    'filter_date':bp['start_date'],
                    'is_favourite': bp['id'] in business_fav_ids
                })
                allData.append(bp)

            # House Wanted for Rent
            house_rent_props = HouseWantedForRent.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'short_title', 'image', 'first_name', 'last_name', 'gender', 'dob', 'nationality',
                'phone_number', 'email', 'quantity', 'rental_period', 'max_rent', 'from_date', 'housing_type',
                'number_of_people', 'max_month_price', 'desired_start_date', 'desired_area', 'latitude',
                'longitude', 'location', 'about', 'education', 'martial_status', 'cleanliness',
                'party_habits', 'work', 'interest', 'subscription_type', 'is_draft', 'start_date',
                'country', 'state', 'city', 'postal_code', 'landmark', 'floor', 'description', 'is_featured','customerId__profileImage'
            )
            for hr in house_rent_props:
                hr.update({
                    'filter_price': hr['max_month_price'],
                    'type': "HouseRent",
                    'filter_date':hr['start_date'],
                    'is_favourite': hr['id'] in house_rent_fav_ids
                })
                allData.append(hr)

            # Investment Projects
            invest_projects = InvestmentMyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'property_name', 'image_data', 'videos', 'documents_data', 'property_type',
                'assest_equality', 'investment_highlight', 'equity_price', 'lp_equity_percent', 'gp_equity_percent',
                'debt_percent', 'property_at_glance_title', 'description', 'bussiness_plan', 'minimum_investment',
                'investment_strategy', 'expected_attitude_price', 'financed', 'target_return_on_cost', 'target_irr',
                'offered_by', 'estimated_first_distribution', 'type_of_investment', 'phone_number',
                'measure_for_multiplier', 'address', 'location_details', 'location', 'latitude', 'longitude',
                'subscription_type', 'status', 'is_draft','customerId__profileImage'
            )
            for ip in invest_projects:
                ip.update({
                    'filter_price': ip['equity_price'],
                    'type': "InvestmentProject",
                    'is_favourite': ip['id'] in invest_proj_fav_ids
                })
                allData.append(ip)

            # Investment Companies
            invest_companies = InvestmentMyCompany.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'property_name', 'company_logo', 'description', 'the_valuation', 'nominal_share_price',
                'subscription_type', 'start_date','customerId__profileImage'
            )
            for ic in invest_companies:
                ic.update({
                    'filter_price': ic['nominal_share_price'],
                    'type': "InvestmentCompany",
                    'filter_date':ic['start_date'],
                    'is_favourite': ic['id'] in invest_comp_fav_ids
                })
                allData.append(ic)

            # Property Projects
            property_projects = PropertyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'short_title', 'property_overview', 'property_description', 'image_data', 'videos',
                'property_document', 'category', 'property_name', 'property_dimension', 'country', 'state', 'city',
                'postal_code', 'landmark', 'house_number', 'location', 'latitude', 'longitude', 'facility',
                'benefits', 'return_on_investment', 'finder_fee', 'gross_income', 'price', 'cashflow_pcm',
                'total_termination_fee', 'purchase_price', 'potential_cashflow_pcm', 'investment_finder_fee',
                'investment_return_on_investment_fee', 'rental', 'the_vision', 'cost_to_consider', 'capital_required',
                'cashflow_forecast', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
            )
            for pp in property_projects:
                pp.update({
                    'filter_price': pp['price'],
                    'type': "PropertyProject",
                    'filter_date':pp['start_date'],
                    'is_favourite': pp['id'] in property_proj_fav_ids
                })
                allData.append(pp)

            # Filtering
            try:
                if filter_data:
                    if selected_type:
                        allData = [d for d in allData if d['type'] == selected_type]
                    if country:
                        allData = [d for d in allData if d['country'] == country]
                    if countries:
                        country_list = [c.strip() for c in countries.split(',')]
                        allData = [d for d in allData if d['country'] in country_list]
                    if subscription_tyre:
                        allData = [d for d in allData if d['subscription_type'] == int(subscription_tyre)]
                    if min_price and max_price:
                        allData = [d for d in allData if int(min_price) <= int(d['filter_price']) <= int(max_price)]
                    if latitude and longitude:
                        allData = [d for d in allData if str(d['latitude']) == latitude and str(d['longitude']) == longitude]
                    if search_data:
                        allData = [d for d in allData if search_data.lower() in d.get('title', '').lower()]
                    # if property_date:
                    #     allData = [d for d in allData if str(property_date) <= int(d['filter_date'])]
                    allData = sorted(allData, key=lambda x: (not x.get('is_featured', False), -x.get('subscription_type', 0)))

                else:
                    if selected_type:
                        allData = [d for d in allData if d['type'] == selected_type]
                    random.shuffle(allData)
                    allData = sorted(allData, key=lambda x: (not x.get('is_featured', False), -x.get('subscription_type', 0)))
            except Exception as e:
                return Response({
                    'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR,
                    'message': str(e)
                }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

            page = int(request.GET.get('page', 1))
            page_size = int(request.GET.get('page_size', 10))
            paginator = Paginator(allData, page_size)
            paginated_data = paginator.get_page(page)

            return Response({
                'status_code': status.HTTP_200_OK,
                'message': 'home page data listed successfully',
                'data': list(paginated_data),
                'total_pages': paginator.num_pages,
                'current_page': paginated_data.number,
                'total_items': paginator.count,
                'popular_data': []
            }, status=status.HTTP_200_OK)

        except Exception as e:
            return Response({
                'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR,
                'message': str(e)
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
"""
from django.utils.dateparse import parse_date

# class homePageDataListing(APIView):
#     def get(self, request):
#         try:
#             token = get_authorization_header(request).decode('utf-8')
#             customerObj = None
#             if token:
#                 decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
#                 user_id = decoded.get('user_id')
#                 customerObj = Customer.objects.filter(user_id=user_id).first()

#             # Prefetch favourite IDs in sets
#             sale_fav_ids = set(SalePropertyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('sale_id', flat=True))
#             rent_fav_ids = set(RentPropertyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('rent_id', flat=True))
#             business_fav_ids = set(BussinessForSaleFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('bussiness_id', flat=True))
#             house_rent_fav_ids = set(HouseRentFavourite.objects.filter(customerId=customerObj).values_list('house_rent_id', flat=True))
#             invest_proj_fav_ids = set(InvestmentMyProjectFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('invest_project_id', flat=True))
#             invest_comp_fav_ids = set(InvestmentMyCompanyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('invest_company_id', flat=True))
#             company_seek_fav_ids = set(CompanySeekingEquityFavourite.objects.filter(customerId=customerObj).values_list('company_seek_id', flat=True))
#             property_proj_fav_ids = set(PropertyProjectFavourite.objects.filter(customerId=customerObj).values_list('property_id', flat=True))

#             selected_type = request.GET.get('type')
#             filter_data  = True
#             # filter_data = request.GET.get('filter_data') == 'true'
#             search_data = request.GET.get('search_data')
#             country = request.GET.get('country')
#             countries = request.GET.get('countries')
#             min_price = request.GET.get('min_price')
#             max_price = request.GET.get('max_price')
#             subscription_tyre = request.GET.get('subscription_tyre')
#             latitude = request.GET.get('latitude')
#             longitude = request.GET.get('longitude')
            
#             date_filter = request.GET.get('date_filter')
#             bedroom = request.GET.get('bedrooms')
#             bathroom = request.GET.get('bathrooms')
#             today = datetime.now().date()
#             print(today,'--------------today')
#             """sort by filters"""
#             price_filter = request.GET.get('price_filter', None)
#             if price_filter not in ['asc', 'dsc']:
#                 price_filter = None  # Set to None if invalid

#             published_date = request.GET.get('published_date', None)
#             if published_date not in ['asc', 'dsc']:
#                 published_date = None  # Set to None if invalid
#             date_range = None
#             if date_filter:
#                 if date_filter == 'today':
#                     date_range = (today, today + timedelta(days=1))
#                 elif date_filter == 'this_week':
#                     start_of_week = today - timedelta(days=today.weekday())
#                     date_range = (start_of_week, start_of_week + timedelta(days=7))
#                 elif date_filter == 'this_month':
#                     date_range = (today.replace(day=1), (today.replace(day=1) + timedelta(days=32)).replace(day=1))
#                 elif date_filter == 'last_week':
#                     start_of_last_week = today - timedelta(days=today.weekday() + 7)
#                     date_range = (start_of_last_week, start_of_last_week + timedelta(days=7))
#                 elif date_filter == 'last_month':
#                     first_day_of_current_month = today.replace(day=1)
#                     last_day_of_previous_month = first_day_of_current_month - timedelta(days=1)
#                     first_day_of_previous_month = last_day_of_previous_month.replace(day=1)
#                     date_range = (first_day_of_previous_month, first_day_of_current_month)

#             allData = []
            
#             # Sale Properties with date filtering
#             sale_query = SaleProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
#             if date_range:
#                 sale_query = sale_query.filter(created_at__date__range=date_range)
                
#             sale_props = sale_query.values(
#                 'id', 'title', 'image_data', 'price', 'latitude', 'longitude', 'location','country',
#                 'property_demension', 'bedrooms', 'bathrooms', 'created_at', 'subscription_type', 'is_featured','customerId__profileImage'
#             )
#             for sp in sale_props:
#                 sp.update({
#                     'filter_price': sp['price'],
#                     'type': "SaleProperty",
#                     'filter_date': sp['created_at'],
#                     'filter_bedroom':sp['bedrooms'],
#                     'filter_bathroom':sp['bathrooms'],
#                     'status': "Approved",
#                     'is_favourite': sp['id'] in sale_fav_ids
#                 })
#                 allData.append(sp)

#             # Rent Properties with date filtering
#             rent_query = RentProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
#             if date_range:
#                 rent_query = rent_query.filter(created_at__date__range=date_range)
                
#             rent_props = rent_query.values(
#                 'id', 'title', 'image_data', 'video', 'rooms', 'bedrooms', 'size', 'monthly_rent',
#                 'rental_period', 'heading', 'name_of_ad', 'visibilty', 'location', 'latitude', 'longitude','created_at','bedrooms',
#                 'country', 'state', 'city', 'postal_code', 'landmark', 'house_number', 'subscription_type', 'is_featured','customerId__profileImage'
#             )
#             for rp in rent_props:
#                 rp.update({
#                     'filter_price': rp['monthly_rent'],
#                     'type': "RentProperty",
#                     'filter_bedroom':rp['bedrooms'],
#                     'filter_bathroom': rp.get('bathrooms', 0),
#                     'filter_date': rp['created_at'],
#                     'is_favourite': rp['id'] in rent_fav_ids
#                 })
#                 allData.append(rp)

#             # Business for Sale with date filtering
#             business_query = BussinessForSale.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
#             if date_range:
#                 business_query = business_query.filter(start_date__date__range=date_range)
                
#             business_props = business_query.values(
#                 'id', 'company_name', 'short_title', 'image_data', 'videos', 'videos_thumbnail', 'description',
#                 'total_turnover', 'rent', 'established_year', 'premises', 'years_of_work', 'operation_concept',
#                 'operation_opening_hours', 'turnover_last_year', 'salary_percentage', 'other_operating_cost',
#                 'cost', 'reason_for_sale', 'website_link', 'number_of_employes', 'area', 'term_of_lease',
#                 'document', 'details', 'service', 'operations', 'market_initatives', 'advantage_and_oppurtunity',
#                 'valuation', 'owner_name', 'phone', 'telephone', 'email', 'company', 'public_order','country',
#                 'avaiable_attachment', 'location', 'latitude', 'longitude', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
#             )
#             for bp in business_props:
#                 bp.update({
#                     'filter_price': bp['cost'],
#                     'type': "BusinessSale",
#                     'filter_bedroom': 0,
#                     'filter_bathroom': 0,

#                     'filter_date': bp['start_date'],
#                     'is_favourite': bp['id'] in business_fav_ids
#                 })
#                 allData.append(bp)

#             house_rent_query = HouseWantedForRent.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
#             if date_range:
#                 house_rent_query = house_rent_query.filter(start_date__date__range=date_range)
                
#             house_rent_props = house_rent_query.values(
#                 'id', 'short_title', 'image', 'first_name', 'last_name', 'gender', 'dob', 'nationality',
#                 'phone_number', 'email', 'quantity', 'rental_period', 'max_rent', 'from_date', 'housing_type',
#                 'number_of_people', 'max_month_price', 'desired_start_date', 'desired_area', 'latitude',
#                 'longitude', 'location', 'about', 'education', 'martial_status', 'cleanliness',
#                 'party_habits', 'work', 'interest', 'subscription_type', 'is_draft', 'start_date',
#                 'country', 'state', 'city', 'postal_code', 'landmark', 'floor', 'description', 'is_featured','customerId__profileImage'
#             )
#             for hr in house_rent_props:
#                 hr.update({
#                     'filter_price': hr['max_month_price'],
#                     'type': "HouseRent",
#                     'filter_bedroom': 0,
#                     'filter_bathroom': 0,

#                     'filter_date': hr['start_date'],
#                     'is_favourite': hr['id'] in house_rent_fav_ids
#                 })
#                 allData.append(hr)

#             # Investment Projects with date filtering
#             invest_projects_query = InvestmentMyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
#             if date_range:
#                 invest_projects_query = invest_projects_query.filter(created_at__date__range=date_range)
                
#             invest_projects = invest_projects_query.values(
#                 'id', 'property_name', 'image_data', 'videos', 'documents_data', 'property_type',
#                 'assest_equality', 'investment_highlight', 'equity_price', 'lp_equity_percent', 'gp_equity_percent',
#                 'debt_percent', 'property_at_glance_title', 'description', 'bussiness_plan', 'minimum_investment',
#                 'investment_strategy', 'expected_attitude_price', 'financed', 'target_return_on_cost', 'target_irr',
#                 'offered_by', 'estimated_first_distribution', 'type_of_investment', 'phone_number',
#                 'measure_for_multiplier', 'address', 'location_details', 'location', 'latitude', 'longitude',
#                 'subscription_type', 'status', 'is_draft','customerId__profileImage','start_date'
#             )
#             for ip in invest_projects:
#                 ip.update({
#                     'filter_price': ip['equity_price'],
#                     'type': "InvestmentProject",
#                     'filter_bedroom': 0,
#                     'filter_bathroom': 0,

#                     'filter_date': ip['start_date'],
#                     'is_favourite': ip['id'] in invest_proj_fav_ids
#                 })
#                 allData.append(ip)

#             # Investment Companies with date filtering
#             invest_companies_query = InvestmentMyCompany.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
#             if date_range:
#                 invest_companies_query = invest_companies_query.filter(start_date__date__range=date_range)
                
#             invest_companies = invest_companies_query.values(
#                 'id', 'property_name', 'company_logo', 'description', 'the_valuation', 'nominal_share_price',
#                 'subscription_type', 'start_date','customerId__profileImage'
#             )
#             for ic in invest_companies:
#                 ic.update({
#                     'filter_price': ic['nominal_share_price'],
#                     'type': "InvestmentCompany",
#                     'filter_bedroom': 0,
#                     'filter_bathroom': 0,

#                     'filter_date': ic['start_date'],
#                     'is_favourite': ic['id'] in invest_comp_fav_ids
#                 })
#                 allData.append(ic)

#             property_projects_query = PropertyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
#             if date_range:
#                 property_projects_query = property_projects_query.filter(start_date__date__range=date_range)
                
#             property_projects = property_projects_query.values(
#                 'id', 'short_title', 'property_overview', 'property_description', 'image_data', 'videos',
#                 'property_document', 'category', 'property_name', 'property_dimension', 'country', 'state', 'city',
#                 'postal_code', 'landmark', 'house_number', 'location', 'latitude', 'longitude', 'facility',
#                 'benefits', 'return_on_investment', 'finder_fee', 'gross_income', 'price', 'cashflow_pcm',
#                 'total_termination_fee', 'purchase_price', 'potential_cashflow_pcm', 'investment_finder_fee',
#                 'investment_return_on_investment_fee', 'rental', 'the_vision', 'cost_to_consider', 'capital_required',
#                 'cashflow_forecast', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
#             )
#             for pp in property_projects:
#                 pp.update({
#                     'filter_price': pp['price'],
#                     'type': "PropertyProject",
#                     'filter_date': pp['start_date'],
#                     'is_favourite': pp['id'] in property_proj_fav_ids
#                 })
#                 allData.append(pp)
#             try:
#                 if filter_data:
#                     if selected_type:
#                         allData = [d for d in allData if d['type'] == selected_type]
#                     if country:
#                         allData = [d for d in allData if d['country'] == country]
#                     if countries:
#                         country_list = [c.strip() for c in countries.split(',')]
#                         allData = [d for d in allData if d['country'] in country_list]
#                     if subscription_tyre:
#                         allData = [d for d in allData if d['subscription_type'] == int(subscription_tyre)]
#                     if min_price and max_price:
#                         allData = [d for d in allData if int(min_price) <= int(d['filter_price']) <= int(max_price)]
#                     if latitude and longitude:
#                         allData = [d for d in allData if str(d['latitude']) == latitude and str(d['longitude']) == longitude]
#                     if search_data:
#                         allData = [d for d in allData if search_data.lower() in d.get('title', '').lower()]
                        
#                     if date_filter:
#                         allData = [d for d in allData if d.get('filter_date') and str(d['filter_date'].strftime('%Y-%m-%d')) == str(today)]
#                     # else:
#                         # allData = [d for d in allData if d.get('filter_date') and d['filter_date'].split(' ')[0] == today]
#                     if bedroom:
#     # Handle None values and convert to appropriate comparison
#                         allData = [d for d in allData 
#                                 if d.get('filter_bedroom') is not None 
#                                 and int(d.get('filter_bedroom', 0)) >= int(bedroom)] 

#                     if bathroom:
#                         allData = [d for d in allData 
#                                 if d.get('filter_bathroom') is not None 
#                                 and int(d.get('filter_bathroom', 0)) >= int(bathroom)]
#                     if price_filter == 'asc':
#                         allData = sorted(allData, key=lambda x: x.get('filter_price', 0))
#                     elif price_filter == 'dsc':
#                         allData = sorted(allData, key=lambda x: x.get('filter_price', 0), reverse=True)

#                     if published_date == 'asc':
#                         allData = sorted(allData, key=lambda x: x.get('filter_date', ''), reverse=False)
#                     elif published_date == 'dsc':
#                         allData = sorted(allData, key=lambda x: x.get('filter_date', ''), reverse=True)

#                     allData = sorted(allData, key=lambda x: (not x.get('is_featured', False), -x.get('subscription_type', 0)))
 
#                 else:
#                     if selected_type:
#                         allData = [d for d in allData if d['type'] == selected_type]
#                     random.shuffle(allData)
#                     allData = sorted(allData, key=lambda x: (not x.get('is_featured', False), -x.get('subscription_type', 0)))
#             except Exception as e:
#                 return Response({
#                     'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR,
#                     'message': str(e)
#                 }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

#             page = int(request.GET.get('page', 1))
#             page_size = int(request.GET.get('page_size', 10))
#             paginator = Paginator(allData, page_size)
#             paginated_data = paginator.get_page(page)

#             return Response({
#                 'status_code': status.HTTP_200_OK,
#                 'message': 'home page data listed successfully',
#                 'data': list(paginated_data),
#                 'total_pages': paginator.num_pages,
#                 'current_page': paginated_data.number,
#                 'total_items': paginator.count,
#                 'popular_data': []
#             }, status=status.HTTP_200_OK)

#         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 homePageDataListing(APIView):
    def get(self, request):
        try:
            token = get_authorization_header(request).decode('utf-8')
            customerObj = None
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
                user_id = decoded.get('user_id')
                customerObj = Customer.objects.filter(user_id=user_id).first()

            # Prefetch favourite IDs in sets
            sale_fav_ids = set(SalePropertyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('sale_id', flat=True))
            rent_fav_ids = set(RentPropertyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('rent_id', flat=True))
            business_fav_ids = set(BussinessForSaleFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('bussiness_id', flat=True))
            house_rent_fav_ids = set(HouseRentFavourite.objects.filter(customerId=customerObj).values_list('house_rent_id', flat=True))
            invest_proj_fav_ids = set(InvestmentMyProjectFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('invest_project_id', flat=True))
            invest_comp_fav_ids = set(InvestmentMyCompanyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('invest_company_id', flat=True))
            company_seek_fav_ids = set(CompanySeekingEquityFavourite.objects.filter(customerId=customerObj).values_list('company_seek_id', flat=True))
            property_proj_fav_ids = set(PropertyProjectFavourite.objects.filter(customerId=customerObj).values_list('property_id', flat=True))
            property_dev_fav_ids = set(PropertyDevelopersFavourite.objects.filter(customerId=customerObj).values_list('property_developer_id', flat=True))

            selected_type = request.GET.get('type')
            filter_data  = True
            # filter_data = request.GET.get('filter_data') == 'true'
            search_data = request.GET.get('search_data')
            country = request.GET.get('country')
            countries = request.GET.get('countries')
            min_price = request.GET.get('min_price')
            max_price = request.GET.get('max_price')
            subscription_tyre = request.GET.get('subscription_tyre')
            latitude = request.GET.get('latitude')
            longitude = request.GET.get('longitude')
            
            date_filter = request.GET.get('date_filter')
            bedroom = request.GET.get('bedrooms')
            bathroom = request.GET.get('bathrooms')
            today = datetime.now().date()
            print(today,'--------------today')
            """sort by filters"""
            price_filter = request.GET.get('price_filter', None)
            if price_filter not in ['asc', 'dsc']:
                price_filter = None  # Set to None if invalid

            published_date = request.GET.get('published_date', None)
            if published_date not in ['asc', 'dsc']:
                published_date = None  # Set to None if invalid
            date_range = None
            if date_filter:
                if date_filter == 'today':
                    date_range = (today, today + timedelta(days=1))
                elif date_filter == 'this_week':
                    start_of_week = today - timedelta(days=today.weekday())
                    date_range = (start_of_week, start_of_week + timedelta(days=7))
                elif date_filter == 'this_month':
                    date_range = (today.replace(day=1), (today.replace(day=1) + timedelta(days=32)).replace(day=1))
                elif date_filter == 'last_week':
                    start_of_last_week = today - timedelta(days=today.weekday() + 7)
                    date_range = (start_of_last_week, start_of_last_week + timedelta(days=7))
                elif date_filter == 'last_month':
                    first_day_of_current_month = today.replace(day=1)
                    last_day_of_previous_month = first_day_of_current_month - timedelta(days=1)
                    first_day_of_previous_month = last_day_of_previous_month.replace(day=1)
                    date_range = (first_day_of_previous_month, first_day_of_current_month)

            allData = []
            
            # Sale Properties with date filtering
            sale_query = SaleProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                sale_query = sale_query.filter(created_at__date__range=date_range)
                
            sale_props = sale_query.values(
                'id', 'title', 'image_data', 'price', 'latitude', 'longitude', 'location','country',
                'property_demension', 'bedrooms', 'bathrooms', 'created_at', 'subscription_type', 'is_featured','customerId__profileImage'
            )
            for sp in sale_props:
                sp.update({
                    'filter_price': sp['price'],
                    'type': "SaleProperty",
                    'filter_date': sp['created_at'],
                    'filter_bedroom':sp['bedrooms'],
                    'filter_bathroom':sp['bathrooms'],
                    'status': "Approved",
                    'is_favourite': sp['id'] in sale_fav_ids
                })
                allData.append(sp)

            # Rent Properties with date filtering
            rent_query = RentProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                rent_query = rent_query.filter(created_at__date__range=date_range)
                
            rent_props = rent_query.values(
                'id', 'title', 'image_data', 'video', 'rooms', 'bedrooms', 'size', 'monthly_rent',
                'rental_period', 'heading', 'name_of_ad', 'visibilty', 'location', 'latitude', 'longitude','created_at','bedrooms',
                'country', 'state', 'city', 'postal_code', 'landmark', 'house_number', 'subscription_type', 'is_featured','customerId__profileImage'
            )
            for rp in rent_props:
                rp.update({
                    'filter_price': rp['monthly_rent'],
                    'type': "RentProperty",
                    'filter_bedroom':rp['bedrooms'],
                    'filter_bathroom': rp.get('bathrooms', 0),
                    'filter_date': rp['created_at'],
                    'is_favourite': rp['id'] in rent_fav_ids
                })
                allData.append(rp)

            # Business for Sale with date filtering
            business_query = BussinessForSale.objects.filter(end_date__isnull=True, status=1,payment_done=False).exclude(customerId=customerObj)
            if date_range:
                business_query = business_query.filter(start_date__date__range=date_range)
                
            business_props = business_query.values(
                'id', 'company_name', 'short_title', 'image_data', 'videos', 'videos_thumbnail', 'description',
                'total_turnover', 'rent', 'established_year', 'premises', 'years_of_work', 'operation_concept',
                'operation_opening_hours', 'turnover_last_year', 'salary_percentage', 'other_operating_cost',
                'cost', 'reason_for_sale', 'website_link', 'number_of_employes', 'area', 'term_of_lease',
                'document', 'details', 'service', 'operations', 'market_initatives', 'advantage_and_oppurtunity',
                'valuation', 'owner_name', 'phone', 'telephone', 'email', 'company', 'public_order','country',
                'avaiable_attachment', 'location', 'latitude', 'longitude', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
            )
            for bp in business_props:
                bp.update({
                    'filter_price': bp['cost'],
                    'type': "BusinessSale",
                    'filter_bedroom': 0,
                    'filter_bathroom': 0,

                    'filter_date': bp['start_date'],
                    'is_favourite': bp['id'] in business_fav_ids
                })
                allData.append(bp)

            # House Wanted for Rent with date filtering
            house_rent_query = HouseWantedForRent.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                house_rent_query = house_rent_query.filter(start_date__date__range=date_range)
                
            house_rent_props = house_rent_query.values(
                'id', 'short_title', 'image', 'first_name', 'last_name', 'gender', 'dob', 'nationality',
                'phone_number', 'email', 'quantity', 'rental_period', 'max_rent', 'from_date', 'housing_type',
                'number_of_people', 'max_month_price', 'desired_start_date', 'desired_area', 'latitude',
                'longitude', 'location', 'about', 'education', 'martial_status', 'cleanliness',
                'party_habits', 'work', 'interest', 'subscription_type', 'is_draft', 'start_date',
                'country', 'state', 'city', 'postal_code', 'landmark', 'floor', 'description', 'is_featured','customerId__profileImage'
            )
            for hr in house_rent_props:
                hr.update({
                    'filter_price': hr['max_month_price'],
                    'type': "HouseRent",
                    'filter_bedroom': 0,
                    'filter_bathroom': 0,

                    'filter_date': hr['start_date'],
                    'is_favourite': hr['id'] in house_rent_fav_ids
                })
                allData.append(hr)

            # Company Seeking Equity with date filtering
            company_seek_query = CompanySeekingEquity.objects.filter(end_date__isnull=True,status=1,payment_done=False).exclude(customerId=customerObj)
            if date_range:
                company_seek_query = company_seek_query.filter(start_date__date__range=date_range)

            company_seekings = company_seek_query.values(
                'id', 'short_title', 'company_name', 'company_logo', 'property_image', 'property_video',
                'nominal_share_price', 'price_per_share', 'country', 'state', 'city', 'location', 'latitude',
                'longitude', 'subscription_type', 'is_featured', 'start_date','customerId__profileImage'
            )
            for cs in company_seekings:
                # Prefer nominal_share_price; fallback to price_per_share
                price_value = cs.get('nominal_share_price') or cs.get('price_per_share') or 0
                try:
                    price_value = float(price_value)
                except Exception:
                    price_value = 0
                cs.update({
                    'filter_price': price_value,
                    'type': "CompanySeekingEquity",
                    'filter_bedroom': 0,
                    'filter_bathroom': 0,
                    'filter_date': cs.get('start_date'),
                    'is_favourite': cs['id'] in company_seek_fav_ids
                })
                allData.append(cs)

            # Investment Projects with date filtering
            invest_projects_query = InvestmentMyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                invest_projects_query = invest_projects_query.filter(created_at__date__range=date_range)
                
            invest_projects = invest_projects_query.values(
                'id', 'property_name', 'image_data', 'videos', 'documents_data', 'property_type',
                'assest_equality', 'investment_highlight', 'equity_price', 'lp_equity_percent', 'gp_equity_percent',
                'debt_percent', 'property_at_glance_title', 'description', 'bussiness_plan', 'minimum_investment',
                'investment_strategy', 'expected_attitude_price', 'financed', 'target_return_on_cost', 'target_irr',
                'offered_by', 'estimated_first_distribution', 'type_of_investment', 'phone_number',
                'measure_for_multiplier', 'address', 'location_details', 'location', 'latitude', 'longitude',
                'subscription_type', 'status', 'is_draft','customerId__profileImage','start_date'
            )
            for ip in invest_projects:
                ip.update({
                    'filter_price': ip['equity_price'],
                    'type': "InvestmentProject",
                    'filter_bedroom': 0,
                    'filter_bathroom': 0,

                    'filter_date': ip['start_date'],
                    'is_favourite': ip['id'] in invest_proj_fav_ids
                })
                allData.append(ip)

            # Investment Companies with date filtering
            invest_companies_query = InvestmentMyCompany.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                invest_companies_query = invest_companies_query.filter(start_date__date__range=date_range)
                
            invest_companies = invest_companies_query.values(
                'id', 'property_name', 'company_logo', 'description', 'the_valuation', 'nominal_share_price',
                'subscription_type', 'start_date','customerId__profileImage'
            )
            for ic in invest_companies:
                ic.update({
                    'filter_price': ic['nominal_share_price'],
                    'type': "InvestmentCompany",
                    'filter_bedroom': 0,
                    'filter_bathroom': 0,

                    'filter_date': ic['start_date'],
                    'is_favourite': ic['id'] in invest_comp_fav_ids
                })
                allData.append(ic)

            # Property Developers with date filtering
            property_developers_query = PropertyDevelopers.objects.filter(end_date__isnull=True,status=1,payment_done=False).exclude(customerId=customerObj)
            if date_range:
                property_developers_query = property_developers_query.filter(start_date__date__range=date_range)

            property_developers = property_developers_query.values(
                'id', 'short_title', 'property_name', 'property_image', 'videos', 'videos_thumbnail',
                'nominal_share_price', 'price_of_share', 'equity_price', 'subscription_type', 'start_date',
                'is_featured', 'country', 'location', 'latitude', 'longitude','customerId__profileImage'
            )
            for pd in property_developers:
                price_value = pd.get('nominal_share_price') or pd.get('price_of_share') or pd.get('equity_price') or 0
                try:
                    price_value = float(price_value)
                except Exception:
                    price_value = 0
                pd.update({
                    'filter_price': price_value,
                    'type': "PropertyDevelopers",
                    'filter_bedroom': 0,
                    'filter_bathroom': 0,
                    'filter_date': pd.get('start_date'),
                    'is_favourite': pd['id'] in property_dev_fav_ids
                })
                allData.append(pd)

            property_projects_query = PropertyProject.objects.filter(end_date__isnull=True).exclude(customerId=customerObj)
            if date_range:
                property_projects_query = property_projects_query.filter(start_date__date__range=date_range)
                
            property_projects = property_projects_query.values(
                'id', 'short_title', 'property_overview', 'property_description', 'image_data', 'videos',
                'property_document', 'category', 'property_name', 'property_dimension', 'country', 'state', 'city',
                'postal_code', 'landmark', 'house_number', 'location', 'latitude', 'longitude', 'facility',
                'benefits', 'return_on_investment', 'finder_fee', 'gross_income', 'price', 'cashflow_pcm',
                'total_termination_fee', 'purchase_price', 'potential_cashflow_pcm', 'investment_finder_fee',
                'investment_return_on_investment_fee', 'rental', 'the_vision', 'cost_to_consider', 'capital_required',
                'cashflow_forecast', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
            )
            for pp in property_projects:
                pp.update({
                    'filter_price': pp['price'],
                    'type': "PropertyProject",
                    'filter_date': pp['start_date'],
                    'is_favourite': pp['id'] in property_proj_fav_ids
                })
                allData.append(pp)
            try:
                if filter_data:
                    if selected_type:
                        allData = [d for d in allData if d['type'] == selected_type]
                    if country:
                        allData = [d for d in allData if d['country'] == country]
                    if countries:
                        country_list = [c.strip() for c in countries.split(',')]
                        allData = [d for d in allData if d['country'] in country_list]
                    if subscription_tyre:
                        allData = [d for d in allData if d['subscription_type'] == int(subscription_tyre)]
                    if min_price and max_price:
                        allData = [d for d in allData if int(min_price) <= int(d['filter_price']) <= int(max_price)]
                    if latitude and longitude:
                        allData = [d for d in allData if str(d['latitude']) == latitude and str(d['longitude']) == longitude]
                    if search_data:
                        query_lower = search_data.lower()
                        allData = [d for d in allData if (
                            query_lower in d.get('title', '').lower() or
                            query_lower in d.get('short_title', '').lower() or
                            query_lower in d.get('company_name', '').lower()
                        )]
                        
                    if date_filter:
                        allData = [d for d in allData if d.get('filter_date') and str(d['filter_date'].strftime('%Y-%m-%d')) == str(today)]
                    # else:
                        # allData = [d for d in allData if d.get('filter_date') and d['filter_date'].split(' ')[0] == today]
                    if bedroom:
    # Handle None values and convert to appropriate comparison
                        allData = [d for d in allData 
                                if d.get('filter_bedroom') is not None 
                                and int(d.get('filter_bedroom', 0)) >= int(bedroom)] 

                    if bathroom:
                        allData = [d for d in allData 
                                if d.get('filter_bathroom') is not None 
                                and int(d.get('filter_bathroom', 0)) >= int(bathroom)]
                    if price_filter == 'asc':
                        allData = sorted(allData, key=lambda x: x.get('filter_price', 0))
                    elif price_filter == 'dsc':
                        allData = sorted(allData, key=lambda x: x.get('filter_price', 0), reverse=True)

                    if published_date == 'asc':
                        allData = sorted(allData, key=lambda x: x.get('filter_date', ''), reverse=False)
                    elif published_date == 'dsc':
                        allData = sorted(allData, key=lambda x: x.get('filter_date', ''), reverse=True)

                    allData = sorted(allData, key=lambda x: (not x.get('is_featured', False), -x.get('subscription_type', 0)))
 
                else:
                    if selected_type:
                        allData = [d for d in allData if d['type'] == selected_type]
                    random.shuffle(allData)
                    allData = sorted(allData, key=lambda x: (not x.get('is_featured', False), -x.get('subscription_type', 0)))
            except Exception as e:
                return Response({
                    'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR,
                    'message': str(e)
                }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
            
            how_Data = list(HowItWorks.objects.filter(end_date__isnull=True).values(
                'id', 'step_number', 'icon', 'title', 'description'
            ))
            page = int(request.GET.get('page', 1))
            page_size = int(request.GET.get('page_size', 10))
            paginator = Paginator(allData, page_size)
            paginated_data = paginator.get_page(page)

            return Response({
                'status_code': status.HTTP_200_OK,
                'message': 'home page data listed successfully',
                'data': list(paginated_data),
                'total_pages': paginator.num_pages,
                'current_page': paginated_data.number,
                'total_items': paginator.count,
                'popular_data': [],
                'how_it_works': how_Data
            }, status=status.HTTP_200_OK)

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

import ast

class MapListing(APIView):
    def get(self, request):
        try:
            token = get_authorization_header(request).decode('utf-8')
            customerObj = None
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
                user_id = decoded.get('user_id')
                customerObj = Customer.objects.filter(user_id=user_id).first()

            # Prefetch favourite IDs in sets
            sale_fav_ids = set(SalePropertyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('sale_id', flat=True))
            rent_fav_ids = set(RentPropertyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('rent_id', flat=True))
            business_fav_ids = set(BussinessForSaleFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('bussiness_id', flat=True))
            house_rent_fav_ids = set(HouseRentFavourite.objects.filter(customerId=customerObj).values_list('house_rent_id', flat=True))
            invest_proj_fav_ids = set(InvestmentMyProjectFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('invest_project_id', flat=True))
            invest_comp_fav_ids = set(InvestmentMyCompanyFavourite.objects.filter(customerId=customerObj, is_favourite=True).values_list('invest_company_id', flat=True))
            company_seek_fav_ids = set(CompanySeekingEquityFavourite.objects.filter(customerId=customerObj).values_list('company_seek_id', flat=True))
            property_proj_fav_ids = set(PropertyProjectFavourite.objects.filter(customerId=customerObj).values_list('property_id', flat=True))

            filter_data = request.GET.get('filter_data') == 'true'
            country = request.GET.get('country')
            countries = request.GET.get('countries')

            allData = []
            # Sale Properties
            sale_props = SaleProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'title', 'image_data', 'price', 'latitude', 'longitude', 'location','country',
                'property_demension', 'bedrooms', 'bathrooms', 'created_at', 'subscription_type', 'is_featured','customerId__profileImage'
            )
            for sp in sale_props:
                sp.update({
                    'filter_price': sp['price'],
                    'type': "SaleProperty",
                    'filter_image': sp['image_data'],
                    'filter_date':sp['created_at'],
                    'status': "Approved",
                    'is_favourite': sp['id'] in sale_fav_ids
                })
                allData.append(sp)

            # Rent Properties
            rent_props = RentProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'title', 'image_data', 'video', 'rooms', 'bedrooms', 'size', 'monthly_rent',
                'rental_period', 'heading', 'name_of_ad', 'visibilty', 'location', 'latitude', 'longitude',
                'country', 'state', 'city', 'postal_code', 'landmark', 'house_number', 'subscription_type', 'is_featured','customerId__profileImage'
            )
            for rp in rent_props:
                rp.update({
                    'filter_price': rp['monthly_rent'],
                    'type': "RentProperty",
                    'filter_image': rp['image_data'],
                    'is_favourite': rp['id'] in rent_fav_ids
                })
                allData.append(rp)

            # Business for Sale
            business_props = BussinessForSale.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'company_name', 'short_title', 'image_data', 'videos', 'videos_thumbnail', 'description',
                'total_turnover', 'rent', 'established_year', 'premises', 'years_of_work', 'operation_concept',
                'operation_opening_hours', 'turnover_last_year', 'salary_percentage', 'other_operating_cost',
                'cost', 'reason_for_sale', 'website_link', 'number_of_employes', 'area', 'term_of_lease',
                'document', 'details', 'service', 'operations', 'market_initatives', 'advantage_and_oppurtunity',
                'valuation', 'owner_name', 'phone', 'telephone', 'email', 'company', 'public_order','country',
                'avaiable_attachment', 'location', 'latitude', 'longitude', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
            )
            for bp in business_props:
                bp.update({
                    'filter_price': bp['cost'],
                    'type': "BusinessSale",
                    'filter_image': bp['image_data'],
                    'filter_date':bp['start_date'],
                    'is_favourite': bp['id'] in business_fav_ids
                })
                allData.append(bp)

            # House Wanted for Rent
            house_rent_props = HouseWantedForRent.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'short_title', 'image', 'first_name', 'last_name', 'gender', 'dob', 'nationality',
                'phone_number', 'email', 'quantity', 'rental_period', 'max_rent', 'from_date', 'housing_type',
                'number_of_people', 'max_month_price', 'desired_start_date', 'desired_area', 'latitude',
                'longitude', 'location', 'about', 'education', 'martial_status', 'cleanliness',
                'party_habits', 'work', 'interest', 'subscription_type', 'is_draft', 'start_date',
                'country', 'state', 'city', 'postal_code', 'landmark', 'floor', 'description', 'is_featured','customerId__profileImage'
            )
            for hr in house_rent_props:
                hr.update({
                    'filter_price': hr['max_month_price'],
                    'type': "HouseRent",
                    'filter_image': hr['image'],
                    'filter_date':hr['start_date'],
                    'is_favourite': hr['id'] in house_rent_fav_ids
                })
                allData.append(hr)

            # Investment Projects
            invest_projects = InvestmentMyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'property_name', 'image_data', 'videos', 'documents_data', 'property_type',
                'assest_equality', 'investment_highlight', 'equity_price', 'lp_equity_percent', 'gp_equity_percent',
                'debt_percent', 'property_at_glance_title', 'description', 'bussiness_plan', 'minimum_investment',
                'investment_strategy', 'expected_attitude_price', 'financed', 'target_return_on_cost', 'target_irr',
                'offered_by', 'estimated_first_distribution', 'type_of_investment', 'phone_number',
                'measure_for_multiplier', 'address', 'location_details', 'location', 'latitude', 'longitude',
                'subscription_type', 'status', 'is_draft','customerId__profileImage'
            )
            for ip in invest_projects:
                ip.update({
                    'filter_price': ip['equity_price'],
                    'type': "InvestmentProject",
                    'filter_image': ip['image_data'],
                    'is_favourite': ip['id'] in invest_proj_fav_ids
                })
                allData.append(ip)

            # Investment Companies
            invest_companies = InvestmentMyCompany.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'property_name', 'company_logo', 'description', 'the_valuation', 'nominal_share_price',
                'subscription_type', 'start_date','customerId__profileImage'
            )
            for ic in invest_companies:
                ic.update({
                    'filter_price': ic['nominal_share_price'],
                    'type': "InvestmentCompany",
                    'filter_date':ic['start_date'],
                    'is_favourite': ic['id'] in invest_comp_fav_ids
                })
                allData.append(ic)

            # Property Projects
            property_projects = PropertyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj).values(
                'id', 'short_title', 'property_overview', 'property_description', 'image_data', 'videos',
                'property_document', 'category', 'property_name', 'property_dimension', 'country', 'state', 'city',
                'postal_code', 'landmark', 'house_number', 'location', 'latitude', 'longitude', 'facility',
                'benefits', 'return_on_investment', 'finder_fee', 'gross_income', 'price', 'cashflow_pcm',
                'total_termination_fee', 'purchase_price', 'potential_cashflow_pcm', 'investment_finder_fee',
                'investment_return_on_investment_fee', 'rental', 'the_vision', 'cost_to_consider', 'capital_required',
                'cashflow_forecast', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
            )
            for pp in property_projects:
                pp.update({
                    'filter_price': pp['price'],
                    'type': "PropertyProject",
                    'filter_image': pp['image_data'],
                    'filter_date':pp['start_date'],
                    'is_favourite': pp['id'] in property_proj_fav_ids
                })
                allData.append(pp)

            try:
                if filter_data:
                    if country:
                        allData = [d for d in allData if d['country'] == country]
                    if countries:
                        country_list = [c.strip() for c in countries.split(',')]
                        allData = [d for d in allData if d['country'] in country_list]
                    
                    allData = sorted(allData, key=lambda x: (not x.get('is_featured', False), -x.get('subscription_type', 0)))
                    for property_data in allData:
                        try:
                            property_data['image_data'] = ast.literal_eval(property_data['image_data'])
                        except:
                            property_data['image'] = ast.literal_eval(property_data['image'])
            except Exception as e:
                return Response({
                    'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR,
                    'message': str(e)
                }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

            return Response({
                'status_code': status.HTTP_200_OK,
                'message': 'Map data listed successfully',
                'data': list(allData),
                'popular_data': []
            }, status=status.HTTP_200_OK)

        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 homepageUnauthorize(APIView):
#     def get(self,request):
#             saleProperty = SaleProperty.objects.filter(end_date__isnull = True,status = 1)
#             rentProperty = RentProperty.objects.filter(end_date__isnull = True,status = 1)
#             bussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,status = 1)
#             houseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,status = 1)
#             investmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,status = 1)
#             investmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,status = 1)
#             propertyProject = PropertyProject.objects.filter(end_date__isnull = True,status = 1)
#             how_obj =  HowItWorks.objects.filter(end_date__isnull = True)
#             companySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True)
#             propertyDeveloper =  PropertyDevelopers.objects.filter(end_date__isnull = True)

ast
#             selected_type = request.GET.get('type')
#             filter_data =  request.GET.get('filter_data')
#             search_data =  request.GET.get('search_data')
#             min_price = request.GET.get('min_price')
#             max_price = request.GET.get('max_price')
#             subscription_tyre = request.GET.get('subscription_tyre')
#             latitude = request.GET.get('latitude')
#             longitude = request.GET.get('longitude')


#             allData= []
#             if propertyDeveloper:
#                 for pd in propertyDeveloper:
#                     if pd.status == 0:
#                         status_info = "Pending"
#                     elif pd.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                         allData.append({
#                             'id': pd.id,
#                             'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
#                             'customer_id' : pd.customerId.id,
#                             'customer_phone_number' : pd.customerId.phoneNumber,
#                             'customer_images' : pd.customerId.profileImage,
#                             'image_data': ast.literal_eval(pd.property_image),
#                             'videos': pd.videos,
#                             'videos_thumbnail': pd.videos_thumbnail,
#                             'document': pd.document,
#                             'property_name':pd.property_name,
#                                'property_type': pd.property_type,
#                             'assest_equality': pd.assest_equality,
#                             'investment_highlight': pd.investment_highlight,
#                             'equity_price': pd.equity_price,
#                             'lp_equity_percent': pd.lp_equity_percent,
#                             'gp_equity_percent': pd.gp_equity_percent,
#                             'debt_percent': pd.debt_percent,
#                             'short_title': pd.short_title,
#                             'description': pd.description,
#                             'bussiness_plan': pd.bussiness_plan,
#                             'minimum_investment': pd.minimum_investment,
#                             'investment_strategy': pd.investment_strategy,
#                             'expected_period': pd.expected_period,
#                             'financed': pd.financed,
#                             'target_return_on_cost': pd.target_return_on_cost,
#                             'target_irr': pd.target_irr,
#                             'offered_by': pd.offered_by,
#                             'estimated_first_distribution': pd.estimated_first_distribution,
#                             'type_of_investment': pd.type_of_investment,
#                             'phone_number': pd.phone_number,
#                             'measure_of_multiplier': pd.measure_of_multiplier,
#                             'address': pd.address,
#                             'minimum_goal': pd.minimum_goal,

#                             'nominal_share_price': pd.nominal_share_price,
#                             'the_valuation': pd.the_valuation,
#                             'minimum_drawing': pd.minimum_drawing,

#                             'no_of_drawings': pd.no_of_drawings,
#                             'share_for_sale': pd.share_for_sale,
#                             'remaining_share': pd.remaining_share,
#                             'maximum_drawing': pd.maximum_drawing,
#                             'short_description': pd.short_description,
#                             'why_invest': pd.why_invest,
#                             'problem_to_be_solved': pd.problem_to_be_solved,
#                             'our_solution': pd.our_solution,
#                             'start_date_data': pd.start_date_data,
#                             'end_date_data': pd.end_date_data,
#                             'number_of_share': pd.number_of_share,
#                             'issue_minimum_investment': pd.issue_minimum_investment,
#                             'issue_maximum_investment': pd.issue_maximum_investment,
#                             'value_before_issue': pd.value_before_issue,
#                             'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
#                             'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
#                             'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
#                             'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
#                             'self_report': pd.self_report,
#                             'discussion_description': pd.discussion_description,
#                             'new_exisiting_details': pd.new_exisiting_details,
#                             'drawing_on_behalf': pd.drawing_on_behalf,
#                             'foundation': pd.foundation,
#                             'satutes': pd.satutes,
#                             'annual_account': pd.annual_account,
#                             'valuation': pd.valuation,
#                             'agreement_on_co': pd.agreement_on_co,
#                             'conversion_of_debt': pd.conversion_of_debt,
#                             'balance_sheet': pd.balance_sheet,
#                             'result_report': pd.result_report,
#                             'location': pd.location,
#                             'country': pd.country,
#                             'state': pd.state,
#                             'city': pd.city,
#                             'zip_code': pd.postal_code,
#                             'landmark': pd.landmark,
#                             'latitude': pd.latitude,
#                             'longitude': pd.longitude,
#                             'status': pd.status,
#                             'agency': pd.agency.id if pd.agency else None,
#                             'subscription_type': pd.subscription_type,
#                             'start_date': pd.start_date,
#                             'end_date': pd.end_date,
#                             'status':status_info,
#                               'is_ad_featured':pd.is_featured,
#                             'type':"property_developers",
#                     })

   
#             if companySeeking:
#                 for cs in companySeeking:
#                     if cs.status == 0:
#                         status_info = "Pending"
#                     elif cs.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                     print(cs.property_image)
#                     allData.append({
#                         'id': cs.id,
#                         'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
#                         'company_name': cs.company_name,
#                         'short_title': cs.short_title,
#                         'description': cs.description,
#                         'about_the_owner': cs.about_the_owner,
#                         'image_data': ast.literal_eval(cs.property_image) if cs.property_image else None,
#                         'videos': cs.property_video,
#                         'videos_thumbnail': cs.videos_thumbnail,
#                         'company_logo': cs.company_logo,
#                         'maximum_drawing': cs.maximum_drawing,
#                         'minimum_drawing': cs.minimum_drawing,
#                         'share_for_sale': cs.share_for_sale,
#                         'price_per_share': cs.price_per_share,
#                         'filter_price': cs.price_per_share,
#                         'number_of_share': cs.number_of_share,
#                         'self_report': cs.self_report,
#                         'nominal_share_price': cs.nominal_share_price,
#                         'e_post': cs.e_post,
#                         'issue_account_number': cs.issue_account_number,
#                         'establish_year': cs.establish_year,
#                         'premises_from': cs.premises_from,
#                         'background_for_sale': cs.background_for_sale,
#                         'company_website': cs.company_website,
#                         'number_of_employee': cs.number_of_employee,
#                         'company_email': cs.company_email,
#                         'company_telephone': cs.company_telephone,
#                         'youtube': cs.youtube,
#                         'upload_team_data': cs.upload_team_data,
#                         'upload_team_name': cs.upload_team_name,
#                         'upload_team_size': cs.upload_team_size,
      
#                         'upload_board_data': cs.upload_board_data,
#                         'upload_board_name': cs.upload_board_name,
#                         'upload_board_size': cs.upload_board_size,
      
#                         'upload_partner_data': cs.upload_partner_data,
#                         'upload_partner_name': cs.upload_partner_name,
#                         'upload_partner_size': cs.upload_partner_size,
#                         'location': cs.location,
#                         'country': cs.country,
#                         'state': cs.state,
#                         'city': cs.city,
#                         'zip_code': cs.zip_code,
#                         'landmark': cs.landmark,
#                         'share_holder_image': cs.share_holder_image,
#                         'enter_shares': cs.enter_shares,
#                         'status': cs.status,
#                         'agency': cs.agency.id if cs.agency else None,
#                         'subscription_type': cs.subscription_type,
#                         'latitude': cs.latitude,
#                         'longitude': cs.longitude,
#                         'start_date': cs.start_date,
#                         'end_date': cs.end_date,
#                         # 'is_favourite': cs.is_favourite,
#                         # 'favourite_date': cs.favourite_date,
#                         # 'is_favourite':favourite,
#                         'is_ad_featured':cs.is_featured,
#                         'status':status_info,
#                         'type':"companySeeking"
#                     })
#             if saleProperty:

#                 for salelist in saleProperty:
#                     if salelist.status == 0:
#                         status_info = "Pending"
#                     elif salelist.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                     alldata = {
#                         'id':salelist.id,
#                         'title':salelist.title,
#                         'image_data':salelist.image_data,
#                         'price':salelist.price,
#                         'descriptioon':salelist.descriptioon,
#                         'latitude':salelist.latitude,
#                         'longitude':salelist.longitude,
#                         'location':salelist.location,
#                         'property_demension':salelist.property_demension,
#                         'filter_price':salelist.price,
#                         'bedrooms':salelist.bedrooms,
#                         'bathrooms':salelist.bathrooms,
#                         'created_date':salelist.created_at,
#                         'location':salelist.location,
#                         'created_date':salelist.created_at,
#                         'type':"SaleProperty",
#                           'is_ad_featured':salelist.is_featured,
#                         'status':status_info,
#                     }
#                     allData.append(alldata)
#             if rentProperty:
#                 for rentlist in rentProperty:
#                     if rentlist.status == 0:
#                         status_info = "Pending"
#                     elif rentlist.status == 1:
#                         status_info = "Approved"
#                     else:ast
#                         status_info = "Disapproved"
#                     alldata = {
#                         'id':rentlist.id,
#                         'title':rentlist.title,
#                         'image_data':rentlist.image_data,
#                         'video':rentlist.video,
#                         'rooms':rentlist.rooms,
#                         'bedrooms':rentlist.bedrooms,
#                         'size':rentlist.size,
#                         'country': rentlist.country,
#                         'state': rentlist.state,
#                         'city': rentlist.city,
#                         'postal_code':rentlist.postal_code,
#                         'landmark': rentlist.landmark,
#                         'house_number': rentlist.house_number,
#                         'filter_price':rentlist.monthly_rent,
#                         'rental_period':rentlist.rental_period,
#                         'heading':rentlist.heading,
#                         'name_of_ad':rentlist.name_of_ad,
#                         'visibilty':rentlist.visibilty,
#                         'location':rentlist.location,
#                         'latitude':rentlist.latitude,
#                         'longitude':rentlist.longitude,
#                         'type':"RentProperty",
#                           'is_ad_featured':rentlist.is_featured,
#                         'status':status_info,
#                     }
#                     allData.append(alldata)
#             if bussinessSale:
#                 for bs in bussinessSale:
#                     allData.append({
#                         'id': bs.id,
#                         'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
#                         'company_name': bs.company_name,
#                         'short_title': bs.short_title,
#                         'image_data':  ast.literal_eval(bs.image_data),
#                         'videos': bs.videos,
#                         'videos_thumbnail': bs.videos_thumbnail,
#                         'company_name': bs.company_name,
#                         'description': bs.description,
#                         'total_turnover': bs.total_turnover,
#                         'rent': bs.rent,
#                         'established_year': bs.established_year,
#                         'premises': bs.premises,
#                         'years_of_work': bs.years_of_work,
#                         'operation_concept': bs.operation_concept,
#                         'operation_opening_hours': bs.operation_opening_hours,
#                         'turnover_last_year': bs.turnover_last_year,
#                         'salary_percentage': bs.salary_percentage,
#                         'other_operating_cost': bs.other_operating_cost,
#                           'filter_price':bs.cost,
#                         'cost': bs.cost,
#                         'reason_for_sale':bs.reason_for_sale,
#                         'website_link':bs.website_link,
#                         'number_of_employes':bs.number_of_employes,
#                         'other_operating_cost':bs.other_operating_cost,
#                         'area':bs.area,
#                         'term_of_lease': bs.term_of_lease,
#                         'document':ast.literal_eval(bs.document),
#                         'details': bs.details,
#                         'service':bs.service,
#                         'operations':bs.operations,
#                         'market_initatives':bs.market_initatives,
#                         'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
#                         'valuation':bs.valuation,
#                         'owner_name':bs.owner_name,
#                         'phone':bs.phone,
#                         'telephone':bs.telephone,
#                         'email':bs.email,
#                         'company':bs.company,
#                         'public_order':bs.public_order,
#                         'avaiable_attachment':bs.avaiable_attachment,
#                         'location':bs.location,
#                         'latitude':bs.latitude,
#                         'longitude':bs.longitude,    
#                         'subscription_type':bs.subscription_type,
#                         'created_date':bs.start_date,
#                         'is_ad_featured':bs.is_featured,
#                         'type':"BusinessSale"})
#             if houseWantedRent:
#                 for hWr in houseWantedRent:
#                     if hWr.status == 0:
#                         status_info = "Pending"
#                     elif hWr.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                     allData.append({
#                         'id': hWr.id,
#                         'short_title':hWr.short_title,
#                         'customer_id':hWr.customerId.id,
#                         'fullname': hWr.first_name+' '+ hWr.last_name,
#                         'profile_visiblity':hWr.profile_visiblity,
#                         'profile_hidden':hWr.profile_hidden,
#                         'image': ast.literal_eval(hWr.image),
#                         'first_name': hWr.first_name,
#                         'last_name': hWr.last_name,
#                         'gender': hWr.gender,
#                         'dob': hWr.dob,
#                         'nationality': hWr.nationality,
#                         'phone_number':hWr.phone_number,
#                         'email': hWr.email,
#                         'quantity': hWr.quantity,
#                         'rental_period': hWr.rental_period,
#                         'max_rent': hWr.max_rent,
#                         'from_date': hWr.from_date,
#                         'housing_type':hWr.housing_type,
#                         'number_of_people':hWr.number_of_people,
#                           'filter_price':hWr.max_month_price,
#                         'max_month_price': hWr.max_month_price,
#                         'desired_start_date':hWr.desired_start_date,
#                         'desired_area': hWr.desired_area,
#                         'latitude':hWr.latitude,
#                         'longitude':hWr.longitude,
#                         'location':hWr.location,
#                         'about':hWr.about,
#                         'education':hWr.education,
#                         'martial_status':hWr.martial_status,
#                         'cleanliness':hWr.cleanliness,
#                         'party_habits':hWr.party_habits,
#                         'work':hWr.work,
#                         'interest':hWr.interest,
#                         'subscription_type':hWr.subscription_type,
#                         'is_draft':hWr.is_draft,
#                         'created_date':hWr.start_date,
#                         'status':status_info,
#                         'country':hWr.country,
#                         'state':hWr.state,
#                         'city':hWr.city,
#                         'postal_code':hWr.postal_code,
#                         'landmark':hWr.landmark,
#                         'floor':hWr.floor,
#                         'description':hWr.description,
#                         'is_ad_featured':hWr.is_featured,
#                         'type':"HouseRent"})
#             if investmentProject:
#                 for ip in investmentProject:
                    
#                     allData.append({'id':ip.id,
#                         'customer_id':ip.customerId.id,
#                         'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
#                         'property_name':ip.property_name,
#                         'image_data':ip.image_data,
#                         'videos':ip.videos,
#                         'documents_data':ip.documents_data,
#                         'property_type':ip.property_type,
#                         'assest_equality':ip.assest_equality,
#                         'investment_highlight':ip.investment_highlight,
#                         'filter_price':ip.equity_price,
#                         'equity_price':ip.equity_price,
#                         'lp_equity_percent':ip.lp_equity_percent,
#                         'gp_equity_percent':ip.gp_equity_percent,
#                         'debt_percent':ip.debt_percent,
#                         'property_at_glance_title':ip.property_at_glance_title,
#                         'description':ip.description,
#                         'bussiness_plan':ip.bussiness_plan,
#                         'minimum_investment':ip.minimum_investment,
#                         'investment_strategy':ip.investment_strategy,
#                         'expected_attitude_price':ip.expected_attitude_price,
#                         'financed':ip.financed,
#                         'target_return_on_cost':ip.target_return_on_cost,
#                         'target_irr':ip.target_irr,
#                         'lp_equity_percent':ip.lp_equity_percent,
#                         'offered_by':ip.offered_by,
#                         'estimated_first_distribution':ip.estimated_first_distribution,
#                         'type_of_investment':ip.type_of_investment,
#                         'phone_number':ip.phone_number,
#                         'measure_for_multiplier':ip.measure_for_multiplier,
#                         'address':ip.address,
#                         'location_details':ip.location_details,
#                         # 'property_summary':ip.property_summary,
#                         # 'property_details':ip.property_details,
#                         # 'overview':ip.overview,
#                         # 'debt_assumption':ip.debt_assumption,
#                         'location':ip.location,
#                         'latitude':ip.latitude,
#                         'longitude':ip.longitude,
#                         'status':ip.status,
#                         'type':"InvestmentProject"})
#             if investmentCompany:
#                 for ic in investmentCompany:
#                     allData.append({'id':ic.id,
#                          'title':ic.property_name,
#                         'company_name':ic.property_name,
#                         'image_data':ic.company_logo,
#                         'description':ic.description,
#                         'the_valuation':ic.the_valuation,
#                         'nomial_share_price':ic.nominal_share_price,
#                         'filter_price':ic.nominal_share_price,
#                         'created_date':ic.start_date,
#                         'type':"InvestmentCompany"})
#             if propertyProject:
#                 for pp in propertyProject:
#                     if pp.status == 0:
#                         status_info = "Pending"
#                     elif pp.status == 1:
#                         status_info = "Approved"
#                     else:
#                         status_info = "Disapproved"
#                     allData.append({
#                           'id': pp.id,
#                         'customer_id':pp.customerId.id,
#                         'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
#                         'spend_too_much_time':pp.spend_too_much_time,
#                         'most_useless_skill':pp.most_useless_skill,
#                         'fun_act':pp.fun_act,
#                         'biography':pp.biography,
#                         'short_title':pp.short_title,
#                         'property_overview':pp.property_overview,
#                         'property_description':pp.property_description,
#                         'image_data':pp.image_data,
#                         'videos':pp.videos,
#                         'property_document':pp.property_document,
#                         'category':pp.category,
#                         'property_name':pp.property_name,
#                         'property_dimension':pp.property_dimension,
#                         'country':pp.country,
#                         'state':pp.state,
#                         'city':pp.city,
#                         'postal_code':pp.postal_code,
#                         'landmark':pp.landmark,
#                         'house_number':pp.house_number,
#                         'location':pp.location,
#                         'latitude':pp.latitude,
#                         'longitude':pp.longitude,
#                         'facility':pp.facility,
#                         'benefits':pp.benefits,
#                         'return_on_investment':pp.return_on_investment,
#                         'finder_fee':pp.finder_fee,
#                         'gross_income':pp.gross_income,
#                         'price':pp.price,
#                         'cashflow_pcm':pp.cashflow_pcm,
#                         'total_termination_fee':pp.total_termination_fee,
#                         'purchase_price':pp.purchase_price,
#                         'potential_cashflow_pcm':pp.potential_cashflow_pcm,
#                         'investment_finder_fee':pp.investment_finder_fee,
#                         'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
#                         'rental':pp.rental,
#                         'the_vision':pp.the_vision,
#                         'cost_to_consider':pp.cost_to_consider,
#                         'capital_required':pp.capital_required,
#                         'cashflow_forecast':pp.cashflow_forecast,
#                         'investment_finder_fee':pp.investment_finder_fee,
#                         'is_draft':pp.is_draft,
#                           'filter_price':pp.price,
#                            'created_date':pp.start_date,
#                         'subscription_type':pp.subscription_type,
#                         'status':status_info,
#                           'is_ad_featured':pp.is_featured,
#                            'type':"PropertyProject"
#                         })
#             # Filter by selected type
#             if filter_data == 'true':
#                 if selected_type:
#                     allData = [data for data in allData if data['type'] == selected_type]
#                 if subscription_tyre:
#                     allData = [data for data in allData if data['subscription_type'] == int(subscription_tyre)]
#                 if min_price and max_price:
#                     min_price = int(min_price) 
#                     max_price = int(max_price) 
#                     allData = [data for data in allData if min_price <= data['filter_price'] <= max_price]


#                 if search_data:
#                     allData = [data for data in allData if data['title'] == search_data]

#                     filtered_data = []
#                     for data in allData:
#                         filtered_data.append(data)
                    
#                     allData = filtered_data
#                     # lookups.add(Q(latitude__gte= (lat - kmrange/111.1),latitude__lte=(lat + kmrange/111.1),longitude__gte=(long - kmrange/111.1),longitude__lte=(long + kmrange/111.1)),Q.AND)
#             else:
#                 if selected_type:
#                     allData = [data for data in allData if data['type'] == selected_type]
#                 random.shuffle(allData)
#                 allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', True), -x.get('subscription_type', 3)))
            
#             how_it_work_obj = ContentPagesAdmin.objects.filter(page_type_name = "How_it_work").first()
#             how_data = {
#                 'id':how_it_work_obj.id,
#                 'page_type_name':how_it_work_obj.page_type_name,
#                 'page_title':how_it_work_obj.page_title,
#                 'page_content':how_it_work_obj.page_content,
#             }
#             about_us = []
#             about_obj = ContentPagesAdmin.objects.filter(page_type_name = "About_us").first()
#             for about in about_us:
#                 all_data = {
#                     'id':about.id,
#                     'page_type_name':about.page_type_name,
#                     'page_title':about.page_title,
#                     'page_content':about.page_content,
#                 }
#                 about_us.append(all_data)
#             Categories_obj = CategoriesContent.objects.filter(end_date__isnull = True)
#             category_data = []
#             for cat in Categories_obj:
#                 all_data = {
#                     'id':cat.id,
#                     'image':cat.image,
#                     'title':cat.title,
#                     'description':cat.description,
#                 }
#                 category_data.append(all_data)
#             services_data =[]
#             service_obj = ServicesContent.objects.filter(end_date__isnull = True)
#             for service in service_obj:
#                 all_data = {
#                     'id':service.id,
#                     'title':service.title,
#                     'description':service.description,
#                 }
#                 services_data.append(all_data)
#             test_data = []
#             test_obj = Testimonials.objects.filter(end_date__isnull = True)
#             for test in test_obj:
#                 all_data = {
#                     'id':test.id,
#                     'title':test.title,
#                     'description':test.description,
#                     'ratings':test.ratings,
#                     'name':test.name,
#                     'designation':test.designation,
#                 }
#             how_Data = []
#             for how in how_obj:
#                 all_data = {
#                     'id':how.id,
#                     'step_number':how.step_number,
#                     'icon':how.icon,
#                     'title':how.title,
#                     'description':how.description,
#                 }
#                 how_Data.append(all_data)
#             if filter_data == 'true':
#                 if selected_type:
#                     allData = [data for data in allData if data['type'] == selected_type]
#                 if subscription_tyre:
#                     allData = [data for data in allData if data['subscription_type'] == int(subscription_tyre)]
#                 if min_price and max_price:
#                     min_price = int(min_price) 
#                     max_price = int(max_price) 
#                     allData = [data for data in allData if min_price <= int(data['filter_price']) <= max_price]
                
#                 if latitude and longitude:
#                     if allData:
#                         if allData[0]['latitude'] and allData[0]['longitude']:
#                             allData = [data for data in allData if float(latitude) == data['latitude'] and float(longitude) == data['longitude']]  
#                 if search_data:
#                     allData = [data for data in allData if data['title'] == search_data]

#                     filtered_data = []
#                     for data in allData:
#                         filtered_data.append(data)
                    
#                     allData = filtered_data
#                     allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', True), -x.get('subscription_type', 3)))
#             else:
#                 if selected_type:
#                     allData = [data for data in allData if data['type'] == selected_type]
#                 random.shuffle(allData)
#                 allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', True), -x.get('subscription_type', 3)))
#             return Response({'status_code':status.HTTP_200_OK,'message':'Success','data':allData,'how_it_work':how_Data,'about_us':about_us,'category_data':category_data},status=status.HTTP_200_OK)
#         # except Exception as e:
#         # 	return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

from itertools import chain

# def get_all_unique_countries():
#     sale_countries = SaleProperty.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
#     rent_countries = RentProperty.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
#     business_countries = BussinessForSale.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
#     wanted_countries = HouseWantedForRent.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
#     property_project_countries = PropertyProject.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
#     equity_countries = CompanySeekingEquity.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
#     developer_countries = PropertyDevelopers.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()

#     # Merge all country lists
#     all_countries = set(
#         chain(
#             sale_countries,
#             rent_countries,
#             business_countries,
#             wanted_countries,
#             property_project_countries,
#             equity_countries,
#             developer_countries,
#         )
#     )

#     # Remove None/empty strings and normalize case (if needed)
#     cleaned_countries = [c.strip().lower() for c in all_countries if c and c.strip()]  # Remove empty and None, normalize case
#     unique_countries = sorted(set(cleaned_countries))  # Ensure uniqueness and sort

#     return unique_countries

def get_all_unique_countries():
    # Fetch countries from all models
    sale_countries = SaleProperty.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
    rent_countries = RentProperty.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
    business_countries = BussinessForSale.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
    wanted_countries = HouseWantedForRent.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
    property_project_countries = PropertyProject.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
    equity_countries = CompanySeekingEquity.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()
    developer_countries = PropertyDevelopers.objects.filter(status=1, end_date__isnull=True).values_list('country', flat=True).distinct()

    # Merge all country lists
    all_countries = set(
        chain(
            sale_countries,
            rent_countries,
            business_countries,
            wanted_countries,
            property_project_countries,
            equity_countries,
            developer_countries,
        )
    )

    cleaned_countries = []
    for country in all_countries:
        if country is None:
            continue
            
        country = country.strip()
        
        if not country:
            continue
            
        cleaned_countries.append(country.lower())  # Normalize case

    # Ensure uniqueness and sort
    unique_countries = sorted(set(cleaned_countries))
    
    return unique_countries

from django.utils.dateparse import parse_date
from datetime import datetime, date

class fetchAllCountries(APIView):
    def get(self, request):
        try:
            countries = get_all_unique_countries()
            date_str = request.query_params.get('date')
            if date_str:
                filter_date = parse_date(date_str)
                if not filter_date:
                    return Response({
                        "status_code": status.HTTP_400_BAD_REQUEST,
                        "status_message": "Invalid date format. Use YYYY-MM-DD."
                    })
            else:
                filter_date = date.today()

            sale_props = SaleProperty.objects.filter(created_at__date=filter_date).values()
            rent_props = RentProperty.objects.filter(created_at__date=filter_date).values()
            sale_rent_props = SaleAndRentProperty.objects.filter(created_at__date=filter_date).values()
            business_props = BussinessForSale.objects.filter(start_date__date=filter_date).values()
            house_wanted = HouseWantedForRent.objects.filter(start_date__date=filter_date).values()

            sale_count = sale_props.count()
            rent_count = rent_props.count()
            sale_rent_count = sale_rent_props.count()
            business_count = business_props.count()
            house_wanted_count = house_wanted.count()

            return Response({
                "status_code": status.HTTP_200_OK,
                "status_message": "Fetched unique countries successfully",
                "data": countries,
                "property_message": f"Properties fetched for date {filter_date}",
                "proeprty_count": sale_count+rent_count+sale_rent_count+business_count+house_wanted_count,
            })
        
        except Exception as e:
            return Response({"message": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
    def post(self, request):
        try:
            ...
        #     date_str = request.data.get('date')
        #     if date_str:
        #         filter_date = parse_date(date_str)
        #         if not filter_date:
        #             return Response({
        #                 "status_code": status.HTTP_400_BAD_REQUEST,
        #                 "status_message": "Invalid date format. Use YYYY-MM-DD."
        #             })
        #     else:
        #         filter_date = date.today()

        #     sale_props = SaleProperty.objects.filter(created_at__date=filter_date).values()
        #     rent_props = RentProperty.objects.filter(created_at__date=filter_date).values()
        #     sale_rent_props = SaleAndRentProperty.objects.filter(created_at__date=filter_date).values()
        #     business_props = BussinessForSale.objects.filter(start_date__date=filter_date).values()
        #     house_wanted = HouseWantedForRent.objects.filter(start_date__date=filter_date).values()

        #     all_properties = {
        #         "sale_properties": list(sale_props),
        #         "rent_properties": list(rent_props),
        #         "sale_and_rent_properties": list(sale_rent_props),
        #         "business_for_sale": list(business_props),
        #         "house_wanted_for_rent": list(house_wanted),
        #     }

        #     return Response({
        #         "status_message": f"Properties fetched for date {filter_date}",
        #         "all_properties":all_properties
        #     })
        except Exception as e:
            return Response({"message": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

def get_top_countries(limit=4):
    # Count per model
    sale_counts = SaleProperty.objects.filter(status=1,end_date__isnull = True).values_list('country', flat=True)
    rent_counts = RentProperty.objects.filter(status=1,end_date__isnull = True).values_list('country', flat=True)
    business_counts = BussinessForSale.objects.filter(status=1,end_date__isnull = True).values_list('country', flat=True)
    wanted_counts = HouseWantedForRent.objects.filter(status=1,end_date__isnull = True).values_list('country', flat=True)
    project_counts = PropertyProject.objects.filter(status=1,end_date__isnull = True).values_list('country', flat=True)
    equity_counts = CompanySeekingEquity.objects.filter(status=1,end_date__isnull = True).values_list('country', flat=True)
    developer_counts = PropertyDevelopers.objects.filter(status=1,end_date__isnull = True).values_list('country', flat=True)

    # Merge all
    all_countries = chain(
        sale_counts,
        rent_counts,
        business_counts,
        wanted_counts,
        project_counts,
        equity_counts,
        developer_counts,
    )

    # Count occurrences
    counter = Counter([c for c in all_countries if c])

    # Return top N
    return counter.most_common(limit)


class TopCountriesAPIView(APIView):
    def get(self, request):
        try:
            top_countries = get_top_countries(limit=4)
            data = [
                {"country": country, "count": count}
                for country, count in top_countries
            ]
            return Response({
                "status_code": status.HTTP_200_OK,
                "status_message": "Fetched top countries successfully",
                "data": data
            })
        except Exception as e:
            return Response(
                {"message": str(e)},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )
""" 
class homepageUnauthorize(APIView):
    def get(self, request):                 
        try:
            selected_type = request.GET.get('type')
            filter_data = request.GET.get('filter_data') == 'true'
            search_data = request.GET.get('search_data')
            min_price = request.GET.get('min_price')
            max_price = request.GET.get('max_price')
            country = request.GET.get('country')
            countries = request.GET.get('countries')


            subscription_tyre = request.GET.get('subscription_tyre')
            latitude = request.GET.get('latitude')
            longitude = request.GET.get('longitude')

            allData = []

            # Sale Properties
            sale_props = SaleProperty.objects.filter(end_date__isnull=True, status=1).values(
                'id', 'title', 'image_data', 'price', 'latitude', 'longitude', 'location','country',
                'property_demension', 'bedrooms', 'bathrooms', 'created_at', 'subscription_type', 'is_featured','customerId__profileImage','customerId__user__id'
            )
            for sp in sale_props:
                sp.update({
                    'filter_price': sp['price'],
                    'type': "SaleProperty",
                    'status': "Approved"
                })
                allData.append(sp)

            # Rent Properties
            rent_props = RentProperty.objects.filter(end_date__isnull=True, status=1).values(
                'id', 'title', 'image_data', 'video', 'rooms', 'bedrooms', 'size', 'monthly_rent',
                'rental_period', 'heading', 'name_of_ad', 'visibilty', 'location', 'latitude', 'longitude',
                'country', 'state', 'city', 'postal_code', 'landmark', 'house_number', 'subscription_type', 'is_featured','customerId__profileImage','customerId__user__id'
            )
            for rp in rent_props:
                rp.update({
                    'filter_price': rp['monthly_rent'],
                    'type': "RentProperty"
                })
                allData.append(rp)

            # Business for Sale
            business_props = BussinessForSale.objects.filter(end_date__isnull=True, status=1).values(
                'id', 'company_name', 'short_title', 'image_data', 'videos', 'videos_thumbnail', 'description','country',
                'cost', 'location', 'latitude', 'longitude', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage','customerId__user__id'
            )
            for bp in business_props:
                bp.update({
                    'filter_price': bp['cost'],
                    'type': "BusinessSale"
                })
                allData.append(bp)

            # House Wanted for Rent
            house_rent_props = HouseWantedForRent.objects.filter(end_date__isnull=True, status=1).values(
                'id', 'short_title', 'image', 'first_name', 'last_name', 'gender', 'dob', 'nationality',
                'phone_number', 'email', 'quantity', 'rental_period', 'max_rent', 'from_date', 'housing_type',
                'number_of_people', 'max_month_price', 'desired_start_date', 'desired_area', 'latitude',
                'longitude', 'location', 'subscription_type', 'is_draft', 'start_date', 'country', 'state',
                'city', 'postal_code', 'landmark', 'floor', 'description', 'is_featured','customerId__profileImage','customerId__user__id'
            )
            for hr in house_rent_props:
                hr.update({
                    'filter_price': hr['max_month_price'],
                    'type': "HouseRent"
                })
                allData.append(hr)

            # Investment Projects
            invest_projects = InvestmentMyProject.objects.filter(end_date__isnull=True, status=1).values(
                'id', 'property_name', 'image_data', 'videos', 'documents_data', 'equity_price', 'location',
                'latitude', 'longitude', 'subscription_type', 'type_of_investment', 'is_draft','customerId__profileImage','customerId__user__id'
            )
            for ip in invest_projects:
                ip.update({
                    'filter_price': ip['equity_price'],
                    'type': "InvestmentProject"
                })
                allData.append(ip)

            # Investment Companies
            invest_companies = InvestmentMyCompany.objects.filter(end_date__isnull=True, status=1).values(
                'id', 'property_name', 'company_logo', 'description', 'the_valuation', 'nominal_share_price',
                'subscription_type', 'start_date','customerId__profileImage','customerId__user__id'
            )
            for ic in invest_companies:
                ic.update({
                    'filter_price': ic['nominal_share_price'],
                    'type': "InvestmentCompany"
                })
                allData.append(ic)

            # Property Projects
            property_projects = PropertyProject.objects.filter(end_date__isnull=True, status=1).values(
                'id', 'short_title', 'property_overview', 'property_description', 'image_data', 'videos',
                'property_document', 'category', 'property_name', 'property_dimension', 'country', 'state', 'city',
                'postal_code', 'landmark', 'house_number', 'location', 'latitude', 'longitude', 'price',
                'subscription_type', 'start_date', 'is_featured','customerId__profileImage','customerId__user__id'
            )
            for pp in property_projects:
                pp.update({
                    'filter_price': pp['price'],
                    'type': "PropertyProject"
                })
                allData.append(pp)

            # Filtering
            if filter_data:
                if selected_type:
                    allData = [d for d in allData if d['type'] == selected_type]
                if country:
                    allData = [d for d in allData if d['country'] == country]
                if countries:
                    country_list = [c.strip() for c in countries.split(',')]
                    allData = [d for d in allData if d['country'] in country_list]
                if subscription_tyre:
                    allData = [d for d in allData if d['subscription_type'] == int(subscription_tyre)]    
                if min_price and max_price:
                    allData = [d for d in allData if int(min_price) <= int(d['filter_price']) <= int(max_price)]
                if latitude and longitude:
                    allData = [d for d in allData if str(d['latitude']) == latitude and str(d['longitude']) == longitude]
                if search_data:
                    allData = [d for d in allData if search_data.lower() in d.get('title', '').lower() or search_data.lower() in d.get('short_title', '').lower()]
                allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', False), -x.get('subscription_type', 0)))
            else:
                if selected_type:
                    allData = [d for d in allData if d['type'] == selected_type]
                random.shuffle(allData)
                allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', False), -x.get('subscription_type', 0)))

            # Static content
            how_Data = list(HowItWorks.objects.filter(end_date__isnull=True).values('id', 'step_number', 'icon', 'title', 'description'))
            category_data = list(CategoriesContent.objects.filter(end_date__isnull=True).values('id', 'image', 'title', 'description'))
            services_data = list(ServicesContent.objects.filter(end_date__isnull=True).values('id', 'title', 'description'))
            testimonials = list(Testimonials.objects.filter(end_date__isnull=True).values('id', 'title', 'description', 'ratings', 'name', 'designation'))
            how_it_work_obj = ContentPagesAdmin.objects.filter(page_type_name="How_it_work").first()
            about_us_obj = ContentPagesAdmin.objects.filter(page_type_name="About_us").first()

            how_page = {
                'id': how_it_work_obj.id if how_it_work_obj else None,
                'page_type_name': how_it_work_obj.page_type_name if how_it_work_obj else '',
                'page_title': how_it_work_obj.page_title if how_it_work_obj else '',
                'page_content': how_it_work_obj.page_content if how_it_work_obj else '',
            }

            about_page = {
                'id': about_us_obj.id if about_us_obj else None,
                'page_type_name': about_us_obj.page_type_name if about_us_obj else '',
                'page_title': about_us_obj.page_title if about_us_obj else '',
                'page_content': about_us_obj.page_content if about_us_obj else '',
            }

            # Apply simple pagination
            page = int(request.GET.get('page', 1))
            page_size = int(request.GET.get('page_size', 10))
            paginator = Paginator(allData, page_size)
            paginated_data = paginator.get_page(page)

            return Response({
                'status_code': status.HTTP_200_OK,
                'message': 'Success',
                'total_items': paginator.count,
                'total_pages': paginator.num_pages, 
                'current_page': paginated_data.number,
                'data': list(paginated_data),
                'how_it_work': how_Data,
                'about_us': about_page,
                'category_data': category_data,
                'services': services_data,
                'testimonials': testimonials,
                'how_page': how_page
            }, status=status.HTTP_200_OK)

        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 homepageUnauthorize(APIView):
    def get(self, request):                 
        try:
            selected_type = request.GET.get('type')
            filter_data = request.GET.get('filter_data') == 'true'
            search_data = request.GET.get('search_data')
            min_price = request.GET.get('min_price')
            max_price = request.GET.get('max_price')
            country = request.GET.get('country')
            countries = request.GET.get('countries')


            subscription_tyre = request.GET.get('subscription_tyre')
            latitude = request.GET.get('latitude')
            longitude = request.GET.get('longitude')

            date_filter = request.GET.get('date_filter')
            bedroom = request.GET.get('bedrooms')
            bathroom = request.GET.get('bathrooms')
            today = datetime.now().date()
            """sort by filters"""
            price_high_to_low = request.GET.get('high_to_low')
            price_low_to_high = request.GET.get('low_to_high')
            published_newest_to_oldest = request.GET.get('newest_to_oldest')
            published_oldest_to_newest = request.GET.get('oldest_to_newest')
            date_range = None
            if date_filter:
                if date_filter == 'today':
                    date_range = (today, today + timedelta(days=1))
                elif date_filter == 'this_week':
                    start_of_week = today - timedelta(days=today.weekday())
                    date_range = (start_of_week, start_of_week + timedelta(days=7))
                elif date_filter == 'this_month':
                    date_range = (today.replace(day=1), (today.replace(day=1) + timedelta(days=32)).replace(day=1))
                elif date_filter == 'last_week':
                    start_of_last_week = today - timedelta(days=today.weekday() + 7)
                    date_range = (start_of_last_week, start_of_last_week + timedelta(days=7))
                elif date_filter == 'last_month':
                    first_day_of_current_month = today.replace(day=1)
                    last_day_of_previous_month = first_day_of_current_month - timedelta(days=1)
                    first_day_of_previous_month = last_day_of_previous_month.replace(day=1)
                    date_range = (first_day_of_previous_month, first_day_of_current_month)
            allData = []

            # Sale Properties with date filtering
            sale_query = SaleProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                sale_query = sale_query.filter(created_at__date__range=date_range)
                
            sale_props = sale_query.values(
                'id', 'title', 'image_data', 'price', 'latitude', 'longitude', 'location','country',
                'property_demension', 'bedrooms', 'bathrooms', 'created_at', 'subscription_type', 'is_featured','customerId__profileImage'
            )
            for sp in sale_props:
                sp.update({
                    'filter_price': sp['price'],
                    'type': "SaleProperty",
                    'filter_date': sp['created_at'],
                    'status': "Approved",
                    'is_favourite': sp['id'] in sale_fav_ids
                })
                allData.append(sp)

            # Rent Properties with date filtering
            rent_query = RentProperty.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                rent_query = rent_query.filter(created_at__date__range=date_range)
                
            rent_props = rent_query.values(
                'id', 'title', 'image_data', 'video', 'rooms', 'bedrooms', 'size', 'monthly_rent',
                'rental_period', 'heading', 'name_of_ad', 'visibilty', 'location', 'latitude', 'longitude','created_at','bedrooms',
                'country', 'state', 'city', 'postal_code', 'landmark', 'house_number', 'subscription_type', 'is_featured','customerId__profileImage'
            )
            for rp in rent_props:
                rp.update({
                    'filter_price': rp['monthly_rent'],
                    'type': "RentProperty",
                    'filter_date': rp['created_at'],
                    'is_favourite': rp['id'] in rent_fav_ids
                })
                allData.append(rp)

            # Business for Sale with date filtering
            business_query = BussinessForSale.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                business_query = business_query.filter(start_date__date__range=date_range)
                
            business_props = business_query.values(
                'id', 'company_name', 'short_title', 'image_data', 'videos', 'videos_thumbnail', 'description',
                'total_turnover', 'rent', 'established_year', 'premises', 'years_of_work', 'operation_concept',
                'operation_opening_hours', 'turnover_last_year', 'salary_percentage', 'other_operating_cost',
                'cost', 'reason_for_sale', 'website_link', 'number_of_employes', 'area', 'term_of_lease',
                'document', 'details', 'service', 'operations', 'market_initatives', 'advantage_and_oppurtunity',
                'valuation', 'owner_name', 'phone', 'telephone', 'email', 'company', 'public_order','country',
                'avaiable_attachment', 'location', 'latitude', 'longitude', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
            )
            for bp in business_props:
                bp.update({
                    'filter_price': bp['cost'],
                    'type': "BusinessSale",
                    'filter_date': bp['start_date'],
                    'is_favourite': bp['id'] in business_fav_ids
                })
                allData.append(bp)

            # House Wanted for Rent with date filtering
            house_rent_query = HouseWantedForRent.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                house_rent_query = house_rent_query.filter(start_date__date__range=date_range)
                
            house_rent_props = house_rent_query.values(
                'id', 'short_title', 'image', 'first_name', 'last_name', 'gender', 'dob', 'nationality',
                'phone_number', 'email', 'quantity', 'rental_period', 'max_rent', 'from_date', 'housing_type',
                'number_of_people', 'max_month_price', 'desired_start_date', 'desired_area', 'latitude',
                'longitude', 'location', 'about', 'education', 'martial_status', 'cleanliness',
                'party_habits', 'work', 'interest', 'subscription_type', 'is_draft', 'start_date',
                'country', 'state', 'city', 'postal_code', 'landmark', 'floor', 'description', 'is_featured','customerId__profileImage'
            )
            for hr in house_rent_props:
                hr.update({
                    'filter_price': hr['max_month_price'],
                    'type': "HouseRent",
                    'filter_date': hr['start_date'],
                    'is_favourite': hr['id'] in house_rent_fav_ids
                })
                allData.append(hr)

            # Investment Projects with date filtering
            invest_projects_query = InvestmentMyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                invest_projects_query = invest_projects_query.filter(created_at__date__range=date_range)
                
            invest_projects = invest_projects_query.values(
                'id', 'property_name', 'image_data', 'videos', 'documents_data', 'property_type',
                'assest_equality', 'investment_highlight', 'equity_price', 'lp_equity_percent', 'gp_equity_percent',
                'debt_percent', 'property_at_glance_title', 'description', 'bussiness_plan', 'minimum_investment',
                'investment_strategy', 'expected_attitude_price', 'financed', 'target_return_on_cost', 'target_irr',
                'offered_by', 'estimated_first_distribution', 'type_of_investment', 'phone_number',
                'measure_for_multiplier', 'address', 'location_details', 'location', 'latitude', 'longitude',
                'subscription_type', 'status', 'is_draft','customerId__profileImage','start_date'
            )
            for ip in invest_projects:
                ip.update({
                    'filter_price': ip['equity_price'],
                    'type': "InvestmentProject",
                    'filter_date': ip['start_date'],
                    'is_favourite': ip['id'] in invest_proj_fav_ids
                })
                allData.append(ip)

            # Investment Companies with date filtering
            invest_companies_query = InvestmentMyCompany.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                invest_companies_query = invest_companies_query.filter(start_date__date__range=date_range)
                
            invest_companies = invest_companies_query.values(
                'id', 'property_name', 'company_logo', 'description', 'the_valuation', 'nominal_share_price',
                'subscription_type', 'start_date','customerId__profileImage'
            )
            for ic in invest_companies:
                ic.update({
                    'filter_price': ic['nominal_share_price'],
                    'type': "InvestmentCompany",
                    'filter_date': ic['start_date'],
                    'is_favourite': ic['id'] in invest_comp_fav_ids
                })
                allData.append(ic)

            property_projects_query = PropertyProject.objects.filter(end_date__isnull=True, status=1).exclude(customerId=customerObj)
            if date_range:
                property_projects_query = property_projects_query.filter(start_date__date__range=date_range)
                
            property_projects = property_projects_query.values(
                'id', 'short_title', 'property_overview', 'property_description', 'image_data', 'videos',
                'property_document', 'category', 'property_name', 'property_dimension', 'country', 'state', 'city',
                'postal_code', 'landmark', 'house_number', 'location', 'latitude', 'longitude', 'facility',
                'benefits', 'return_on_investment', 'finder_fee', 'gross_income', 'price', 'cashflow_pcm',
                'total_termination_fee', 'purchase_price', 'potential_cashflow_pcm', 'investment_finder_fee',
                'investment_return_on_investment_fee', 'rental', 'the_vision', 'cost_to_consider', 'capital_required',
                'cashflow_forecast', 'subscription_type', 'start_date', 'is_featured','customerId__profileImage'
            )
            for pp in property_projects:
                pp.update({
                    'filter_price': pp['price'],
                    'type': "PropertyProject",
                    'filter_date': pp['start_date'],
                    'is_favourite': pp['id'] in property_proj_fav_ids
                })
                allData.append(pp)


            # Filtering
            if filter_data:
                if selected_type:
                    allData = [d for d in allData if d['type'] == selected_type]
                if country:
                    allData = [d for d in allData if d['country'] == country]
                if countries:
                    country_list = [c.strip() for c in countries.split(',')]
                    allData = [d for d in allData if d['country'] in country_list]
                if subscription_tyre:
                    allData = [d for d in allData if d['subscription_type'] == int(subscription_tyre)]    
                if min_price and max_price:
                    allData = [d for d in allData if int(min_price) <= int(d['filter_price']) <= int(max_price)]
                if latitude and longitude:
                    allData = [d for d in allData if str(d['latitude']) == latitude and str(d['longitude']) == longitude]
                if search_data:
                    allData = [d for d in allData if search_data.lower() in d.get('title', '').lower() or search_data.lower() in d.get('short_title', '').lower()]
                if date_filter:
                    allData = [d for d in allData if d.get('filter_date') and d['filter_date'].split('T')[0] == today]
                if bedroom:
                    allData = [d for d in allData if d.get('bedrooms') is not None and int(d.get('bedrooms')) <= int(bedroom)]
                if bathroom:
                    allData = [d for d in allData if d.get('bathrooms') is not None and int(d.get('bathrooms')) <= int(bathroom)]
                if price_high_to_low:
                    allData = sorted(allData, key=lambda x: x.get('filter_price', 0), reverse=True)
                if price_low_to_high:
                    allData = sorted(allData, key=lambda x: x.get('filter_price', 0))
                if published_newest_to_oldest:
                    allData = sorted(allData, key=lambda x: x.get('filter_date'), reverse=True)
                if published_oldest_to_newest:
                    allData = sorted(allData, key=lambda x: x.get('filter_date'))
                allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', False), -x.get('subscription_type', 0)))
            else:
                if selected_type:
                    allData = [d for d in allData if d['type'] == selected_type]
                random.shuffle(allData)
                allData = sorted(allData, key=lambda x: (not x.get('is_ad_featured', False), -x.get('subscription_type', 0)))

            # Static content
            how_Data = list(HowItWorks.objects.filter(end_date__isnull=True).values('id', 'step_number', 'icon', 'title', 'description'))
            category_data = list(CategoriesContent.objects.filter(end_date__isnull=True).values('id', 'image', 'title', 'description'))
            services_data = list(ServicesContent.objects.filter(end_date__isnull=True).values('id', 'title', 'description'))
            testimonials = list(Testimonials.objects.filter(end_date__isnull=True).values('id', 'title', 'description', 'ratings', 'name', 'designation'))
            how_it_work_obj = ContentPagesAdmin.objects.filter(page_type_name="How_it_work").first()
            about_us_obj = ContentPagesAdmin.objects.filter(page_type_name="About_us").first()

            how_page = {
                'id': how_it_work_obj.id if how_it_work_obj else None,
                'page_type_name': how_it_work_obj.page_type_name if how_it_work_obj else '',
                'page_title': how_it_work_obj.page_title if how_it_work_obj else '',
                'page_content': how_it_work_obj.page_content if how_it_work_obj else '',
            }

            about_page = {
                'id': about_us_obj.id if about_us_obj else None,
                'page_type_name': about_us_obj.page_type_name if about_us_obj else '',
                'page_title': about_us_obj.page_title if about_us_obj else '',
                'page_content': about_us_obj.page_content if about_us_obj else '',
            }

            # Apply simple pagination
            page = int(request.GET.get('page', 1))
            page_size = int(request.GET.get('page_size', 10))
            paginator = Paginator(allData, page_size)
            paginated_data = paginator.get_page(page)

            return Response({
                'status_code': status.HTTP_200_OK,
                'message': 'Success',
                'total_items': paginator.count,
                'total_pages': paginator.num_pages, 
                'current_page': paginated_data.number,
                'data': list(paginated_data),
                'how_it_work': how_Data,
                'about_us': about_page,
                'category_data': category_data,
                'services': services_data,
                'testimonials': testimonials,
                'how_page': how_page
            }, status=status.HTTP_200_OK)

        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 homepageMobile(APIView):
    def get(self,request):
        # try:
            try:
                token = get_authorization_header(request)
                if token:
                    decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                    user_id = decoded['user_id']
                    customerObj=Customer.objects.filter(user=user_id).first()
                else:
                    customerObj= 0
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            saleProperty = SaleProperty.objects.filter(end_date__isnull = True,status = 1).order_by('-id')[:2]
            rentProperty = RentProperty.objects.filter(end_date__isnull = True,status = 1).order_by('-id')[:2]
            bussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,status = 1).order_by('-id')[:2]
            houseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,status = 1).order_by('-id')[:2]
            investmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,status = 1).order_by('-id')[:2]
            investmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,status = 1).order_by('-id')[:2]
            propertyProject = PropertyProject.objects.filter(end_date__isnull = True,status = 1).order_by('-id')[:2]
            how_obj =  HowItWorks.objects.filter(end_date__isnull = True)
            companySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True).order_by('-id')[:2]
            propertyDeveloper =  PropertyDevelopers.objects.filter(end_date__isnull = True).order_by('-id')[:2]

            allData= []
            if propertyDeveloper:
                for pd in propertyDeveloper:
                    if pd.status == 0:
                        status_info = "Pending"
                    elif pd.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                        allData.append({
                            'id': pd.id,
                            'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
                            'customer_id' : pd.customerId.id,
                            'customer_phone_number' : pd.customerId.phoneNumber,
                            'customer_images' : pd.customerId.profileImage,
                            'image_data': ast.literal_eval(pd.property_image),
                            'videos': pd.videos,
                            'videos_thumbnail': pd.videos_thumbnail,
                            'document': pd.document,
                            'property_name':pd.property_name,
                               'property_type': pd.property_type,
                            'assest_equality': pd.assest_equality,
                            'investment_highlight': pd.investment_highlight,
                            'equity_price': pd.equity_price,
                            'lp_equity_percent': pd.lp_equity_percent,
                            'gp_equity_percent': pd.gp_equity_percent,
                            'debt_percent': pd.debt_percent,
                            'short_title': pd.short_title,
                            'description': pd.description,
                            'bussiness_plan': pd.bussiness_plan,
                            'minimum_investment': pd.minimum_investment,
                            'investment_strategy': pd.investment_strategy,
                            'expected_period': pd.expected_period,
                            'financed': pd.financed,
                            'target_return_on_cost': pd.target_return_on_cost,
                            'target_irr': pd.target_irr,
                            'offered_by': pd.offered_by,
                            'estimated_first_distribution': pd.estimated_first_distribution,
                            'type_of_investment': pd.type_of_investment,
                            'phone_number': pd.phone_number,
                            'measure_of_multiplier': pd.measure_of_multiplier,
                            'address': pd.address,
                            'minimum_goal': pd.minimum_goal,

                            'nominal_share_price': pd.nominal_share_price,
                            'the_valuation': pd.the_valuation,
                            'minimum_drawing': pd.minimum_drawing,

                            'no_of_drawings': pd.no_of_drawings,
                            'share_for_sale': pd.share_for_sale,
                            'remaining_share': pd.remaining_share,
                            'maximum_drawing': pd.maximum_drawing,
                            'short_description': pd.short_description,
                            'why_invest': pd.why_invest,
                            'problem_to_be_solved': pd.problem_to_be_solved,
                            'our_solution': pd.our_solution,
                            'start_date_data': pd.start_date_data,
                            'end_date_data': pd.end_date_data,
                            'number_of_share': pd.number_of_share,
                            'issue_minimum_investment': pd.issue_minimum_investment,
                            'issue_maximum_investment': pd.issue_maximum_investment,
                            'value_before_issue': pd.value_before_issue,
                            'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
                            'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
                            'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
                            'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
                            'self_report': pd.self_report,
                            'discussion_description': pd.discussion_description,
                            'new_exisiting_details': pd.new_exisiting_details,
                            'drawing_on_behalf': pd.drawing_on_behalf,
                            'foundation': pd.foundation,
                            'satutes': pd.satutes,
                            'annual_account': pd.annual_account,
                            'valuation': pd.valuation,
                            'agreement_on_co': pd.agreement_on_co,
                            'conversion_of_debt': pd.conversion_of_debt,
                            'balance_sheet': pd.balance_sheet,
                            'result_report': pd.result_report,
                            'location': pd.location,
                            'country': pd.country,
                            'state': pd.state,
                            'city': pd.city,
                            'zip_code': pd.postal_code,
                            'landmark': pd.landmark,
                            'latitude': pd.latitude,
                            'longitude': pd.longitude,
                            'status': pd.status,
                            'agency': pd.agency.id if pd.agency else None,
                            'subscription_type': pd.subscription_type,
                            'start_date': pd.start_date,
                            'end_date': pd.end_date,
                            'status':status_info,
                              'is_ad_featured':pd.is_featured,
                            'type':"property_developers",
                    })
            if companySeeking:
                for cs in companySeeking:
                    favourite_obj = CompanySeekingEquityFavourite.objects.filter(company_seek=cs.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if cs.status == 0:
                        status_info = "Pending"
                    elif cs.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': cs.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'company_name': cs.company_name,
                        'short_title': cs.short_title,
                        'description': cs.description,
                        'about_the_owner': cs.about_the_owner,
                        'image_data': ast.literal_eval(cs.property_image) if cs.property_image else None,
                        'videos': cs.property_video,
                        'videos_thumbnail': cs.videos_thumbnail,
                        'company_logo': cs.company_logo,
                        'maximum_drawing': cs.maximum_drawing,
                        'minimum_drawing': cs.minimum_drawing,
                        'share_for_sale': cs.share_for_sale,
                        'price_per_share': cs.price_per_share,
                        'filter_price': cs.price_per_share,
                        'number_of_share': cs.number_of_share,
                        'self_report': cs.self_report,
                        'nominal_share_price': cs.nominal_share_price,
                        'e_post': cs.e_post,
                        'issue_account_number': cs.issue_account_number,
                        'establish_year': cs.establish_year,
                        'premises_from': cs.premises_from,
                        'background_for_sale': cs.background_for_sale,
                        'company_website': cs.company_website,
                        'number_of_employee': cs.number_of_employee,
                        'company_email': cs.company_email,
                        'company_telephone': cs.company_telephone,
                        'youtube': cs.youtube,
                        'upload_team_data': cs.upload_team_data,
                        'upload_team_name': cs.upload_team_name,
                        'upload_team_size': cs.upload_team_size,
      
                        'upload_board_data': cs.upload_board_data,
                        'upload_board_name': cs.upload_board_name,
                        'upload_board_size': cs.upload_board_size,
      
                        'upload_partner_data': cs.upload_partner_data,
                        'upload_partner_name': cs.upload_partner_name,
                        'upload_partner_size': cs.upload_partner_size,
                        'location': cs.location,
                        'country': cs.country,
                        'state': cs.state,
                        'city': cs.city,
                        'zip_code': cs.zip_code,
                        'landmark': cs.landmark,
                        'share_holder_image': cs.share_holder_image,
                        'enter_shares': cs.enter_shares,
                        'status': cs.status,
                        'agency': cs.agency.id if cs.agency else None,
                        'subscription_type': cs.subscription_type,
                        'latitude': cs.latitude,
                        'longitude': cs.longitude,
                        'start_date': cs.start_date,
                        'end_date': cs.end_date,
                        'is_favourite': favourite,
                        # 'favourite_date': cs.favourite_date,
                        # 'is_favourite':favourite,
                        'is_ad_featured':cs.is_featured,
                        'status':status_info,
                        'type':"companySeeking"
                    })
            if saleProperty:
                

                for salelist in saleProperty:
                    favourite_obj = SalePropertyFavourite.objects.filter(sale=salelist.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if salelist.status == 0:
                        status_info = "Pending"
                    elif salelist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':salelist.id,
                        'property_name':salelist.property_name,
                        'title':salelist.title,
                        'image_data':ast.literal_eval(salelist.image_data),
                        'price':salelist.price,
                        'descriptioon':salelist.descriptioon,
                        'latitude':salelist.latitude,
                        'longitude':salelist.longitude,
                        'location':salelist.location,
                        'property_demension':salelist.property_demension,
                        'filter_price':salelist.price,
                        'bedrooms':salelist.bedrooms,
                        'bathrooms':salelist.bathrooms,
                        'created_date':salelist.created_at,
                        'location':salelist.location,
                        'created_date':salelist.created_at,
                        'type':"SaleProperty",
                        'city':salelist.city,
                        'country':salelist.country,
                          'is_ad_featured':salelist.is_featured,
                        'is_favourite':favourite,
                        'status':status_info,
                    }
                    allData.append(alldata)
            if rentProperty:
                for rentlist in rentProperty:
                    favourite_obj = RentPropertyFavourite.objects.filter(rent=rentlist.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if rentlist.status == 0:
                        status_info = "Pending"
                    elif rentlist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':rentlist.id,
                        'title':rentlist.title,
                        'image_data':ast.literal_eval(rentlist.image_data),
                        'video':rentlist.video,
                        'rooms':rentlist.rooms,
                        'bedrooms':rentlist.bedrooms,
                        'size':rentlist.size,
                        'country': rentlist.country,
                        'state': rentlist.state,
                        'city': rentlist.city,
                        'postal_code':rentlist.postal_code,
                        'landmark': rentlist.landmark,
                        'house_number': rentlist.house_number,
                        'filter_price':rentlist.monthly_rent,
                        'rental_period':rentlist.rental_period,
                        'heading':rentlist.heading,
                        'monthly_rent':rentlist.monthly_rent,
                        'name_of_ad':rentlist.name_of_ad,
                        'visibilty':rentlist.visibilty,
                        'location':rentlist.location,
                        'latitude':rentlist.latitude,
                        'longitude':rentlist.longitude,
                        'type':"RentProperty",
                          'is_ad_featured':rentlist.is_featured,
                          'is_favourite':favourite,
                        'status':status_info,
                    }
                    allData.append(alldata)
            if bussinessSale:
                for bs in bussinessSale:
                    favourite_obj = BussinessForSaleFavourite.objects.filter(bussiness=bs.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    allData.append({
                        'id': bs.id,
                        'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
                        'company_name': bs.company_name,
                        'short_title': bs.short_title,
                        'image_data':  ast.literal_eval(bs.image_data),
                        'videos': bs.videos,
                        'videos_thumbnail': bs.videos_thumbnail,
                        'company_name': bs.company_name,
                        'description': bs.description,
                        'total_turnover': bs.total_turnover,
                        'rent': bs.rent,
                        'established_year': bs.established_year,
                        'premises': bs.premises,
                        'years_of_work': bs.years_of_work,
                        'operation_concept': bs.operation_concept,
                        'operation_opening_hours': bs.operation_opening_hours,
                        'turnover_last_year': bs.turnover_last_year,
                        'salary_percentage': bs.salary_percentage,
                        'other_operating_cost': bs.other_operating_cost,
                          'filter_price':bs.cost,
                        'cost': bs.cost,
                        'reason_for_sale':bs.reason_for_sale,
                        'website_link':bs.website_link,
                        'number_of_employes':bs.number_of_employes,
                        'other_operating_cost':bs.other_operating_cost,
                        'area':bs.area,
                        'term_of_lease': bs.term_of_lease,
                        'document':ast.literal_eval(bs.document),
                        'details': bs.details,
                        'service':bs.service,
                        'operations':bs.operations,
                        'market_initatives':bs.market_initatives,
                        'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
                        'valuation':bs.valuation,
                        'owner_name':bs.owner_name,
                        'phone':bs.phone,
                        'telephone':bs.telephone,
                        'email':bs.email,
                        'company':bs.company,
                        'public_order':bs.public_order,
                        'avaiable_attachment':bs.avaiable_attachment,
                        'location':bs.location,
                        'latitude':bs.latitude,
                        'longitude':bs.longitude,    
                        'city':bs.city,    
                        'country':bs.country,    
                        'subscription_type':bs.subscription_type,
                        'created_date':bs.start_date,
                        'is_ad_featured':bs.is_featured,
                        'is_favourite':favourite,
                        'type':"BusinessSale"})
            if houseWantedRent:
                for hWr in houseWantedRent:
                    favourite_obj = HouseRentFavourite.objects.filter(house_rent=hWr.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if hWr.status == 0:
                        status_info = "Pending"
                    elif hWr.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': hWr.id,
                        'short_title':hWr.short_title,
                        'customer_id':hWr.customerId.id,
                        'fullname': hWr.first_name+' '+ hWr.last_name,
                        'profile_visiblity':hWr.profile_visiblity,
                        'profile_hidden':hWr.profile_hidden,
                        'image_data': ast.literal_eval(hWr.image),
                        'first_name': hWr.first_name,
                        'last_name': hWr.last_name,
                        'gender': hWr.gender,
                        'dob': hWr.dob,
                        'nationality': hWr.nationality,
                        'phone_number':hWr.phone_number,
                        'email': hWr.email,
                        'quantity': hWr.quantity,
                        'rental_period': hWr.rental_period,
                        'max_rent': hWr.max_rent,
                        'from_date': hWr.from_date,
                        'housing_type':hWr.housing_type,
                        'number_of_people':hWr.number_of_people,
                          'filter_price':hWr.max_month_price,
                        'max_month_price': hWr.max_month_price,
                        'desired_start_date':hWr.desired_start_date,
                        'desired_area': hWr.desired_area,
                        'latitude':hWr.latitude,
                        'longitude':hWr.longitude,
                        'location':hWr.location,
                        'about':hWr.about,
                        'education':hWr.education,
                        'martial_status':hWr.martial_status,
                        'cleanliness':hWr.cleanliness,
                        'party_habits':hWr.party_habits,
                        'work':hWr.work,
                        'interest':hWr.interest,
                        'subscription_type':hWr.subscription_type,
                        'is_draft':hWr.is_draft,
                        'created_date':hWr.start_date,
                        'status':status_info,
                        'country':hWr.country,
                        'state':hWr.state,
                        'city':hWr.city,
                        'postal_code':hWr.postal_code,
                        'landmark':hWr.landmark,
                        'floor':hWr.floor,
                        'description':hWr.description,
                        'is_favourite':favourite,
                        'is_ad_featured':hWr.is_featured,
                        'type':"HouseRent"})
            if investmentProject:
                for ip in investmentProject:
                    favourite_obj = InvestmentMyProjectFavourite.objects.filter(invest_project=ip.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    allData.append({'id':ip.id,
                        'customer_id':ip.customerId.id,
                        'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
                        'property_name':ip.property_name,
                        'image_data':ast.literal_eval(ip.image_data),
                        'videos':ip.videos,
                        'documents_data':ip.documents_data,
                        'property_type':ip.property_type,
                        'assest_equality':ip.assest_equality,
                        'investment_highlight':ip.investment_highlight,
                        'filter_price':ip.equity_price,
                        'equity_price':ip.equity_price,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'gp_equity_percent':ip.gp_equity_percent,
                        'debt_percent':ip.debt_percent,
                        'property_at_glance_title':ip.property_at_glance_title,
                        'description':ip.description,
                        'bussiness_plan':ip.bussiness_plan,
                        'minimum_investment':ip.minimum_investment,
                        'investment_strategy':ip.investment_strategy,
                        'expected_attitude_price':ip.expected_attitude_price,
                        'financed':ip.financed,
                        'target_return_on_cost':ip.target_return_on_cost,
                        'target_irr':ip.target_irr,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'offered_by':ip.offered_by,
                        'estimated_first_distribution':ip.estimated_first_distribution,
                        'type_of_investment':ip.type_of_investment,
                        'phone_number':ip.phone_number,
                        'measure_for_multiplier':ip.measure_for_multiplier,
                        'address':ip.address,
                        'location_details':ip.location_details,
                        # 'property_summary':ip.property_summary,
                        # 'property_details':ip.property_details,
                        # 'overview':ip.overview,
                        # 'debt_assumption':ip.debt_assumption,
                        'location':ip.location,
                        'latitude':ip.latitude,
                        'longitude':ip.longitude,
                        'status':ip.status,
                        'is_favourite':favourite,
                        'type':"InvestmentProject"})
            if investmentCompany:
                for ic in investmentCompany:
                    favourite_obj = InvestmentMyCompanyFavourite.objects.filter(invest_company=ic.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    allData.append({'id':ic.id,
                         'title':ic.property_name,
                        'company_name':ic.property_name,
                        'image_data':ic.company_logo,
                        'description':ic.description,
                        'the_valuation':ic.the_valuation,
                        'nomial_share_price':ic.nominal_share_price,
                        'filter_price':ic.nominal_share_price,
                        'created_date':ic.start_date,
                        'is_favourite':favourite,
                        'type':"InvestmentCompany"})
            if propertyProject:
                for pp in propertyProject:
                    favourite_obj = PropertyProjectFavourite.objects.filter(property=pp.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if pp.status == 0:
                        status_info = "Pending"
                    elif pp.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                          'id': pp.id,
                        'customer_id':pp.customerId.id,
                        'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
                        'spend_too_much_time':pp.spend_too_much_time,
                        'most_useless_skill':pp.most_useless_skill,
                        'fun_act':pp.fun_act,
                        'biography':pp.biography,
                        'short_title':pp.short_title,
                        'property_name':pp.property_name,
                        'property_overview':pp.property_overview,
                        'property_description':pp.property_description,
                        'image_data':ast.literal_eval(pp.image_data),
                        'videos':pp.videos,
                        'property_document':pp.property_document,
                        'category':pp.category,
                        'property_name':pp.property_name,
                        'property_dimension':pp.property_dimension,
                        'country':pp.country,
                        'state':pp.state,
                        'city':pp.city,
                        'postal_code':pp.postal_code,
                        'landmark':pp.landmark,
                        'house_number':pp.house_number,
                        'location':pp.location,
                        'latitude':pp.latitude,
                        'longitude':pp.longitude,
                        'facility':pp.facility,
                        'benefits':pp.benefits,
                        'return_on_investment':pp.return_on_investment,
                        'finder_fee':pp.finder_fee,
                        'gross_income':pp.gross_income,
                        'price':pp.price,
                        'cashflow_pcm':pp.cashflow_pcm,
                        'total_termination_fee':pp.total_termination_fee,
                        'purchase_price':pp.purchase_price,
                        'potential_cashflow_pcm':pp.potential_cashflow_pcm,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
                        'rental':pp.rental,
                        'the_vision':pp.the_vision,
                        'cost_to_consider':pp.cost_to_consider,
                        'capital_required':pp.capital_required,
                        'cashflow_forecast':pp.cashflow_forecast,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'is_draft':pp.is_draft,
                          'filter_price':pp.price,
                           'created_date':pp.start_date,
                        'subscription_type':pp.subscription_type,
                        'status':status_info,
                          'is_ad_featured':pp.is_featured,
                        'is_favourite':favourite,
                           'type':"PropertyProject"
                        })

            saleProperty = SaleProperty.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            rentProperty = RentProperty.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            bussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            houseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            investmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            investmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            propertyProject = PropertyProject.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            how_obj =  HowItWorks.objects.filter(end_date__isnull = True)
            companySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True).order_by('-id')
            propertyDeveloper =  PropertyDevelopers.objects.filter(end_date__isnull = True).order_by('-id')

            total_allData= []
            if propertyDeveloper:
                for pd in propertyDeveloper:
                    if pd.status == 0:
                        status_info = "Pending"
                    elif pd.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                        total_allData.append({
                            'id': pd.id,
                            'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
                            'customer_id' : pd.customerId.id,
                            'customer_phone_number' : pd.customerId.phoneNumber,
                            'customer_images' : pd.customerId.profileImage,
                            'image_data': ast.literal_eval(pd.property_image),
                            'videos': pd.videos,
                            'videos_thumbnail': pd.videos_thumbnail,
                            'document': pd.document,
                            'property_name':pd.property_name,
                               'property_type': pd.property_type,
                            'assest_equality': pd.assest_equality,
                            'investment_highlight': pd.investment_highlight,
                            'equity_price': pd.equity_price,
                            'lp_equity_percent': pd.lp_equity_percent,
                            'gp_equity_percent': pd.gp_equity_percent,
                            'debt_percent': pd.debt_percent,
                            'short_title': pd.short_title,
                            'description': pd.description,
                            'bussiness_plan': pd.bussiness_plan,
                            'minimum_investment': pd.minimum_investment,
                            'investment_strategy': pd.investment_strategy,
                            'expected_period': pd.expected_period,
                            'financed': pd.financed,
                            'target_return_on_cost': pd.target_return_on_cost,
                            'target_irr': pd.target_irr,
                            'offered_by': pd.offered_by,
                            'estimated_first_distribution': pd.estimated_first_distribution,
                            'type_of_investment': pd.type_of_investment,
                            'phone_number': pd.phone_number,
                            'measure_of_multiplier': pd.measure_of_multiplier,
                            'address': pd.address,
                            'minimum_goal': pd.minimum_goal,

                            'nominal_share_price': pd.nominal_share_price,
                            'the_valuation': pd.the_valuation,
                            'minimum_drawing': pd.minimum_drawing,

                            'no_of_drawings': pd.no_of_drawings,
                            'share_for_sale': pd.share_for_sale,
                            'remaining_share': pd.remaining_share,
                            'maximum_drawing': pd.maximum_drawing,
                            'short_description': pd.short_description,
                            'why_invest': pd.why_invest,
                            'problem_to_be_solved': pd.problem_to_be_solved,
                            'our_solution': pd.our_solution,
                            'start_date_data': pd.start_date_data,
                            'end_date_data': pd.end_date_data,
                            'number_of_share': pd.number_of_share,
                            'issue_minimum_investment': pd.issue_minimum_investment,
                            'issue_maximum_investment': pd.issue_maximum_investment,
                            'value_before_issue': pd.value_before_issue,
                            'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
                            'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
                            'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
                            'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
                            'self_report': pd.self_report,
                            'discussion_description': pd.discussion_description,
                            'new_exisiting_details': pd.new_exisiting_details,
                            'drawing_on_behalf': pd.drawing_on_behalf,
                            'foundation': pd.foundation,
                            'satutes': pd.satutes,
                            'annual_account': pd.annual_account,
                            'valuation': pd.valuation,
                            'agreement_on_co': pd.agreement_on_co,
                            'conversion_of_debt': pd.conversion_of_debt,
                            'balance_sheet': pd.balance_sheet,
                            'result_report': pd.result_report,
                            'location': pd.location,
                            'country': pd.country,
                            'state': pd.state,
                            'city': pd.city,
                            'zip_code': pd.postal_code,
                            'landmark': pd.landmark,
                            'latitude': pd.latitude,
                            'longitude': pd.longitude,
                            'status': pd.status,
                            'agency': pd.agency.id if pd.agency else None,
                            'subscription_type': pd.subscription_type,
                            'start_date': pd.start_date,
                            'end_date': pd.end_date,
                            'status':status_info,
                              'is_ad_featured':pd.is_featured,
                            'type':"property_developers",
                    })
            if companySeeking:
                for cs in companySeeking:
                    favourite_obj = CompanySeekingEquityFavourite.objects.filter(company_seek=cs.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if cs.status == 0:
                        status_info = "Pending"
                    elif cs.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    total_allData.append({
                        'id': cs.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'company_name': cs.company_name,
                        'short_title': cs.short_title,
                        'description': cs.description,
                        'about_the_owner': cs.about_the_owner,
                        'image_data': ast.literal_eval(cs.property_image) if cs.property_image else None,
                        'videos': cs.property_video,
                        'videos_thumbnail': cs.videos_thumbnail,
                        'company_logo': cs.company_logo,
                        'maximum_drawing': cs.maximum_drawing,
                        'minimum_drawing': cs.minimum_drawing,
                        'share_for_sale': cs.share_for_sale,
                        'price_per_share': cs.price_per_share,
                        'filter_price': cs.price_per_share,
                        'number_of_share': cs.number_of_share,
                        'self_report': cs.self_report,
                        'nominal_share_price': cs.nominal_share_price,
                        'e_post': cs.e_post,
                        'issue_account_number': cs.issue_account_number,
                        'establish_year': cs.establish_year,
                        'premises_from': cs.premises_from,
                        'background_for_sale': cs.background_for_sale,
                        'company_website': cs.company_website,
                        'number_of_employee': cs.number_of_employee,
                        'company_email': cs.company_email,
                        'company_telephone': cs.company_telephone,
                        'youtube': cs.youtube,
                        'upload_team_data': cs.upload_team_data,
                        'upload_team_name': cs.upload_team_name,
                        'upload_team_size': cs.upload_team_size,
      
                        'upload_board_data': cs.upload_board_data,
                        'upload_board_name': cs.upload_board_name,
                        'upload_board_size': cs.upload_board_size,
      
                        'upload_partner_data': cs.upload_partner_data,
                        'upload_partner_name': cs.upload_partner_name,
                        'upload_partner_size': cs.upload_partner_size,
                        'location': cs.location,
                        'country': cs.country,
                        'state': cs.state,
                        'city': cs.city,
                        'zip_code': cs.zip_code,
                        'landmark': cs.landmark,
                        'share_holder_image': cs.share_holder_image,
                        'enter_shares': cs.enter_shares,
                        'status': cs.status,
                        'agency': cs.agency.id if cs.agency else None,
                        'subscription_type': cs.subscription_type,
                        'latitude': cs.latitude,
                        'longitude': cs.longitude,
                        'start_date': cs.start_date,
                        'end_date': cs.end_date,
                        'is_favourite': favourite,
                        # 'favourite_date': cs.favourite_date,
                        # 'is_favourite':favourite,
                        'is_ad_featured':cs.is_featured,
                        'status':status_info,
                        'type':"companySeeking"
                    })
            if saleProperty:
                

                for salelist in saleProperty:
                    favourite_obj = SalePropertyFavourite.objects.filter(sale=salelist.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if salelist.status == 0:
                        status_info = "Pending"
                    elif salelist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':salelist.id,
                        'property_name':salelist.property_name,
                        'title':salelist.title,
                        'image_data' : ast.literal_eval(salelist.image_data) if salelist.image_data else [],
                        'price':salelist.price,
                        'descriptioon':salelist.descriptioon,
                        'latitude':salelist.latitude,
                        'longitude':salelist.longitude,
                        'location':salelist.location,
                        'property_demension':salelist.property_demension,
                        'filter_price':salelist.price,
                        'bedrooms':salelist.bedrooms,
                        'bathrooms':salelist.bathrooms,
                        'created_date':salelist.created_at,
                        'location':salelist.location,
                        'created_date':salelist.created_at,
                        'type':"SaleProperty",
                        'city':salelist.city,
                        'country':salelist.country,
                          'is_ad_featured':salelist.is_featured,
                        'is_favourite':favourite,
                        'status':status_info,
                    }
                    total_allData.append(alldata)
            if rentProperty:
                for rentlist in rentProperty:
                    favourite_obj = RentPropertyFavourite.objects.filter(rent=rentlist.id,customerId=customerObj).first()
                    if favourite_obj:
                        favourite = True
                    else:
                        favourite = False
                    if rentlist.status == 0:
                        status_info = "Pending"
                    elif rentlist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':rentlist.id,
                        'title':rentlist.title,
                        'image_data':ast.literal_eval(rentlist.image_data),
                        'video':rentlist.video,
                        'rooms':rentlist.rooms,
                        'bedrooms':rentlist.bedrooms,
                        'size':rentlist.size,
                        'country': rentlist.country,
                        'state': rentlist.state,
                        'city': rentlist.city,
                        'postal_code':rentlist.postal_code,
                        'landmark': rentlist.landmark,
                        'house_number': rentlist.house_number,
                        'filter_price':rentlist.monthly_rent,
                        'rental_period':rentlist.rental_period,
                        'heading':rentlist.heading,
                        'monthly_rent':rentlist.monthly_rent,
                        'name_of_ad':rentlist.name_of_ad,
                        'visibilty':rentlist.visibilty,
                        'location':rentlist.location,
                        'latitude':rentlist.latitude,
                        'longitude':rentlist.longitude,
                        'type':"RentProperty",
                          'is_ad_featured':rentlist.is_featured,
                          'is_favourite':favourite,
                        'status':status_info,
                    }
                    total_allData.append(alldata)
            if bussinessSale:
                for bs in bussinessSale:
                    allData.append({
                        'id': bs.id,
                        'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
                        'company_name': bs.company_name,
                        'short_title': bs.short_title,
                        'image_data':  ast.literal_eval(bs.image_data),
                        'videos': bs.videos,
                        'videos_thumbnail': bs.videos_thumbnail,
                        'company_name': bs.company_name,
                        'description': bs.description,
                        'total_turnover': bs.total_turnover,
                        'rent': bs.rent,
                        'established_year': bs.established_year,
                        'premises': bs.premises,
                        'years_of_work': bs.years_of_work,
                        'operation_concept': bs.operation_concept,
                        'operation_opening_hours': bs.operation_opening_hours,
                        'turnover_last_year': bs.turnover_last_year,
                        'salary_percentage': bs.salary_percentage,
                        'other_operating_cost': bs.other_operating_cost,
                          'filter_price':bs.cost,
                        'cost': bs.cost,
                        'reason_for_sale':bs.reason_for_sale,
                        'website_link':bs.website_link,
                        'number_of_employes':bs.number_of_employes,
                        'other_operating_cost':bs.other_operating_cost,
                        'area':bs.area,
                        'term_of_lease': bs.term_of_lease,
                        'document':ast.literal_eval(bs.document),
                        'details': bs.details,
                        'service':bs.service,
                        'operations':bs.operations,
                        'market_initatives':bs.market_initatives,
                        'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
                        'valuation':bs.valuation,
                        'owner_name':bs.owner_name,
                        'phone':bs.phone,
                        'telephone':bs.telephone,
                        'email':bs.email,
                        'company':bs.company,
                        'public_order':bs.public_order,
                        'avaiable_attachment':bs.avaiable_attachment,
                        'location':bs.location,
                        'latitude':bs.latitude,
                        'longitude':bs.longitude,    
                        'city':bs.city,    
                        'country':bs.country,    
                        'subscription_type':bs.subscription_type,
                        'created_date':bs.start_date,
                        'is_ad_featured':bs.is_featured,
                        'type':"BusinessSale"})
            if houseWantedRent:
                for hWr in houseWantedRent:
                    if hWr.status == 0:
                        status_info = "Pending"
                    elif hWr.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    total_allData.append({
                        'id': hWr.id,
                        'short_title':hWr.short_title,
                        'customer_id':hWr.customerId.id,
                        'fullname': hWr.first_name+' '+ hWr.last_name,
                        'profile_visiblity':hWr.profile_visiblity,
                        'profile_hidden':hWr.profile_hidden,
                        'image_data': ast.literal_eval(hWr.image),
                        'first_name': hWr.first_name,
                        'last_name': hWr.last_name,
                        'gender': hWr.gender,
                        'dob': hWr.dob,
                        'nationality': hWr.nationality,
                        'phone_number':hWr.phone_number,
                        'email': hWr.email,
                        'quantity': hWr.quantity,
                        'rental_period': hWr.rental_period,
                        'max_rent': hWr.max_rent,
                        'from_date': hWr.from_date,
                        'housing_type':hWr.housing_type,
                        'number_of_people':hWr.number_of_people,
                          'filter_price':hWr.max_month_price,
                        'max_month_price': hWr.max_month_price,
                        'desired_start_date':hWr.desired_start_date,
                        'desired_area': hWr.desired_area,
                        'latitude':hWr.latitude,
                        'longitude':hWr.longitude,
                        'location':hWr.location,
                        'about':hWr.about,
                        'education':hWr.education,
                        'martial_status':hWr.martial_status,
                        'cleanliness':hWr.cleanliness,
                        'party_habits':hWr.party_habits,
                        'work':hWr.work,
                        'interest':hWr.interest,
                        'subscription_type':hWr.subscription_type,
                        'is_draft':hWr.is_draft,
                        'created_date':hWr.start_date,
                        'status':status_info,
                        'country':hWr.country,
                        'state':hWr.state,
                        'city':hWr.city,
                        'postal_code':hWr.postal_code,
                        'landmark':hWr.landmark,
                        'floor':hWr.floor,
                        'description':hWr.description,
                        'is_ad_featured':hWr.is_featured,
                        'type':"HouseRent"})
            if investmentProject:
                for ip in investmentProject:
                    
                    total_allData.append({'id':ip.id,
                        'customer_id':ip.customerId.id,
                        'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
                        'property_name':ip.property_name,
                        'image_data':ast.literal_eval(ip.image_data),
                        'videos':ip.videos,
                        'documents_data':ip.documents_data,
                        'property_type':ip.property_type,
                        'assest_equality':ip.assest_equality,
                        'investment_highlight':ip.investment_highlight,
                        'filter_price':ip.equity_price,
                        'equity_price':ip.equity_price,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'gp_equity_percent':ip.gp_equity_percent,
                        'debt_percent':ip.debt_percent,
                        'property_at_glance_title':ip.property_at_glance_title,
                        'description':ip.description,
                        'bussiness_plan':ip.bussiness_plan,
                        'minimum_investment':ip.minimum_investment,
                        'investment_strategy':ip.investment_strategy,
                        'expected_attitude_price':ip.expected_attitude_price,
                        'financed':ip.financed,
                        'target_return_on_cost':ip.target_return_on_cost,
                        'target_irr':ip.target_irr,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'offered_by':ip.offered_by,
                        'estimated_first_distribution':ip.estimated_first_distribution,
                        'type_of_investment':ip.type_of_investment,
                        'phone_number':ip.phone_number,
                        'measure_for_multiplier':ip.measure_for_multiplier,
                        'address':ip.address,
                        'location_details':ip.location_details,
                        # 'property_summary':ip.property_summary,
                        # 'property_details':ip.property_details,
                        # 'overview':ip.overview,
                        # 'debt_assumption':ip.debt_assumption,
                        'location':ip.location,
                        'latitude':ip.latitude,
                        'longitude':ip.longitude,
                        'status':ip.status,
                        'type':"InvestmentProject"})
            if investmentCompany:
                for ic in investmentCompany:
                    total_allData.append({'id':ic.id,
                         'title':ic.property_name,
                        'company_name':ic.property_name,
                        'image_data':ic.company_logo,
                        'description':ic.description,
                        'the_valuation':ic.the_valuation,
                        'nomial_share_price':ic.nominal_share_price,
                        'filter_price':ic.nominal_share_price,
                        'created_date':ic.start_date,
                        'type':"InvestmentCompany"})
            if propertyProject:
                for pp in propertyProject:
                    if pp.status == 0:
                        status_info = "Pending"
                    elif pp.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    total_allData.append({
                          'id': pp.id,
                        'customer_id':pp.customerId.id,
                        'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
                        'spend_too_much_time':pp.spend_too_much_time,
                        'most_useless_skill':pp.most_useless_skill,
                        'fun_act':pp.fun_act,
                        'biography':pp.biography,
                        'short_title':pp.short_title,
                        'property_name':pp.property_name,
                        'property_overview':pp.property_overview,
                        'property_description':pp.property_description,
                        'image_data':ast.literal_eval(pp.image_data),
                        'videos':pp.videos,
                        'property_document':pp.property_document,
                        'category':pp.category,
                        'property_name':pp.property_name,
                        'property_dimension':pp.property_dimension,
                        'country':pp.country,
                        'state':pp.state,
                        'city':pp.city,
                        'postal_code':pp.postal_code,
                        'landmark':pp.landmark,
                        'house_number':pp.house_number,
                        'location':pp.location,
                        'latitude':pp.latitude,
                        'longitude':pp.longitude,
                        'facility':pp.facility,
                        'benefits':pp.benefits,
                        'return_on_investment':pp.return_on_investment,
                        'finder_fee':pp.finder_fee,
                        'gross_income':pp.gross_income,
                        'price':pp.price,
                        'cashflow_pcm':pp.cashflow_pcm,
                        'total_termination_fee':pp.total_termination_fee,
                        'purchase_price':pp.purchase_price,
                        'potential_cashflow_pcm':pp.potential_cashflow_pcm,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
                        'rental':pp.rental,
                        'the_vision':pp.the_vision,
                        'cost_to_consider':pp.cost_to_consider,
                        'capital_required':pp.capital_required,
                        'cashflow_forecast':pp.cashflow_forecast,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'is_draft':pp.is_draft,
                          'filter_price':pp.price,
                           'created_date':pp.start_date,
                        'subscription_type':pp.subscription_type,
                        'status':status_info,
                          'is_ad_featured':pp.is_featured,
                           'type':"PropertyProject"
                        })
            
            
   
            mysaleProperty = SaleProperty.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj).order_by('-id')[:2]
            myrentProperty = RentProperty.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj).order_by('-id')[:2]
            mybussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj ).order_by('-id')[:2]
            myhouseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj).order_by('-id')[:2]
            myinvestmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj).order_by('-id')[:2]
            myinvestmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj).order_by('-id')[:2]
            mypropertyProject = PropertyProject.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj).order_by('-id')[:2]
            mycompanySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True,customerId = customerObj).order_by('-id')[:2]
            mypropertyDeveloper =  PropertyDevelopers.objects.filter(end_date__isnull = True,customerId = customerObj).order_by('-id')[:2]

            myallData= []
            if mypropertyDeveloper:
                for pd in mypropertyDeveloper:
                    if pd.status == 0:
                        status_info = "Pending"
                    elif pd.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                        myallData.append({
                            'id': pd.id,
                            'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
                            'customer_id' : pd.customerId.id,
                            'customer_phone_number' : pd.customerId.phoneNumber,
                            'customer_images' : pd.customerId.profileImage,
                            'image_data': ast.literal_eval(pd.property_image),
                            'videos': pd.videos,
                            'videos_thumbnail': pd.videos_thumbnail,
                            'document': pd.document,
                            'property_name':pd.property_name,
                               'property_type': pd.property_type,
                            'assest_equality': pd.assest_equality,
                            'investment_highlight': pd.investment_highlight,
                            'equity_price': pd.equity_price,
                            'lp_equity_percent': pd.lp_equity_percent,
                            'gp_equity_percent': pd.gp_equity_percent,
                            'debt_percent': pd.debt_percent,
                            'short_title': pd.short_title,
                            'description': pd.description,
                            'bussiness_plan': pd.bussiness_plan,
                            'minimum_investment': pd.minimum_investment,
                            'investment_strategy': pd.investment_strategy,
                            'expected_period': pd.expected_period,
                            'financed': pd.financed,
                            'target_return_on_cost': pd.target_return_on_cost,
                            'target_irr': pd.target_irr,
                            'offered_by': pd.offered_by,
                            'estimated_first_distribution': pd.estimated_first_distribution,
                            'type_of_investment': pd.type_of_investment,
                            'phone_number': pd.phone_number,
                            'measure_of_multiplier': pd.measure_of_multiplier,
                            'address': pd.address,
                            'minimum_goal': pd.minimum_goal,

                            'nominal_share_price': pd.nominal_share_price,
                            'the_valuation': pd.the_valuation,
                            'minimum_drawing': pd.minimum_drawing,

                            'no_of_drawings': pd.no_of_drawings,
                            'share_for_sale': pd.share_for_sale,
                            'remaining_share': pd.remaining_share,
                            'maximum_drawing': pd.maximum_drawing,
                            'short_description': pd.short_description,
                            'why_invest': pd.why_invest,
                            'problem_to_be_solved': pd.problem_to_be_solved,
                            'our_solution': pd.our_solution,
                            'start_date_data': pd.start_date_data,
                            'end_date_data': pd.end_date_data,
                            'number_of_share': pd.number_of_share,
                            'issue_minimum_investment': pd.issue_minimum_investment,
                            'issue_maximum_investment': pd.issue_maximum_investment,
                            'value_before_issue': pd.value_before_issue,
                            'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
                            'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
                            'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
                            'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
                            'self_report': pd.self_report,
                            'discussion_description': pd.discussion_description,
                            'new_exisiting_details': pd.new_exisiting_details,
                            'drawing_on_behalf': pd.drawing_on_behalf,
                            'foundation': pd.foundation,
                            'satutes': pd.satutes,
                            'annual_account': pd.annual_account,
                            'valuation': pd.valuation,
                            'agreement_on_co': pd.agreement_on_co,
                            'conversion_of_debt': pd.conversion_of_debt,
                            'balance_sheet': pd.balance_sheet,
                            'result_report': pd.result_report,
                            'location': pd.location,
                            'country': pd.country,
                            'state': pd.state,
                            'city': pd.city,
                            'zip_code': pd.postal_code,
                            'landmark': pd.landmark,
                            'latitude': pd.latitude,
                            'longitude': pd.longitude,
                            'status': pd.status,
                            'agency': pd.agency.id if pd.agency else None,
                            'subscription_type': pd.subscription_type,
                            'start_date': pd.start_date,
                            'end_date': pd.end_date,
                            'status':status_info,
                              'is_ad_featured':pd.is_featured,
                            'type':"property_developers",
                    })
            if mycompanySeeking:
                for cs in mycompanySeeking:
                    if cs.status == 0:
                        status_info = "Pending"
                    elif cs.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    myallData.append({
                        'id': cs.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'company_name': cs.company_name,
                        'short_title': cs.short_title,
                        'description': cs.description,
                        'about_the_owner': cs.about_the_owner,
                        'image_data': ast.literal_eval(cs.property_image),
                        'videos': cs.property_video,
                        'videos_thumbnail': cs.videos_thumbnail,
                        'company_logo': cs.company_logo,
                        'maximum_drawing': cs.maximum_drawing,
                        'minimum_drawing': cs.minimum_drawing,
                        'share_for_sale': cs.share_for_sale,
                        'price_per_share': cs.price_per_share,
                        'filter_price': cs.price_per_share,
                        'number_of_share': cs.number_of_share,
                        'self_report': cs.self_report,
                        'nominal_share_price': cs.nominal_share_price,
                        'e_post': cs.e_post,
                        'issue_account_number': cs.issue_account_number,
                        'establish_year': cs.establish_year,
                        'premises_from': cs.premises_from,
                        'background_for_sale': cs.background_for_sale,
                        'company_website': cs.company_website,
                        'number_of_employee': cs.number_of_employee,
                        'company_email': cs.company_email,
                        'company_telephone': cs.company_telephone,
                        'youtube': cs.youtube,
                        'upload_team_data': cs.upload_team_data,
                        'upload_team_name': cs.upload_team_name,
                        'upload_team_size': cs.upload_team_size,
      
                        'upload_board_data': cs.upload_board_data,
                        'upload_board_name': cs.upload_board_name,
                        'upload_board_size': cs.upload_board_size,
      
                        'upload_partner_data': cs.upload_partner_data,
                        'upload_partner_name': cs.upload_partner_name,
                        'upload_partner_size': cs.upload_partner_size,
                        'location': cs.location,
                        'country': cs.country,
                        'state': cs.state,
                        'city': cs.city,
                        'zip_code': cs.zip_code,
                        'landmark': cs.landmark,
                        'share_holder_image': cs.share_holder_image,
                        'enter_shares': cs.enter_shares,
                        'status': cs.status,
                        'agency': cs.agency.id if cs.agency else None,
                        'subscription_type': cs.subscription_type,
                        'latitude': cs.latitude,
                        'longitude': cs.longitude,
                        'start_date': cs.start_date,
                        'end_date': cs.end_date,
                        # 'is_favourite': cs.is_favourite,
                        # 'favourite_date': cs.favourite_date,
                        # 'is_favourite':favourite,
                        'is_ad_featured':cs.is_featured,
                        'status':status_info,
                        'type':"companySeeking"
                    })
            if mysaleProperty:

                for salelist in mysaleProperty:
                    if salelist.status == 0:
                        status_info = "Pending"
                    elif salelist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':salelist.id,
                        'title':salelist.title,
                        'image_data':ast.literal_eval(salelist.image_data),
                        'price':salelist.price,
                        'property_name':salelist.property_name,
                        'descriptioon':salelist.descriptioon,
                        'latitude':salelist.latitude,
                        'longitude':salelist.longitude,
                        'location':salelist.location,
                        'property_demension':salelist.property_demension,
                        'filter_price':salelist.price,
                        'bedrooms':salelist.bedrooms,
                        'bathrooms':salelist.bathrooms,
                        'created_date':salelist.created_at,
                        'location':salelist.location,
                        'created_date':salelist.created_at,
                        'city':salelist.city,
                        'country':salelist.country,
                        'type':"SaleProperty",
                          'is_ad_featured':salelist.is_featured,
                        'status':status_info,
                    }
                    myallData.append(alldata)
            if myrentProperty:
                for rentlist in myrentProperty:
                    if rentlist.status == 0:
                        status_info = "Pending"
                    elif rentlist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':rentlist.id,
                        'title':rentlist.title,
                        'image_data':ast.literal_eval(rentlist.image_data),
                        'video':rentlist.video,
                        'rooms':rentlist.rooms,
                        'bedrooms':rentlist.bedrooms,
                        'size':rentlist.size,
                        'country': rentlist.country,
                        'state': rentlist.state,
                        'city': rentlist.city,
                        'postal_code':rentlist.postal_code,
                        'landmark': rentlist.landmark,
                        'house_number': rentlist.house_number,
                        'filter_price':rentlist.monthly_rent,
                        'rental_period':rentlist.rental_period,
                        'heading':rentlist.heading,
                        'name_of_ad':rentlist.name_of_ad,
                        'visibilty':rentlist.visibilty,
                        'location':rentlist.location,
                        'latitude':rentlist.latitude,
                        'longitude':rentlist.longitude,
                        'type':"RentProperty",
                          'is_ad_featured':rentlist.is_featured,
                        'status':status_info,
                    }
                    myallData.append(alldata)
            if mybussinessSale:
                for bs in mybussinessSale:
                    myallData.append({
                        'id': bs.id,
                        'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
                        'company_name': bs.company_name,
                        'short_title': bs.short_title,
                        'image_data':  ast.literal_eval(bs.image_data),
                        'videos': bs.videos,
                        'videos_thumbnail': bs.videos_thumbnail,
                        'company_name': bs.company_name,
                        'description': bs.description,
                        'total_turnover': bs.total_turnover,
                        'rent': bs.rent,
                        'established_year': bs.established_year,
                        'premises': bs.premises,
                        'years_of_work': bs.years_of_work,
                        'operation_concept': bs.operation_concept,
                        'operation_opening_hours': bs.operation_opening_hours,
                        'turnover_last_year': bs.turnover_last_year,
                        'salary_percentage': bs.salary_percentage,
                        'other_operating_cost': bs.other_operating_cost,
                          'filter_price':bs.cost,
                        'cost': bs.cost,
                        'reason_for_sale':bs.reason_for_sale,
                        'website_link':bs.website_link,
                        'number_of_employes':bs.number_of_employes,
                        'other_operating_cost':bs.other_operating_cost,
                        'area':bs.area,
                        'term_of_lease': bs.term_of_lease,
                        'document':ast.literal_eval(bs.document),
                        'details': bs.details,
                        'service':bs.service,
                        'operations':bs.operations,
                        'market_initatives':bs.market_initatives,
                        'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
                        'valuation':bs.valuation,
                        'owner_name':bs.owner_name,
                        'phone':bs.phone,
                        'telephone':bs.telephone,
                        'email':bs.email,
                        'company':bs.company,
                        'public_order':bs.public_order,
                        'avaiable_attachment':bs.avaiable_attachment,
                        'location':bs.location,
                        'latitude':bs.latitude,
                        'longitude':bs.longitude,    
                        'subscription_type':bs.subscription_type,
                        'created_date':bs.start_date,
                        'is_ad_featured':bs.is_featured,
                        'type':"BusinessSale"})
            if myhouseWantedRent:
                for hWr in myhouseWantedRent:
                    if hWr.status == 0:
                        status_info = "Pending"
                    elif hWr.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    myallData.append({
                        'id': hWr.id,
                        'short_title':hWr.short_title,
                        'customer_id':hWr.customerId.id,
                        'fullname': hWr.first_name+' '+ hWr.last_name,
                        'profile_visiblity':hWr.profile_visiblity,
                        'profile_hidden':hWr.profile_hidden,
                        'image_data': ast.literal_eval(hWr.image),
                        'first_name': hWr.first_name,
                        'last_name': hWr.last_name,
                        'gender': hWr.gender,
                        'dob': hWr.dob,
                        'nationality': hWr.nationality,
                        'phone_number':hWr.phone_number,
                        'email': hWr.email,
                        'quantity': hWr.quantity,
                        'rental_period': hWr.rental_period,
                        'max_rent': hWr.max_rent,
                        'from_date': hWr.from_date,
                        'housing_type':hWr.housing_type,
                        'number_of_people':hWr.number_of_people,
                          'filter_price':hWr.max_month_price,
                        'max_month_price': hWr.max_month_price,
                        'desired_start_date':hWr.desired_start_date,
                        'desired_area': hWr.desired_area,
                        'latitude':hWr.latitude,
                        'longitude':hWr.longitude,
                        'location':hWr.location,
                        'about':hWr.about,
                        'education':hWr.education,
                        'martial_status':hWr.martial_status,
                        'cleanliness':hWr.cleanliness,
                        'party_habits':hWr.party_habits,
                        'work':hWr.work,
                        'interest':hWr.interest,
                        'subscription_type':hWr.subscription_type,
                        'is_draft':hWr.is_draft,
                        'created_date':hWr.start_date,
                        'status':status_info,
                        'country':hWr.country,
                        'state':hWr.state,
                        'city':hWr.city,
                        'postal_code':hWr.postal_code,
                        'landmark':hWr.landmark,
                        'floor':hWr.floor,
                        'description':hWr.description,
                        'is_ad_featured':hWr.is_featured,
                        'type':"HouseRent"})
            if myinvestmentProject:
                for ip in myinvestmentProject:
                    
                    myallData.append({'id':ip.id,
                        'customer_id':ip.customerId.id,
                        'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
                        'property_name':ip.property_name,
                        'image_data':ast.literal_eval(ip.image_data),
                        'videos':ip.videos,
                        'documents_data':ip.documents_data,
                        'property_type':ip.property_type,
                        'assest_equality':ip.assest_equality,
                        'investment_highlight':ip.investment_highlight,
                        'filter_price':ip.equity_price,
                        'equity_price':ip.equity_price,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'gp_equity_percent':ip.gp_equity_percent,
                        'debt_percent':ip.debt_percent,
                        'property_at_glance_title':ip.property_at_glance_title,
                        'description':ip.description,
                        'bussiness_plan':ip.bussiness_plan,
                        'minimum_investment':ip.minimum_investment,
                        'investment_strategy':ip.investment_strategy,
                        'expected_attitude_price':ip.expected_attitude_price,
                        'financed':ip.financed,
                        'target_return_on_cost':ip.target_return_on_cost,
                        'target_irr':ip.target_irr,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'offered_by':ip.offered_by,
                        'estimated_first_distribution':ip.estimated_first_distribution,
                        'type_of_investment':ip.type_of_investment,
                        'phone_number':ip.phone_number,
                        'measure_for_multiplier':ip.measure_for_multiplier,
                        'address':ip.address,
                        'location_details':ip.location_details,
                        # 'property_summary':ip.property_summary,
                        # 'property_details':ip.property_details,
                        # 'overview':ip.overview,
                        # 'debt_assumption':ip.debt_assumption,
                        'location':ip.location,
                        'latitude':ip.latitude,
                        'longitude':ip.longitude,
                        'status':ip.status,
                        'type':"InvestmentProject"})
            if myinvestmentCompany:
                for ic in myinvestmentCompany:
                    myallData.append({'id':ic.id,
                         'title':ic.property_name,
                        'company_name':ic.property_name,
                        'image_data':ic.company_logo,
                        'description':ic.description,
                        'the_valuation':ic.the_valuation,
                        'nomial_share_price':ic.nominal_share_price,
                        'filter_price':ic.nominal_share_price,
                        'created_date':ic.start_date,
                        'type':"InvestmentCompany"})
            if mypropertyProject:
                for pp in mypropertyProject:
                    if pp.status == 0:
                        status_info = "Pending"
                    elif pp.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    myallData.append({
                          'id': pp.id,
                        'customer_id':pp.customerId.id,
                        'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
                        'spend_too_much_time':pp.spend_too_much_time,
                        'most_useless_skill':pp.most_useless_skill,
                        'fun_act':pp.fun_act,
                        'biography':pp.biography,
                        'short_title':pp.short_title,
                        'property_overview':pp.property_overview,
                        'property_description':pp.property_description,
                        'image_data':ast.literal_eval(pp.image_data),
                        'videos':pp.videos,
                        'property_document':pp.property_document,
                        'category':pp.category,
                        'property_name':pp.property_name,
                        'property_dimension':pp.property_dimension,
                        'country':pp.country,
                        'state':pp.state,
                        'city':pp.city,
                        'postal_code':pp.postal_code,
                        'landmark':pp.landmark,
                        'house_number':pp.house_number,
                        'location':pp.location,
                        'latitude':pp.latitude,
                        'longitude':pp.longitude,
                        'facility':pp.facility,
                        'benefits':pp.benefits,
                        'return_on_investment':pp.return_on_investment,
                        'finder_fee':pp.finder_fee,
                        'gross_income':pp.gross_income,
                        'price':pp.price,
                        'cashflow_pcm':pp.cashflow_pcm,
                        'total_termination_fee':pp.total_termination_fee,
                        'purchase_price':pp.purchase_price,
                        'potential_cashflow_pcm':pp.potential_cashflow_pcm,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
                        'rental':pp.rental,
                        'the_vision':pp.the_vision,
                        'cost_to_consider':pp.cost_to_consider,
                        'capital_required':pp.capital_required,
                        'cashflow_forecast':pp.cashflow_forecast,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'is_draft':pp.is_draft,
                          'filter_price':pp.price,
                           'created_date':pp.start_date,
                        'subscription_type':pp.subscription_type,
                        'status':status_info,
                          'is_ad_featured':pp.is_featured,
                           'type':"PropertyProject"
                        })
            
            
            
            mysaleProperty = SaleProperty.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            myrentProperty = RentProperty.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            mybussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id ).order_by('-id')
            myhouseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            myinvestmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            myinvestmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            mypropertyProject = PropertyProject.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            mycompanySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True,customerId = customerObj.id).order_by('-id')
            mypropertyDeveloper =  PropertyDevelopers.objects.filter(end_date__isnull = True,customerId = customerObj.id).order_by('-id')

            totalmyallData= []
            
            if mypropertyDeveloper:
                for pd in mypropertyDeveloper:
                    if pd.status == 0:
                        status_info = "Pending"
                    elif pd.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                        totalmyallData.append({
                            'id': pd.id,
                            'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
                            'customer_id' : pd.customerId.id,
                            'customer_phone_number' : pd.customerId.phoneNumber,
                            'customer_images' : pd.customerId.profileImage,
                            'image_data': ast.literal_eval(pd.property_image),
                            'videos': pd.videos,
                            'videos_thumbnail': pd.videos_thumbnail,
                            'document': pd.document,
                            'property_name':pd.property_name,
                               'property_type': pd.property_type,
                            'assest_equality': pd.assest_equality,
                            'investment_highlight': pd.investment_highlight,
                            'equity_price': pd.equity_price,
                            'lp_equity_percent': pd.lp_equity_percent,
                            'gp_equity_percent': pd.gp_equity_percent,
                            'debt_percent': pd.debt_percent,
                            'short_title': pd.short_title,
                            'description': pd.description,
                            'bussiness_plan': pd.bussiness_plan,
                            'minimum_investment': pd.minimum_investment,
                            'investment_strategy': pd.investment_strategy,
                            'expected_period': pd.expected_period,
                            'financed': pd.financed,
                            'target_return_on_cost': pd.target_return_on_cost,
                            'target_irr': pd.target_irr,
                            'offered_by': pd.offered_by,
                            'estimated_first_distribution': pd.estimated_first_distribution,
                            'type_of_investment': pd.type_of_investment,
                            'phone_number': pd.phone_number,
                            'measure_of_multiplier': pd.measure_of_multiplier,
                            'address': pd.address,
                            'minimum_goal': pd.minimum_goal,

                            'nominal_share_price': pd.nominal_share_price,
                            'the_valuation': pd.the_valuation,
                            'minimum_drawing': pd.minimum_drawing,

                            'no_of_drawings': pd.no_of_drawings,
                            'share_for_sale': pd.share_for_sale,
                            'remaining_share': pd.remaining_share,
                            'maximum_drawing': pd.maximum_drawing,
                            'short_description': pd.short_description,
                            'why_invest': pd.why_invest,
                            'problem_to_be_solved': pd.problem_to_be_solved,
                            'our_solution': pd.our_solution,
                            'start_date_data': pd.start_date_data,
                            'end_date_data': pd.end_date_data,
                            'number_of_share': pd.number_of_share,
                            'issue_minimum_investment': pd.issue_minimum_investment,
                            'issue_maximum_investment': pd.issue_maximum_investment,
                            'value_before_issue': pd.value_before_issue,
                            'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
                            'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
                            'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
                            'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
                            'self_report': pd.self_report,
                            'discussion_description': pd.discussion_description,
                            'new_exisiting_details': pd.new_exisiting_details,
                            'drawing_on_behalf': pd.drawing_on_behalf,
                            'foundation': pd.foundation,
                            'satutes': pd.satutes,
                            'annual_account': pd.annual_account,
                            'valuation': pd.valuation,
                            'agreement_on_co': pd.agreement_on_co,
                            'conversion_of_debt': pd.conversion_of_debt,
                            'balance_sheet': pd.balance_sheet,
                            'result_report': pd.result_report,
                            'location': pd.location,
                            'country': pd.country,
                            'state': pd.state,
                            'city': pd.city,
                            'zip_code': pd.postal_code,
                            'landmark': pd.landmark,
                            'latitude': pd.latitude,
                            'longitude': pd.longitude,
                            'status': pd.status,
                            'agency': pd.agency.id if pd.agency else None,
                            'subscription_type': pd.subscription_type,
                            'start_date': pd.start_date,
                            'end_date': pd.end_date,
                            'status':status_info,
                              'is_ad_featured':pd.is_featured,
                            'type':"property_developers",
                    })
            if mycompanySeeking:
                for cs in mycompanySeeking:
                    if cs.status == 0:
                        status_info = "Pending"
                    elif cs.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    totalmyallData.append({
                        'id': cs.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'company_name': cs.company_name,
                        'short_title': cs.short_title,
                        'description': cs.description,
                        'about_the_owner': cs.about_the_owner,
                        'image_data': ast.literal_eval(cs.property_image),
                        'videos': cs.property_video,
                        'videos_thumbnail': cs.videos_thumbnail,
                        'company_logo': cs.company_logo,
                        'maximum_drawing': cs.maximum_drawing,
                        'minimum_drawing': cs.minimum_drawing,
                        'share_for_sale': cs.share_for_sale,
                        'price_per_share': cs.price_per_share,
                        'filter_price': cs.price_per_share,
                        'number_of_share': cs.number_of_share,
                        'self_report': cs.self_report,
                        'nominal_share_price': cs.nominal_share_price,
                        'e_post': cs.e_post,
                        'issue_account_number': cs.issue_account_number,
                        'establish_year': cs.establish_year,
                        'premises_from': cs.premises_from,
                        'background_for_sale': cs.background_for_sale,
                        'company_website': cs.company_website,
                        'number_of_employee': cs.number_of_employee,
                        'company_email': cs.company_email,
                        'company_telephone': cs.company_telephone,
                        'youtube': cs.youtube,
                        'upload_team_data': cs.upload_team_data,
                        'upload_team_name': cs.upload_team_name,
                        'upload_team_size': cs.upload_team_size,
      
                        'upload_board_data': cs.upload_board_data,
                        'upload_board_name': cs.upload_board_name,
                        'upload_board_size': cs.upload_board_size,
      
                        'upload_partner_data': cs.upload_partner_data,
                        'upload_partner_name': cs.upload_partner_name,
                        'upload_partner_size': cs.upload_partner_size,
                        'location': cs.location,
                        'country': cs.country,
                        'state': cs.state,
                        'city': cs.city,
                        'zip_code': cs.zip_code,
                        'landmark': cs.landmark,
                        'share_holder_image': cs.share_holder_image,
                        'enter_shares': cs.enter_shares,
                        'status': cs.status,
                        'agency': cs.agency.id if cs.agency else None,
                        'subscription_type': cs.subscription_type,
                        'latitude': cs.latitude,
                        'longitude': cs.longitude,
                        'start_date': cs.start_date,
                        'end_date': cs.end_date,
                        # 'is_favourite': cs.is_favourite,
                        # 'favourite_date': cs.favourite_date,
                        # 'is_favourite':favourite,
                        'is_ad_featured':cs.is_featured,
                        'status':status_info,
                        'type':"companySeeking"
                    })
            if mysaleProperty:

                for salelist in mysaleProperty:
                    if salelist.status == 0:
                        status_info = "Pending"
                    elif salelist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':salelist.id,
                        'title':salelist.title,
                        'image_data':ast.literal_eval(salelist.image_data),
                        'price':salelist.price,
                        'descriptioon':salelist.descriptioon,
                        'latitude':salelist.latitude,
                        'longitude':salelist.longitude,
                        'location':salelist.location,
                        'property_demension':salelist.property_demension,
                        'filter_price':salelist.price,
                        'bedrooms':salelist.bedrooms,
                        'bathrooms':salelist.bathrooms,
                        'created_date':salelist.created_at,
                        'location':salelist.location,
                        'created_date':salelist.created_at,
                        'type':"SaleProperty",
                          'is_ad_featured':salelist.is_featured,
                        'status':status_info,
                    }
                    totalmyallData.append(alldata)
            if myrentProperty:
                for rentlist in myrentProperty:
                    if rentlist.status == 0:
                        status_info = "Pending"
                    elif rentlist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':rentlist.id,
                        'title':rentlist.title,
                        'image_data':ast.literal_eval(rentlist.image_data),
                        'video':rentlist.video,
                        'rooms':rentlist.rooms,
                        'bedrooms':rentlist.bedrooms,
                        'size':rentlist.size,
                        'country': rentlist.country,
                        'state': rentlist.state,
                        'city': rentlist.city,
                        'postal_code':rentlist.postal_code,
                        'landmark': rentlist.landmark,
                        'house_number': rentlist.house_number,
                        'filter_price':rentlist.monthly_rent,
                        'rental_period':rentlist.rental_period,
                        'heading':rentlist.heading,
                        'name_of_ad':rentlist.name_of_ad,
                        'visibilty':rentlist.visibilty,
                        'location':rentlist.location,
                        'latitude':rentlist.latitude,
                        'longitude':rentlist.longitude,
                        'type':"RentProperty",
                          'is_ad_featured':rentlist.is_featured,
                        'status':status_info,
                    }
                    totalmyallData.append(alldata)
            if mybussinessSale:
                for bs in mybussinessSale:
                    totalmyallData.append({
                        'id': bs.id,
                        'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
                        'company_name': bs.company_name,
                        'short_title': bs.short_title,
                        'image_data':  ast.literal_eval(bs.image_data),
                        'videos': bs.videos,
                        'videos_thumbnail': bs.videos_thumbnail,
                        'company_name': bs.company_name,
                        'description': bs.description,
                        'total_turnover': bs.total_turnover,
                        'rent': bs.rent,
                        'established_year': bs.established_year,
                        'premises': bs.premises,
                        'years_of_work': bs.years_of_work,
                        'operation_concept': bs.operation_concept,
                        'operation_opening_hours': bs.operation_opening_hours,
                        'turnover_last_year': bs.turnover_last_year,
                        'salary_percentage': bs.salary_percentage,
                        'other_operating_cost': bs.other_operating_cost,
                          'filter_price':bs.cost,
                        'cost': bs.cost,
                        'reason_for_sale':bs.reason_for_sale,
                        'website_link':bs.website_link,
                        'number_of_employes':bs.number_of_employes,
                        'other_operating_cost':bs.other_operating_cost,
                        'area':bs.area,
                        'term_of_lease': bs.term_of_lease,
                        'document':ast.literal_eval(bs.document),
                        'details': bs.details,
                        'service':bs.service,
                        'operations':bs.operations,
                        'market_initatives':bs.market_initatives,
                        'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
                        'valuation':bs.valuation,
                        'owner_name':bs.owner_name,
                        'phone':bs.phone,
                        'telephone':bs.telephone,
                        'email':bs.email,
                        'company':bs.company,
                        'public_order':bs.public_order,
                        'avaiable_attachment':bs.avaiable_attachment,
                        'location':bs.location,
                        'latitude':bs.latitude,
                        'longitude':bs.longitude,    
                        'subscription_type':bs.subscription_type,
                        'created_date':bs.start_date,
                        'is_ad_featured':bs.is_featured,
                        'type':"BusinessSale"})
            if myhouseWantedRent:
                for hWr in myhouseWantedRent:
                    if hWr.status == 0:
                        status_info = "Pending"
                    elif hWr.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    totalmyallData.append({
                        'id': hWr.id,
                        'short_title':hWr.short_title,
                        'customer_id':hWr.customerId.id,
                        'fullname': hWr.first_name+' '+ hWr.last_name,
                        'profile_visiblity':hWr.profile_visiblity,
                        'profile_hidden':hWr.profile_hidden,
                        'image_data': ast.literal_eval(hWr.image),
                        'first_name': hWr.first_name,
                        'last_name': hWr.last_name,
                        'gender': hWr.gender,
                        'dob': hWr.dob,
                        'nationality': hWr.nationality,
                        'phone_number':hWr.phone_number,
                        'email': hWr.email,
                        'quantity': hWr.quantity,
                        'rental_period': hWr.rental_period,
                        'max_rent': hWr.max_rent,
                        'from_date': hWr.from_date,
                        'housing_type':hWr.housing_type,
                        'number_of_people':hWr.number_of_people,
                          'filter_price':hWr.max_month_price,
                        'max_month_price': hWr.max_month_price,
                        'desired_start_date':hWr.desired_start_date,
                        'desired_area': hWr.desired_area,
                        'latitude':hWr.latitude,
                        'longitude':hWr.longitude,
                        'location':hWr.location,
                        'about':hWr.about,
                        'education':hWr.education,
                        'martial_status':hWr.martial_status,
                        'cleanliness':hWr.cleanliness,
                        'party_habits':hWr.party_habits,
                        'work':hWr.work,
                        'interest':hWr.interest,
                        'subscription_type':hWr.subscription_type,
                        'is_draft':hWr.is_draft,
                        'created_date':hWr.start_date,
                        'status':status_info,
                        'country':hWr.country,
                        'state':hWr.state,
                        'city':hWr.city,
                        'postal_code':hWr.postal_code,
                        'landmark':hWr.landmark,
                        'floor':hWr.floor,
                        'description':hWr.description,
                        'is_ad_featured':hWr.is_featured,
                        'type':"HouseRent"})
            if myinvestmentProject:
                for ip in myinvestmentProject:
                    
                    totalmyallData.append({'id':ip.id,
                        'customer_id':ip.customerId.id,
                        'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
                        'property_name':ip.property_name,
                        'image_data':ast.literal_eval(ip.image_data),
                        'videos':ip.videos,
                        'documents_data':ip.documents_data,
                        'property_type':ip.property_type,
                        'assest_equality':ip.assest_equality,
                        'investment_highlight':ip.investment_highlight,
                        'filter_price':ip.equity_price,
                        'equity_price':ip.equity_price,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'gp_equity_percent':ip.gp_equity_percent,
                        'debt_percent':ip.debt_percent,
                        'property_at_glance_title':ip.property_at_glance_title,
                        'description':ip.description,
                        'bussiness_plan':ip.bussiness_plan,
                        'minimum_investment':ip.minimum_investment,
                        'investment_strategy':ip.investment_strategy,
                        'expected_attitude_price':ip.expected_attitude_price,
                        'financed':ip.financed,
                        'target_return_on_cost':ip.target_return_on_cost,
                        'target_irr':ip.target_irr,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'offered_by':ip.offered_by,
                        'estimated_first_distribution':ip.estimated_first_distribution,
                        'type_of_investment':ip.type_of_investment,
                        'phone_number':ip.phone_number,
                        'measure_for_multiplier':ip.measure_for_multiplier,
                        'address':ip.address,
                        'location_details':ip.location_details,
                        # 'property_summary':ip.property_summary,
                        # 'property_details':ip.property_details,
                        # 'overview':ip.overview,
                        # 'debt_assumption':ip.debt_assumption,
                        'location':ip.location,
                        'latitude':ip.latitude,
                        'longitude':ip.longitude,
                        'status':ip.status,
                        'type':"InvestmentProject"})
            if myinvestmentCompany:
                for ic in myinvestmentCompany:
                    totalmyallData.append({'id':ic.id,
                         'title':ic.property_name,
                        'company_name':ic.property_name,
                        'image_data':ic.company_logo,
                        'description':ic.description,
                        'the_valuation':ic.the_valuation,
                        'nomial_share_price':ic.nominal_share_price,
                        'filter_price':ic.nominal_share_price,
                        'created_date':ic.start_date,
                        'type':"InvestmentCompany"})
            if mypropertyProject:
                for pp in mypropertyProject:
                    if pp.status == 0:
                        status_info = "Pending"
                    elif pp.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    totalmyallData.append({
                          'id': pp.id,
                        'customer_id':pp.customerId.id,
                        'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
                        'spend_too_much_time':pp.spend_too_much_time,
                        'most_useless_skill':pp.most_useless_skill,
                        'fun_act':pp.fun_act,
                        'biography':pp.biography,
                        'short_title':pp.short_title,
                        'property_overview':pp.property_overview,
                        'property_description':pp.property_description,
                        'image_data':ast.literal_eval(pp.image_data),
                        'videos':pp.videos,
                        'property_document':pp.property_document,
                        'category':pp.category,
                        'property_name':pp.property_name,
                        'property_dimension':pp.property_dimension,
                        'country':pp.country,
                        'state':pp.state,
                        'city':pp.city,
                        'postal_code':pp.postal_code,
                        'landmark':pp.landmark,
                        'house_number':pp.house_number,
                        'location':pp.location,
                        'latitude':pp.latitude,
                        'longitude':pp.longitude,
                        'facility':pp.facility,
                        'benefits':pp.benefits,
                        'return_on_investment':pp.return_on_investment,
                        'finder_fee':pp.finder_fee,
                        'gross_income':pp.gross_income,
                        'price':pp.price,
                        'cashflow_pcm':pp.cashflow_pcm,
                        'total_termination_fee':pp.total_termination_fee,
                        'purchase_price':pp.purchase_price,
                        'potential_cashflow_pcm':pp.potential_cashflow_pcm,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
                        'rental':pp.rental,
                        'the_vision':pp.the_vision,
                        'cost_to_consider':pp.cost_to_consider,
                        'capital_required':pp.capital_required,
                        'cashflow_forecast':pp.cashflow_forecast,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'is_draft':pp.is_draft,
                          'filter_price':pp.price,
                           'created_date':pp.start_date,
                        'subscription_type':pp.subscription_type,
                        'status':status_info,
                          'is_ad_featured':pp.is_featured,
                           'type':"PropertyProject"
                        })
            recently_viewed = []
            viewed_obj =  RecentlyViewed.objects.filter(customer = customerObj.id).order_by('-id')[:100]
            for view in viewed_obj:
                recently_viewed.append({
                        'id': view.id,
                        'title': view.title,
                        'image_data': view.image_data,
                        'price': view.price,
                        'location': view.location,
                        'latitude': view.latitude,
                        'longitude': view.longitude,
                        'property_type': view.property_type,
                    })
            total_recently_viewed = []
            viewed_obj =  RecentlyViewed.objects.filter(customer = customerObj.id).order_by('-id')
            for view in viewed_obj:
                recently_viewed.append({
                        'id': view.id,
                        'title': view.title,
                        'image_data': view.image_data,
                        'price': view.price,
                        'location': view.location,
                        'latitude': view.latitude,
                        'longitude': view.longitude,
                        'property_type': view.property_type,
                    })

            return Response({'status_code':status.HTTP_200_OK,'message':'Success','total_customer_uploaded_properties':len(totalmyallData),'total_recently_added':len(allData),'total_recently_viewed':len(total_recently_viewed),'recently_added':allData,'customer_uploaded_properties':myallData,'recently_viewed':recently_viewed},status=status.HTTP_200_OK)
        # except Exception as e:
        # 	return Response(str(e))


class createConverstationCustomer(APIView):
    def post(self, request):
        try:
            uid = authenticated(request)
        except Exception as e:
            return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
        customerObj=Customer.objects.filter(user=uid).first()
        
        chat_customer = request.data.get('chat_customer')
        if not chat_customer:
            return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'chat_customer is required.'},status= status.HTTP_400_BAD_REQUEST)
        
        chat_customer_obj = Customer.objects.filter(id=chat_customer).first()
        if not chat_customer_obj:
            return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No customer found'},status= status.HTTP_400_BAD_REQUEST)
        existing_conversation = ConversationCustomers.objects.filter(customer_two=chat_customer_obj, customer_one=customerObj).first()
        if existing_conversation:
            print("here")
            twilio_channel_sid = existing_conversation.twilio_channel_sid
        else:
            print("here2")

            concatinate_names= str(chat_customer_obj.firstName) + str(customerObj.firstName) + str(chat_customer_obj.id) + str(customerObj.id) 
            suffle_string = list(concatinate_names)
            random.shuffle(suffle_string)
            conversation_name = ''.join(suffle_string)
            # Create Conversation chat
            conversation = client.conversations \
                    .v1 \
                    .conversations \
                    .create(friendly_name=conversation_name)
            
            conversation_obj = ConversationCustomers.objects.filter(Q(customer_one=customerObj,customer_two=chat_customer_obj) | Q(customer_one = chat_customer_obj,customer_two=customerObj)).first()
            if not conversation_obj:
                conversation_obj = ConversationCustomers.objects.create(customer_one=customerObj,customer_two=chat_customer_obj )
                conversation_obj.twilio_channel_sid = conversation.sid
            conversation_obj.last_message = datetime.now()
            conversation_obj.save()
            user_attributes= {"id":str(customerObj.id),"name":str(customerObj.firstName),
                "image":str(customerObj.profileImage)
            }
            user_json_attributes = json.dumps(user_attributes)

            chat_user_participant = client.conversations \
                .v1 \
                .conversations(conversation.sid) \
                .participants \
                .create(identity=str(customerObj.id),attributes=user_json_attributes)
            
              
            user_two_attributes= {"id":str(chat_customer_obj.id),"name":str(chat_customer_obj.firstName),
                "image":str(chat_customer_obj.profileImage)
            }	
            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_customer_obj.id),attributes=user_two_attributes_json_attributes)
    


            conversation_obj.customer_one_twilio_id = chat_user_participant.sid
            conversation_obj.customer_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,'status_message':'conversation Added successfully','twilio_channel_sid':twilio_channel_sid},status= status.HTTP_200_OK)



        
class createToken(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0

            identity = customerObj.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,'status_message':'Token Added successfully','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 customerConverstationListing(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
                print(customerObj)
            else:
                customerObj= 0
            print('customerObj',customerObj)
            # customer=request.GET.get(cui)
            conversations = ConversationCustomers.objects.filter(
                Q(customer_one=customerObj.id, customer_two__loginUserType='customer') |
                Q(customer_two=customerObj.id, customer_one__loginUserType='customer')
            ).exclude(
                customer_deleted=customerObj
            ).order_by('-id')
            if not conversations:
                print("here")
                # conversations = ConversationAgency.objects.filter(customer = customerObj ).order_by('-id')
                conversations = ConversationAgency.objects.filter(Q(customer=customerObj) |
                Q(agency=customerObj)).order_by('-id')
            print(conversations)
            # if not conversations:
            # 	print("here")
            # 	conversations = ConversationCustomers.objects.filter(customer_two = customerObj.id ).exclude(id=user_id).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,

                    "customer_one_name": (
                        f"{conversation.customer_one.firstName} {conversation.customer_one.lastName}"
                        if hasattr(conversation, "customer_one")
                        else f"{conversation.customer.firstName} {conversation.customer.lastName}"
                    ),
                    "customer_one_image": (
                        conversation.customer_one.profileImage
                        if hasattr(conversation, "customer_one")
                        else conversation.customer.profileImage
                    ),
                    "customer_one_id": (
                        conversation.customer_one.id
                        if hasattr(conversation, "customer_one")
                        else conversation.customer.id
                    ),
                    "customer_one_phone_number": (
                        conversation.customer_one.phoneNumber
                        if hasattr(conversation, "customer_one")
                        else conversation.customer.phoneNumber
                    ),

                    "customer_two_name": (
                        f"{conversation.customer_two.firstName} {conversation.customer_two.lastName}"
                        if hasattr(conversation, "customer_two")
                        else f"{conversation.agency.firstName} {conversation.agency.lastName}"
                    ),
                    "customer_two_image": (
                        conversation.customer_two.profileImage
                        if hasattr(conversation, "customer_two")
                        else conversation.agency.profileImage
                    ),
                    "customer_two_id": (
                        conversation.customer_two.id
                        if hasattr(conversation, "customer_two")
                        else conversation.agency.id
                    ),
                    "customer_two_phone_number": (
                        conversation.customer_two.phoneNumber
                        if hasattr(conversation, "customer_two")
                        else conversation.agency.phoneNumber
                    ),

                    "last_message": last_message,
                    "time": time,
                    "message_date": message_date,
                }

                conversation_list.append(conversation_data)
            return Response ({'status_code':status.HTTP_200_OK,'status_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 AgencyConverstationListing(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            # customer=request.GET.get(cui)
            conversations = ConversationCustomers.objects.filter(
                Q(customer_one=customerObj.id, customer_two__loginUserType='agency') |
                Q(customer_two=customerObj.id, customer_one__loginUserType='agency')
            ).exclude(
                customer_deleted=customerObj
            ).order_by('-id')
            # if not conversations:
            # 	print("here")
            # 	conversations = ConversationCustomers.objects.filter(customer_two = customerObj.id ).exclude(id=user_id).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,
                    "customer_one_name": conversation.customer_one.firstName +" "+conversation.customer_one.lastName,
                    "customer_one_image": conversation.customer_one.profileImage,
                    "customer_one_id":conversation.customer_one.id,
                    "customer_one_phone_number":conversation.customer_one.phoneNumber,
                    "customer_two_name": conversation.customer_two.firstName +" "+conversation.customer_two.lastName,
                    "customer_two_image": conversation.customer_two.profileImage,
                    "customer_two_id": conversation.customer_two.id,
                    "customer_two_phone_number":conversation.customer_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,'status_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 LawyerConverstationListing(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            # customer=request.GET.get(cui)
            conversations = ConversationCustomers.objects.filter(
                Q(customer_one=customerObj.id, customer_two__loginUserType='lawyer') |
                Q(customer_two=customerObj.id, customer_one__loginUserType='lawyer')
            ).exclude(
                customer_deleted=customerObj
            ).order_by('-id')
            # if not conversations:
            # 	print("here")
            # 	conversations = ConversationCustomers.objects.filter(customer_two = customerObj.id ).exclude(id=user_id).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,
                    "customer_one_name": conversation.customer_one.firstName +" "+conversation.customer_one.lastName,
                    "customer_one_image": conversation.customer_one.profileImage,
                    "customer_one_id":conversation.customer_one.id,
                    "customer_one_phone_number":conversation.customer_one.phoneNumber,
                    "customer_two_name": conversation.customer_two.firstName +" "+conversation.customer_two.lastName,
                    "customer_two_image": conversation.customer_two.profileImage,
                    "customer_two_id": conversation.customer_two.id,
                    "customer_two_phone_number":conversation.customer_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,'status_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 allCustomerList(APIView):
    def get(self, request):
        token = get_authorization_header(request)
        if token:
            decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
            user_id = decoded['user_id']
            customerObj=Customer.objects.filter(user=user_id).first()
        else:
            customerObj= 0
        search_query = request.GET.get('search', '')
        

        all_customer = Customer.objects.all()
        
        # Exclude current user if exists
        if customerObj:
            all_customer = all_customer.exclude(id=customerObj.id)

        # Apply search filter if search query exists
        if search_query:
            all_customer = all_customer.filter(
                Q(username__icontains=search_query) |
                Q(firstName__icontains=search_query) |
                Q(lastName__icontains=search_query) |
                Q(email__icontains=search_query)
            )

        # Order by id
        all_customer = all_customer.order_by('-id')

        all_Data = []
        for cust in all_customer:
            all_data = {
                'id': cust.id,
                'username': cust.username,
                'firstName': cust.firstName,
                'lastName': cust.lastName,
                'email': cust.email,
                'profileImage': cust.profileImage,
            }
            all_Data.append(all_data)

        return Response({
            'status_code': status.HTTP_200_OK,
            'status_message': 'customer listed successfully',
            'data': all_Data
        },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 deleteConverstation(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0

            converstation_id = request.GET.get('converstation_id')
            print(converstation_id)
            if not converstation_id:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No customer found'},status= status.HTTP_400_BAD_REQUEST)

            conversations = ConversationCustomers.objects.filter(id = converstation_id ).first()
            if not conversations:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No conversation found'},status= status.HTTP_400_BAD_REQUEST)

            conversations.customer_deleted.add(customerObj)


            conversations.save()
            
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'conversation deleted successfully'},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 createConverstationAgency(APIView):
    def post(self, request):
        try:
            uid = authenticated(request)
        except Exception as e:
            return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
        customerObj=Customer.objects.filter(user=uid).first()
        
        agency_id = request.data.get('agency_id')
        if not agency_id:
            return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'agency_id is required.'},status=status.HTTP_400_BAD_REQUEST)
        
        agency_obj = Customer.objects.filter(id=agency_id).first()
        if not agency_obj:
            return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No agency found'},status= status.HTTP_400_BAD_REQUEST)
        

        # Check if conversation already exists
        existing_conversation = ConversationAgency.objects.filter(customer=agency_obj, agency=customerObj).first()
        if existing_conversation:
            twilio_channel_sid = existing_conversation.twilio_channel_sid
        else:
            concatinate_names= str(agency_obj.firstName) + str(customerObj.firstName) + str(agency_obj.id) + str(customerObj.id) 
            suffle_string = list(concatinate_names)
            random.shuffle(suffle_string)
            conversation_name = ''.join(suffle_string)
            # Create Conversation chat
            conversation = client.conversations \
                    .v1 \
                    .conversations \
                    .create(friendly_name=conversation_name)
            

            conversation_obj = ConversationAgency.objects.create(customer=agency_obj,agency=customerObj )
            conversation_obj.twilio_channel_sid = conversation.sid
            conversation_obj.last_message = datetime.now()
            conversation_obj.save()

            user_attributes= {"id":str(customerObj.id),"name":str(customerObj.firstName),
                "image":str(customerObj.profileImage)
            }
            user_json_attributes = json.dumps(user_attributes)

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

            user_two_attributes= {"id":str(agency_obj.id),"name":str(agency_obj.firstName),
                "image":str(agency_obj.profileImage)
            }	
            user_two_attributes_json_attributes = json.dumps(user_two_attributes)

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



            conversation_obj.customer_twilio_id = chat_user_participant.sid
            conversation_obj.agency_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,'status_message':'conversation agency created','twilio_channel_sid':twilio_channel_sid},status=status.HTTP_200_OK)




class customerAgencyConverstationListing(APIView):
    def get(self,request):
        try :
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
                user_id = decoded['user_id']
                print(user_id)
                customerObj=Customer.objects.filter(user=user_id).first()
                print(customerObj)
            else:
                customerObj = 0
            print(customerObj)
            conversations = ConversationAgency.objects.filter(customer = customerObj ).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:
                        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
        
                
                conversation_data = {
                    "id": conversation.id,
                    "twilio_channel_sid": conversation.twilio_channel_sid,
                    "customer_one_id": conversation.customer.id,
                    "customer_one_name": conversation.customer.firstName +" "+conversation.customer.lastName,
                    "customer_one_image": conversation.customer.profileImage,
                    "customer_two_id":conversation.agency.id,
                    "customer_two_name":conversation.agency.firstName +" "+conversation.agency.lastName,
                    "customer_two_image": conversation.agency.profileImage,
                    "last_message":last_message,
                    "time":time,
                    "message_date":message_date,
                }
                conversation_list.append(conversation_data)
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'customer agency conversations listed successfully','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 deleteAgencyCustomerChat(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            converstation_id = request.data.get('converstation_id')
            if not converstation_id:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No customer found'},status= status.HTTP_400_BAD_REQUEST)

            conversations = Conversation.objects.filter(id = converstation_id ).first()
            conversations.delete()
            
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'Agency customer chat deleted successfully'},status=status.HTTP_200_OK)	

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



class createConverstationLawyer(APIView):
    def post(self, request):
        try:
            uid = authenticated(request)
        except Exception as e:
            return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
        customerObj=Customer.objects.filter(user=uid).first()
        
        lawyer_id = request.data.get('lawyer_id')
        if not lawyer_id:
            return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'lawyer_id is required.'},status= status.HTTP_400_BAD_REQUEST)
        
        lawyer_obj = Customer.objects.filter(id=lawyer_id,end_date__isnull = True).first()
        if not lawyer_obj:
            return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No lawyer found'},status= status.HTTP_400_BAD_REQUEST)
        

        # Check if conversation already exists
        existing_conversation = ConversationLawyer.objects.filter(customer=customerObj.id, lawyer=lawyer_obj.id).first()
        if existing_conversation:
            twilio_channel_sid = existing_conversation.twilio_channel_sid
        else:
            concatinate_names= str(lawyer_obj.firstName) + str(customerObj.firstName) + str(lawyer_obj.id) + str(customerObj.id) 
            suffle_string = list(concatinate_names)
            random.shuffle(suffle_string)
            conversation_name = ''.join(suffle_string)
            # Create Conversation chat
            conversation = client.conversations \
                    .v1 \
                    .conversations \
                    .create(friendly_name=conversation_name)
            

            conversation_obj = ConversationLawyer.objects.create(customer=customerObj,lawyer=lawyer_obj )
            conversation_obj.twilio_channel_sid = conversation.sid
            conversation_obj.last_message = datetime.now()
            conversation_obj.save()

            user_attributes= {"id":str(customerObj.id),"name":str(customerObj.firstName),
                "image":str(customerObj.profileImage)
            }
            user_json_attributes = json.dumps(user_attributes)

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

            user_two_attributes= {"id":str(lawyer_obj.id),"name":str(lawyer_obj.firstName),
                "image":str(lawyer_obj.profileImage)
            }	
            user_two_attributes_json_attributes = json.dumps(user_two_attributes)

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



            conversation_obj.customer_twilio_id = chat_user_participant.sid
            conversation_obj.agency_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,'status_message':'Converstation with lawyer Added successfully','twilio_channel_sid':twilio_channel_sid},status= status.HTTP_200_OK)



class customerLawyerConverstationListing(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            conversations = ConversationLawyer.objects.filter(customer = customerObj.id ).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 
                        time = timesince(record.date_created)+' ago'
                        message_date = record.date_created
                    elif record.media:
                        last_message = 'file'
                        time = timesince(record.date_created)+' ago'
                        message_date = record.date_created
        
                
                conversation_data = {
                    "id": conversation.id,
                    "twilio_channel_sid": conversation.twilio_channel_sid,
                    "customer_id": conversation.customer.id,
                    "customer_name": conversation.customer.name,
                    "customer_image": conversation.customer.image,
                    "lawyer_id":conversation.lawyer.id,
                    "lawyer_name": conversation.lawyer.name,
                    "lawyer_image": conversation.lawyer.image,
                    "last_message":last_message,
                    "time":time,
                    "message_date":message_date,
                }
                conversation_list.append(conversation_data)
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'conversations with lawyer listed successfully','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 deleteLawyerCustomerChat(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            converstation_id = request.data.get('converstation_id')
            if not converstation_id:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No customer found'},status= status.HTTP_400_BAD_REQUEST)

            conversations = ConversationLawyer.objects.filter(id = converstation_id ).first()
            conversations.delete()
            
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'lawyer-customer chat deleted successfully'},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 getCommunityChatListing(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
                community_obj = CommunityChannels.objects.all()
                if not community_obj:
                    return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No community chat found.'},status=status.HTTP_400_BAD_REQUEST)
                for comm in community_obj:
                    all_data = {
                        'id':comm.id,
                        'channel_name':comm.channel_name,
                        'twilio_channel_sid':comm.twilio_channel_sid,
                        'last_message':comm.last_message,
                        'created_at':comm.created_at,
                    }
                return Response ({'status_code':status.HTTP_200_OK,'status_message':'Community chat listing fetched successfully','all_data':all_data},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 addTestimonial(APIView):
    def post(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0

            title =  request.data.get('title')
            if not title:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'title is requried'},status= status.HTTP_400_BAD_REQUEST)

            description = request.data.get('description')
            if not description:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'description is requried'},status= status.HTTP_400_BAD_REQUEST)


            ratings = request.data.get('ratings')
            if not ratings:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'ratings is requried'},status= status.HTTP_400_BAD_REQUEST)

            name = request.data.get('name')
            if not name:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'name is requried'},status= status.HTTP_400_BAD_REQUEST)

            designation = request.data.get('designation')
            if not designation:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'designation is requried'},status= status.HTTP_400_BAD_REQUEST)

            Testimonials.objects.create(title = title,description=description,ratings=ratings,name = name,designation = designation,Customer = customerObj)
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'success'},status= status.HTTP_400_BAD_REQUEST)	
        except Exception as e:
            return Response({'status':status.HTTP_500_INTERNAL_SERVER_ERROR,'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class editTestimonial(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0

            test_id =  request.data.get('test_id')
            if not test_id:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'test_id is requried'},status=status.HTTP_400_BAD_REQUEST)
            test_obj = Testimonials.objects.filter(id = test_id).first()
            if not test_obj:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'No testimonial found'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'id':test_obj.id,
                'title':test_obj.title,
                'description':test_obj.description,
                'ratings':test_obj.ratings,	
                'name':test_obj.name,
                'designation':test_obj.designation,
            }
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'success','all_data':all_data},status=status.HTTP_200_OK)	

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


    def post(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            
            test_id =  request.data.get('test_id')
            if not test_id:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'test_id is requried'},status=status.HTTP_400_BAD_REQUEST)
            title =  request.data.get('title')
            if not title:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'title is requried'},status=status.HTTP_400_BAD_REQUEST)

            description = request.data.get('description')
            if not description:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'description is requried'},status=status.HTTP_400_BAD_REQUEST)


            ratings = request.data.get('ratings')
            if not ratings:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'ratings is requried'},status=status.HTTP_400_BAD_REQUEST)

            name = request.data.get('name')
            if not name:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'name is requried'},status=status.HTTP_400_BAD_REQUEST)

            designation = request.data.get('designation')
            if not designation:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'designation is requried'},status=status.HTTP_400_BAD_REQUEST)

            Testimonials.objects.filter(id = test_id).update(title = title,description=description,ratings=ratings,name = name,designation = designation,Customer = customerObj)
   
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'Updated Successfully'},status=status.HTTP_200_OK)	
        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 listingTestimonial(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            test_data = []
            test_obj =  Testimonials.objects.filter(end_date__isnull = True)
            for test in test_obj:
                all_data = {
                    'id':test.id,
                    'title':test.title,
                     'description':test.description,
                     'ratings':test.ratings,
                }
                test_data.append(all_data)
            return Response({'status_code': status.HTTP_200_OK, 'status_message': 'Fetched successfully'}, status=status.HTTP_200_OK)
        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 deleteTestimonial(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY)
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            test_id =  request.data.get('test_id')
            if not test_id:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'test_id is requried'},status=status.HTTP_400_BAD_REQUEST)

            test_obj = Testimonials.objects.filter(id = test_id).first()
            test_obj.delete()
            return Response({'status_code': status.HTTP_200_OK, 'status_message': 'Deleted sucessfully'},status=status.HTTP_200_OK)
        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 getFacilityListing(APIView):
    def get(self,request):
        try:
            fac_obj = Facilities.objects.all().order_by('-id')
            all_Data = []
            for fac in fac_obj:
                all_data = {
                    'id':fac.id,
                    'name':fac.name,
                    'icon':fac.icon,
                    
                } 
                all_Data.append(all_data)  
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','all_data':all_Data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class getProperDeveloperListing(APIView):
    def get(self,request):
        try:
            dev_obj = PropertyDevelopers.objects.all().order_by('-id')
            all_Data = []
            for dev in dev_obj:
                all_data = {
                    'id': dev.id,
                    'customer_id': dev.customerId_id,
                    'property_image': dev.property_image,
                    'videos': dev.videos,
                    'videos_thumbnail': dev.videos_thumbnail,
                    'document': dev.document,
                    'property_type': dev.property_type,
                    'assest_equality': dev.assest_equality,
                    'investment_highlight': dev.investment_highlight,
                    'equity_price': dev.equity_price,
                    'lp_equity_percent': dev.lp_equity_percent,
                    'gp_equity_percent': dev.gp_equity_percent,
                    'debt_percent': dev.debt_percent,
                    'short_title': dev.short_title,
                    'description': dev.description,
                    'bussiness_plan': dev.bussiness_plan,
                    'minimum_investment': dev.minimum_investment,
                    'investment_strategy': dev.investment_strategy,
                    'expected_period': dev.expected_period,
                    'financed': dev.financed,
                    'target_return_on_cost': dev.target_return_on_cost,
                    'target_irr': dev.target_irr,
                    'offered_by': dev.offered_by,
                    'estimated_first_distribution': dev.estimated_first_distribution,
                    'type_of_investment': dev.type_of_investment,
                    'phone_number': dev.phone_number,
                    'measure_of_multiplier': dev.measure_of_multiplier,
                    'address': dev.address,
                    'minimum_goal': dev.minimum_goal,
                    'nominal_share_price': dev.nominal_share_price,
                    'the_valuation': dev.the_valuation,
                    'minimum_drawing': dev.minimum_drawing,
                    'no_of_drawings': dev.no_of_drawings,
                    'share_for_sale': dev.share_for_sale,
                    'remaining_share': dev.remaining_share,
                    'maximum_drawing': dev.maximum_drawing,
                    'short_description': dev.short_description,
                    'why_invest': dev.why_invest,
                    'problem_to_be_solved': dev.problem_to_be_solved,
                    'our_solution': dev.our_solution,
                    'start_date_data': dev.start_date_data,
                    'end_date_data': dev.end_date_data,
                    'number_of_share': dev.number_of_share,
                    'price_of_share': dev.price_of_share,
                    'issue_minimum_investment': dev.issue_minimum_investment,
                    'issue_maximum_investment': dev.issue_maximum_investment,
                    'value_before_issue': dev.value_before_issue,
                    'raised_capital_minimum_limit': dev.raised_capital_minimum_limit,
                    'raised_capital_maximum_limit': dev.raised_capital_maximum_limit,
                    'share_of_company_sold_minimum_limit': dev.share_of_company_sold_minimum_limit,
                    'share_of_company_sold_maximum_limit': dev.share_of_company_sold_maximum_limit,
                    'self_report': dev.self_report,
                    'discussion_description': dev.discussion_description,
                    'new_exisiting_details': dev.new_exisiting_details,
                    'drawing_on_behalf': dev.drawing_on_behalf,
                    'foundation': dev.foundation,
                    'satutes': dev.satutes,
                    'annual_account': dev.annual_account,
                    'valuation': dev.valuation,
                    'agreement_on_co': dev.agreement_on_co,
                    'conversion_of_debt': dev.conversion_of_debt,
                    'balance_sheet': dev.balance_sheet,
                    'result_report': dev.result_report,
                    'country': dev.country,
                    'state': dev.state,
                    'city': dev.city,
                    'postal_code': dev.postal_code,
                    'landmark': dev.landmark,
                    'house_number': dev.house_number,
                    'location': dev.location,
                    'latitude': dev.latitude,
                    'longitude': dev.longitude,
                    'agency': dev.agency_id,
                    'status': dev.status,
                    'is_draft': dev.is_draft,
                    'subscription_type': dev.subscription_type,
                    'start_date': dev.start_date,
                    'end_date': dev.end_date,
                }
                all_Data.append(all_data)  
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','all_data':all_Data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class getFeaturePlans(APIView):
    def get(self,request):
        feature_obj = FeatureAddPricing.objects.all()
        all_Data = []
        for feature in feature_obj:
            all_data ={
                'id':feature.id,
                'name':feature.name,
                'price':feature.price,
                'days':feature.days,
                'benfits':feature.benfits,
        
            }
            all_Data.append(all_data)
        return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','all_data':all_Data})
    

    
class addFeatureAd(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message':str(e)},status=status.HTTP_401_UNAUTHORIZED)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            property_type = request.data.get('property_type')
            # if not property_type:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)
            property_id = request.data.get('property_id')
            # if not property_id:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)

            plan_id = data.get('plan_id')
            payment_token = data.get('payment_token')
            price = data.get('price')
            if not plan_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'plan_id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not payment_token:
                return Response({'message':'payment_token is required'},status=status.HTTP_400_BAD_REQUEST)
            sub_obj = FeatureAddPricing.objects.filter(id=plan_id).first()
            stripe.api_key =settings.STRIPE_SECRET_KEY
            today = datetime.today()
            charge = stripe.Charge.create(
                amount=int(price) * 100,
                currency='usd',
                source=payment_token,
                description='Purchase Feature Ad'
            )

            if charge:
                plan_obj = FeatureAddPricing.objects.filter(id = plan_id).first()
                try:
                    days_to_add = int(plan_obj.days)  
                except ValueError:
                    days_to_add = int(0)  
                last_date = datetime.today() + timedelta(days=days_to_add)  # Explicit use of datetime.date

                new_data = CustomersFeatureAdsHistory.objects.create(customer=customerObj,plan=sub_obj,payment_date= today,property_type=property_type,property_id=property_id,is_active=True)
                total_property=plan_obj.property_count
                customerObj.can_add_property_count=total_property
                customerObj.save()

                if property_type == "property_project":
                    property_obj = PropertyProject.objects.filter(id = property_id).first()
                    property_obj.is_featured = True
                    property_obj.feature_plan = plan_obj
                    property_obj.featured_end_date = last_date
                    property_obj.save()
                elif property_type == "sale_property":
                    property_obj = SaleProperty.objects.filter(id = property_id).first()
                    property_obj.is_featured = True
                    property_obj.feature_plan = plan_obj
                    property_obj.featured_end_date = last_date
                    property_obj.save()
                elif property_type == "rent_property":
                    property_obj = RentProperty.objects.filter(id = property_id).first()
                    property_obj.is_featured = True
                    property_obj.feature_plan = plan_obj
                    property_obj.featured_end_date = last_date
                    property_obj.save()
                elif property_type == "house_for_rent":
                    property_obj = HouseWantedForRent.objects.filter(id = property_id).first()
                    property_obj.is_featured = True
                    property_obj.feature_plan = plan_obj
                    property_obj.featured_end_date = last_date
                    property_obj.save()
     
                elif property_type == "company_seeking_equity":
                    property_obj = CompanySeekingEquity.objects.filter(id = property_id).first()
                    property_obj.is_featured = True
                    property_obj.feature_plan = plan_obj
                    property_obj.featured_end_date = last_date
                    property_obj.save()
     
                elif property_type == "bussiness_for_sale":
                    property_obj = BussinessForSale.objects.filter(id = property_id).first()
                    property_obj.is_featured = True
                    property_obj.feature_plan = plan_obj
                    property_obj.featured_end_date = last_date
                    property_obj.save()
        
                elif property_type == "property_developer":
                    property_obj = PropertyDevelopers.objects.filter(id = property_id).first()
                    property_obj.is_featured = True
                    property_obj.feature_plan = plan_obj
                    property_obj.featured_end_date = last_date
                    property_obj.save()
                else:
                    pass
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Property added in feature ads successfully'})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)






class addToRecent(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message':str(e)},status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            property_id = request.data.get('property_id')
            if not property_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)

            property_type = request.data.get('property_type')
            if not property_type:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)
            
            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            
            image_data = request.data.get('image_data')
            if not image_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'image_data is required'},status=status.HTTP_400_BAD_REQUEST)
            
            price = request.data.get('price')
            if not price:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
            
            location = request.data.get('location')
            if not location:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'location is required'},status=status.HTTP_400_BAD_REQUEST)
            
            latitude = request.data.get('latitude')
            if not latitude:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'latitude is required'},status=status.HTTP_400_BAD_REQUEST)
            
            longitude = request.data.get('longitude')
            if not longitude:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            
            RecentlyViewed.objects.create(customer = customerObj,property_type = property_type,property_id = property_id,title =title,image_data=image_data,price=price,location=location,latitude=latitude,longitude=longitude)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Subscription purchased successfully'})

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


class allRecentlyViewed(APIView):
    def get(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message':str(e)},status=status.HTTP_401_UNAUTHORIZED)
            customerObj=Customer.objects.filter(user=uid).first()
            recently_viewed = []
            viewed_obj =  RecentlyViewed.objects.filter(customer = customerObj.id).order_by('-id')[:10]
            for view in viewed_obj:
                recently_viewed.append({
                        'id': view.id,
                        'title': view.title,
                        'image_data': view.image_data,
                        'price': view.price,
                        'location': view.location,
                        'latitude': view.latitude,
                        'longitude': view.longitude,
                        'property_type': view.property_type,
                    })
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Subscription purchased successfully','all_data':recently_viewed})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class getNewAdded(APIView):
    def get(self,request):
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            saleProperty = SaleProperty.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            rentProperty = RentProperty.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            bussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            houseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            investmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            investmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            propertyProject = PropertyProject.objects.filter(end_date__isnull = True,status = 1).order_by('-id')
            companySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True).order_by('-id')
            propertyDeveloper =  PropertyDevelopers.objects.filter(end_date__isnull = True).order_by('-id')

            allData= []
            if propertyDeveloper:
                for pd in propertyDeveloper:
                    if pd.status == 0:
                        status_info = "Pending"
                    elif pd.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                        allData.append({
                            'id': pd.id,
                            'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
                            'customer_id' : pd.customerId.id,
                            'customer_phone_number' : pd.customerId.phoneNumber,
                            'customer_images' : pd.customerId.profileImage,
                            'image_data': ast.literal_eval(pd.property_image),
                            'videos': pd.videos,
                            'videos_thumbnail': pd.videos_thumbnail,
                            'document': pd.document,
                            'property_name':pd.property_name,
                               'property_type': pd.property_type,
                            'assest_equality': pd.assest_equality,
                            'investment_highlight': pd.investment_highlight,
                            'equity_price': pd.equity_price,
                            'lp_equity_percent': pd.lp_equity_percent,
                            'gp_equity_percent': pd.gp_equity_percent,
                            'debt_percent': pd.debt_percent,
                            'short_title': pd.short_title,
                            'description': pd.description,
                            'bussiness_plan': pd.bussiness_plan,
                            'minimum_investment': pd.minimum_investment,
                            'investment_strategy': pd.investment_strategy,
                            'expected_period': pd.expected_period,
                            'financed': pd.financed,
                            'target_return_on_cost': pd.target_return_on_cost,
                            'target_irr': pd.target_irr,
                            'offered_by': pd.offered_by,
                            'estimated_first_distribution': pd.estimated_first_distribution,
                            'type_of_investment': pd.type_of_investment,
                            'phone_number': pd.phone_number,
                            'measure_of_multiplier': pd.measure_of_multiplier,
                            'address': pd.address,
                            'minimum_goal': pd.minimum_goal,

                            'nominal_share_price': pd.nominal_share_price,
                            'the_valuation': pd.the_valuation,
                            'minimum_drawing': pd.minimum_drawing,

                            'no_of_drawings': pd.no_of_drawings,
                            'share_for_sale': pd.share_for_sale,
                            'remaining_share': pd.remaining_share,
                            'maximum_drawing': pd.maximum_drawing,
                            'short_description': pd.short_description,
                            'why_invest': pd.why_invest,
                            'problem_to_be_solved': pd.problem_to_be_solved,
                            'our_solution': pd.our_solution,
                            'start_date_data': pd.start_date_data,
                            'end_date_data': pd.end_date_data,
                            'number_of_share': pd.number_of_share,
                            'issue_minimum_investment': pd.issue_minimum_investment,
                            'issue_maximum_investment': pd.issue_maximum_investment,
                            'value_before_issue': pd.value_before_issue,
                            'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
                            'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
                            'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
                            'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
                            'self_report': pd.self_report,
                            'discussion_description': pd.discussion_description,
                            'new_exisiting_details': pd.new_exisiting_details,
                            'drawing_on_behalf': pd.drawing_on_behalf,
                            'foundation': pd.foundation,
                            'satutes': pd.satutes,
                            'annual_account': pd.annual_account,
                            'valuation': pd.valuation,
                            'agreement_on_co': pd.agreement_on_co,
                            'conversion_of_debt': pd.conversion_of_debt,
                            'balance_sheet': pd.balance_sheet,
                            'result_report': pd.result_report,
                            'location': pd.location,
                            'country': pd.country,
                            'state': pd.state,
                            'city': pd.city,
                            'zip_code': pd.postal_code,
                            'landmark': pd.landmark,
                            'latitude': pd.latitude,
                            'longitude': pd.longitude,
                            'status': pd.status,
                            'agency': pd.agency.id if pd.agency else None,
                            'subscription_type': pd.subscription_type,
                            'start_date': pd.start_date,
                            'end_date': pd.end_date,
                            'status':status_info,
                              'is_ad_featured':pd.is_featured,
                            'type':"property_developers",
                    })
            if companySeeking:
                for cs in companySeeking:
                    if cs.status == 0:
                        status_info = "Pending"
                    elif cs.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': cs.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'company_name': cs.company_name,
                        'short_title': cs.short_title,
                        'description': cs.description,
                        'about_the_owner': cs.about_the_owner,
                        'image_data': ast.literal_eval(cs.property_image),
                        'videos': cs.property_video,
                        'videos_thumbnail': cs.videos_thumbnail,
                        'company_logo': cs.company_logo,
                        'maximum_drawing': cs.maximum_drawing,
                        'minimum_drawing': cs.minimum_drawing,
                        'share_for_sale': cs.share_for_sale,
                        'price_per_share': cs.price_per_share,
                        'filter_price': cs.price_per_share,
                        'number_of_share': cs.number_of_share,
                        'self_report': cs.self_report,
                        'nominal_share_price': cs.nominal_share_price,
                        'e_post': cs.e_post,
                        'issue_account_number': cs.issue_account_number,
                        'establish_year': cs.establish_year,
                        'premises_from': cs.premises_from,
                        'background_for_sale': cs.background_for_sale,
                        'company_website': cs.company_website,
                        'number_of_employee': cs.number_of_employee,
                        'company_email': cs.company_email,
                        'company_telephone': cs.company_telephone,
                        'youtube': cs.youtube,
                        'upload_team_data': cs.upload_team_data,
                        'upload_team_name': cs.upload_team_name,
                        'upload_team_size': cs.upload_team_size,
      
                        'upload_board_data': cs.upload_board_data,
                        'upload_board_name': cs.upload_board_name,
                        'upload_board_size': cs.upload_board_size,
      
                        'upload_partner_data': cs.upload_partner_data,
                        'upload_partner_name': cs.upload_partner_name,
                        'upload_partner_size': cs.upload_partner_size,
                        'location': cs.location,
                        'country': cs.country,
                        'state': cs.state,
                        'city': cs.city,
                        'zip_code': cs.zip_code,
                        'landmark': cs.landmark,
                        'share_holder_image': cs.share_holder_image,
                        'enter_shares': cs.enter_shares,
                        'status': cs.status,
                        'agency': cs.agency.id if cs.agency else None,
                        'subscription_type': cs.subscription_type,
                        'latitude': cs.latitude,
                        'longitude': cs.longitude,
                        'start_date': cs.start_date,
                        'end_date': cs.end_date,
                        # 'is_favourite': cs.is_favourite,
                        # 'favourite_date': cs.favourite_date,
                        # 'is_favourite':favourite,
                        'is_ad_featured':cs.is_featured,
                        'status':status_info,
                        'type':"companySeeking"
                    })
            if saleProperty:

                for salelist in saleProperty:
                    if salelist.status == 0:
                        status_info = "Pending"
                    elif salelist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':salelist.id,
                        'title':salelist.title,
                        'image_data':ast.literal_eval(salelist.image_data),
                        'price':salelist.price,
                        'descriptioon':salelist.descriptioon,
                        'latitude':salelist.latitude,
                        'longitude':salelist.longitude,
                        'location':salelist.location,
                        'property_demension':salelist.property_demension,
                        'filter_price':salelist.price,
                        'bedrooms':salelist.bedrooms,
                        'bathrooms':salelist.bathrooms,
                        'created_date':salelist.created_at,
                        'location':salelist.location,
                        'created_date':salelist.created_at,
                        'type':"SaleProperty",
                          'is_ad_featured':salelist.is_featured,
                        'status':status_info,
                    }
                    allData.append(alldata)
            if rentProperty:
                for rentlist in rentProperty:
                    if rentlist.status == 0:
                        status_info = "Pending"
                    elif rentlist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':rentlist.id,
                        'title':rentlist.title,
                        'image_data':ast.literal_eval(rentlist.image_data),
                        'video':rentlist.video,
                        'rooms':rentlist.rooms,
                        'bedrooms':rentlist.bedrooms,
                        'size':rentlist.size,
                        'country': rentlist.country,
                        'state': rentlist.state,
                        'city': rentlist.city,
                        'postal_code':rentlist.postal_code,
                        'landmark': rentlist.landmark,
                        'house_number': rentlist.house_number,
                        'filter_price':rentlist.monthly_rent,
                        'rental_period':rentlist.rental_period,
                        'heading':rentlist.heading,
                        'name_of_ad':rentlist.name_of_ad,
                        'visibilty':rentlist.visibilty,
                        'location':rentlist.location,
                        'latitude':rentlist.latitude,
                        'longitude':rentlist.longitude,
                        'type':"RentProperty",
                          'is_ad_featured':rentlist.is_featured,
                        'status':status_info,
                    }
                    allData.append(alldata)
            if bussinessSale:
                for bs in bussinessSale:
                    allData.append({
                        'id': bs.id,
                        'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
                        'company_name': bs.company_name,
                        'short_title': bs.short_title,
                        'image_data':  ast.literal_eval(bs.image_data),
                        'videos': bs.videos,
                        'videos_thumbnail': bs.videos_thumbnail,
                        'company_name': bs.company_name,
                        'description': bs.description,
                        'total_turnover': bs.total_turnover,
                        'rent': bs.rent,
                        'established_year': bs.established_year,
                        'premises': bs.premises,
                        'years_of_work': bs.years_of_work,
                        'operation_concept': bs.operation_concept,
                        'operation_opening_hours': bs.operation_opening_hours,
                        'turnover_last_year': bs.turnover_last_year,
                        'salary_percentage': bs.salary_percentage,
                        'other_operating_cost': bs.other_operating_cost,
                          'filter_price':bs.cost,
                        'cost': bs.cost,
                        'reason_for_sale':bs.reason_for_sale,
                        'website_link':bs.website_link,
                        'number_of_employes':bs.number_of_employes,
                        'other_operating_cost':bs.other_operating_cost,
                        'area':bs.area,
                        'term_of_lease': bs.term_of_lease,
                        'document':ast.literal_eval(bs.document),
                        'details': bs.details,
                        'service':bs.service,
                        'operations':bs.operations,
                        'market_initatives':bs.market_initatives,
                        'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
                        'valuation':bs.valuation,
                        'owner_name':bs.owner_name,
                        'phone':bs.phone,
                        'telephone':bs.telephone,
                        'email':bs.email,
                        'company':bs.company,
                        'public_order':bs.public_order,
                        'avaiable_attachment':bs.avaiable_attachment,
                        'location':bs.location,
                        'latitude':bs.latitude,
                        'longitude':bs.longitude,    
                        'subscription_type':bs.subscription_type,
                        'created_date':bs.start_date,
                        'is_ad_featured':bs.is_featured,
                        'type':"BusinessSale"})
            if houseWantedRent:
                for hWr in houseWantedRent:
                    if hWr.status == 0:
                        status_info = "Pending"
                    elif hWr.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': hWr.id,
                        'short_title':hWr.short_title,
                        'customer_id':hWr.customerId.id,
                        'fullname': hWr.first_name+' '+ hWr.last_name,
                        'profile_visiblity':hWr.profile_visiblity,
                        'profile_hidden':hWr.profile_hidden,
                        'image_data': ast.literal_eval(hWr.image),
                        'first_name': hWr.first_name,
                        'last_name': hWr.last_name,
                        'gender': hWr.gender,
                        'dob': hWr.dob,
                        'nationality': hWr.nationality,
                        'phone_number':hWr.phone_number,
                        'email': hWr.email,
                        'quantity': hWr.quantity,
                        'rental_period': hWr.rental_period,
                        'max_rent': hWr.max_rent,
                        'from_date': hWr.from_date,
                        'housing_type':hWr.housing_type,
                        'number_of_people':hWr.number_of_people,
                          'filter_price':hWr.max_month_price,
                        'max_month_price': hWr.max_month_price,
                        'desired_start_date':hWr.desired_start_date,
                        'desired_area': hWr.desired_area,
                        'latitude':hWr.latitude,
                        'longitude':hWr.longitude,
                        'location':hWr.location,
                        'about':hWr.about,
                        'education':hWr.education,
                        'martial_status':hWr.martial_status,
                        'cleanliness':hWr.cleanliness,
                        'party_habits':hWr.party_habits,
                        'work':hWr.work,
                        'interest':hWr.interest,
                        'subscription_type':hWr.subscription_type,
                        'is_draft':hWr.is_draft,
                        'created_date':hWr.start_date,
                        'status':status_info,
                        'country':hWr.country,
                        'state':hWr.state,
                        'city':hWr.city,
                        'postal_code':hWr.postal_code,
                        'landmark':hWr.landmark,
                        'floor':hWr.floor,
                        'description':hWr.description,
                        'is_ad_featured':hWr.is_featured,
                        'type':"HouseRent"})
            if investmentProject:
                for ip in investmentProject:
                    
                    allData.append({'id':ip.id,
                        'customer_id':ip.customerId.id,
                        'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
                        'property_name':ip.property_name,
                        'image_data':ast.literal_eval(ip.image_data),
                        'videos':ip.videos,
                        'documents_data':ip.documents_data,
                        'property_type':ip.property_type,
                        'assest_equality':ip.assest_equality,
                        'investment_highlight':ip.investment_highlight,
                        'filter_price':ip.equity_price,
                        'equity_price':ip.equity_price,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'gp_equity_percent':ip.gp_equity_percent,
                        'debt_percent':ip.debt_percent,
                        'property_at_glance_title':ip.property_at_glance_title,
                        'description':ip.description,
                        'bussiness_plan':ip.bussiness_plan,
                        'minimum_investment':ip.minimum_investment,
                        'investment_strategy':ip.investment_strategy,
                        'expected_attitude_price':ip.expected_attitude_price,
                        'financed':ip.financed,
                        'target_return_on_cost':ip.target_return_on_cost,
                        'target_irr':ip.target_irr,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'offered_by':ip.offered_by,
                        'estimated_first_distribution':ip.estimated_first_distribution,
                        'type_of_investment':ip.type_of_investment,
                        'phone_number':ip.phone_number,
                        'measure_for_multiplier':ip.measure_for_multiplier,
                        'address':ip.address,
                        'location_details':ip.location_details,
                        # 'property_summary':ip.property_summary,
                        # 'property_details':ip.property_details,
                        # 'overview':ip.overview,
                        # 'debt_assumption':ip.debt_assumption,
                        'location':ip.location,
                        'latitude':ip.latitude,
                        'longitude':ip.longitude,
                        'status':ip.status,
                        'type':"InvestmentProject"})
            if investmentCompany:
                for ic in investmentCompany:
                    allData.append({'id':ic.id,
                         'title':ic.property_name,
                        'company_name':ic.property_name,
                        'image_data':ic.company_logo,
                        'description':ic.description,
                        'the_valuation':ic.the_valuation,
                        'nomial_share_price':ic.nominal_share_price,
                        'filter_price':ic.nominal_share_price,
                        'created_date':ic.start_date,
                        'type':"InvestmentCompany"})
            if propertyProject:
                for pp in propertyProject:
                    if pp.status == 0:
                        status_info = "Pending"
                    elif pp.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                          'id': pp.id,
                        'customer_id':pp.customerId.id,
                        'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
                        'spend_too_much_time':pp.spend_too_much_time,
                        'most_useless_skill':pp.most_useless_skill,
                        'fun_act':pp.fun_act,
                        'biography':pp.biography,
                        'short_title':pp.short_title,
                        'property_overview':pp.property_overview,
                        'property_description':pp.property_description,
                        'image_data':ast.literal_eval(pp.image_data),
                        'videos':pp.videos,
                        'property_document':pp.property_document,
                        'category':pp.category,
                        'property_name':pp.property_name,
                        'property_dimension':pp.property_dimension,
                        'country':pp.country,
                        'state':pp.state,
                        'city':pp.city,
                        'postal_code':pp.postal_code,
                        'landmark':pp.landmark,
                        'house_number':pp.house_number,
                        'location':pp.location,
                        'latitude':pp.latitude,
                        'longitude':pp.longitude,
                        'facility':pp.facility,
                        'benefits':pp.benefits,
                        'return_on_investment':pp.return_on_investment,
                        'finder_fee':pp.finder_fee,
                        'gross_income':pp.gross_income,
                        'price':pp.price,
                        'cashflow_pcm':pp.cashflow_pcm,
                        'total_termination_fee':pp.total_termination_fee,
                        'purchase_price':pp.purchase_price,
                        'potential_cashflow_pcm':pp.potential_cashflow_pcm,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
                        'rental':pp.rental,
                        'the_vision':pp.the_vision,
                        'cost_to_consider':pp.cost_to_consider,
                        'capital_required':pp.capital_required,
                        'cashflow_forecast':pp.cashflow_forecast,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'is_draft':pp.is_draft,
                          'filter_price':pp.price,
                           'created_date':pp.start_date,
                        'subscription_type':pp.subscription_type,
                        'status':status_info,
                          'is_ad_featured':pp.is_featured,
                           'type':"PropertyProject"
                        })
            # Filter by selected type
            def get_latest_entries(queryset, type_name, customer_id=None):
                # Try to get the 'created_at' field from the model. If it doesn't exist, use 'start_date'
                model_fields = [field.name for field in queryset.model._meta.get_fields()]
                
                # Filter by customerId if provided
                if customer_id:
                    queryset = queryset.filter(customerId=customer_id)

                if 'created_at' in model_fields:
                    latest_entries = queryset.order_by('-created_at')
                elif 'start_date' in model_fields:
                    latest_entries = queryset.order_by('-start_date')
                else:
                    # Default to the most recent item by ID if no date field is available
                    latest_entries = queryset.order_by('-id')

                formatted_entries = []
                for entry in latest_entries:
                    formatted_entries.append({
                        'id': entry.id,
                        'title': getattr(entry, 'title', getattr(entry, 'property_name', '')),
                        'image_data': entry.image_data if hasattr(entry, 'image_data') else '',
                        'price': getattr(entry, 'filter_price', getattr(entry, 'price', 0)),
                        'created_date': getattr(entry, 'created_at', getattr(entry, 'start_date', None)),
                        'location': getattr(entry, 'location', ''),
                        'latitude': getattr(entry, 'latitude', None),
                        'longitude': getattr(entry, 'longitude', None),
                        'status': entry.status,
                        'type': type_name
                    })

                return formatted_entries

            return Response({'status_code':status.HTTP_200_OK,'message':'Success','recently_added':recentProperties},status=status.HTTP_200_OK)



class getMyAllNewAdded(APIView):
    def get(self,request):
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            saleProperty = SaleProperty.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            rentProperty = RentProperty.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            bussinessSale = BussinessForSale.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            houseWantedRent = HouseWantedForRent.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            investmentProject = InvestmentMyProject.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            investmentCompany = InvestmentMyCompany.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            propertyProject = PropertyProject.objects.filter(end_date__isnull = True,status = 1,customerId = customerObj.id).order_by('-id')
            companySeeking = CompanySeekingEquity.objects.filter(end_date__isnull = True,customerId = customerObj.id).order_by('-id')
            propertyDeveloper =  PropertyDevelopers.objects.filter(end_date__isnull = True,customerId = customerObj.id).order_by('-id')

            allData= []
            if propertyDeveloper:
                for pd in propertyDeveloper:
                    if pd.status == 0:
                        status_info = "Pending"
                    elif pd.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                        allData.append({
                            'id': pd.id,
                            'customer_name': pd.customerId.firstName + ' ' + pd.customerId.lastName,
                            'customer_id' : pd.customerId.id,
                            'customer_phone_number' : pd.customerId.phoneNumber,
                            'customer_images' : pd.customerId.profileImage,
                            'image_data': ast.literal_eval(pd.property_image),
                            'videos': pd.videos,
                            'videos_thumbnail': pd.videos_thumbnail,
                            'document': pd.document,
                            'property_name':pd.property_name,
                               'property_type': pd.property_type,
                            'assest_equality': pd.assest_equality,
                            'investment_highlight': pd.investment_highlight,
                            'equity_price': pd.equity_price,
                            'lp_equity_percent': pd.lp_equity_percent,
                            'gp_equity_percent': pd.gp_equity_percent,
                            'debt_percent': pd.debt_percent,
                            'short_title': pd.short_title,
                            'description': pd.description,
                            'bussiness_plan': pd.bussiness_plan,
                            'minimum_investment': pd.minimum_investment,
                            'investment_strategy': pd.investment_strategy,
                            'expected_period': pd.expected_period,
                            'financed': pd.financed,
                            'target_return_on_cost': pd.target_return_on_cost,
                            'target_irr': pd.target_irr,
                            'offered_by': pd.offered_by,
                            'estimated_first_distribution': pd.estimated_first_distribution,
                            'type_of_investment': pd.type_of_investment,
                            'phone_number': pd.phone_number,
                            'measure_of_multiplier': pd.measure_of_multiplier,
                            'address': pd.address,
                            'minimum_goal': pd.minimum_goal,

                            'nominal_share_price': pd.nominal_share_price,
                            'the_valuation': pd.the_valuation,
                            'minimum_drawing': pd.minimum_drawing,

                            'no_of_drawings': pd.no_of_drawings,
                            'share_for_sale': pd.share_for_sale,
                            'remaining_share': pd.remaining_share,
                            'maximum_drawing': pd.maximum_drawing,
                            'short_description': pd.short_description,
                            'why_invest': pd.why_invest,
                            'problem_to_be_solved': pd.problem_to_be_solved,
                            'our_solution': pd.our_solution,
                            'start_date_data': pd.start_date_data,
                            'end_date_data': pd.end_date_data,
                            'number_of_share': pd.number_of_share,
                            'issue_minimum_investment': pd.issue_minimum_investment,
                            'issue_maximum_investment': pd.issue_maximum_investment,
                            'value_before_issue': pd.value_before_issue,
                            'raised_capital_minimum_limit': pd.raised_capital_minimum_limit,
                            'raised_capital_maximum_limit': pd.raised_capital_maximum_limit,
                            'share_of_company_sold_minimum_limit': pd.share_of_company_sold_minimum_limit,
                            'share_of_company_sold_maximum_limit': pd.share_of_company_sold_maximum_limit,
                            'self_report': pd.self_report,
                            'discussion_description': pd.discussion_description,
                            'new_exisiting_details': pd.new_exisiting_details,
                            'drawing_on_behalf': pd.drawing_on_behalf,
                            'foundation': pd.foundation,
                            'satutes': pd.satutes,
                            'annual_account': pd.annual_account,
                            'valuation': pd.valuation,
                            'agreement_on_co': pd.agreement_on_co,
                            'conversion_of_debt': pd.conversion_of_debt,
                            'balance_sheet': pd.balance_sheet,
                            'result_report': pd.result_report,
                            'location': pd.location,
                            'country': pd.country,
                            'state': pd.state,
                            'city': pd.city,
                            'zip_code': pd.postal_code,
                            'landmark': pd.landmark,
                            'latitude': pd.latitude,
                            'longitude': pd.longitude,
                            'status': pd.status,
                            'agency': pd.agency.id if pd.agency else None,
                            'subscription_type': pd.subscription_type,
                            'start_date': pd.start_date,
                            'end_date': pd.end_date,
                            'status':status_info,
                              'is_ad_featured':pd.is_featured,
                            'type':"property_developers",
                    })
            if companySeeking:
                for cs in companySeeking:
                    if cs.status == 0:
                        status_info = "Pending"
                    elif cs.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': cs.id,
                        'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                        'company_name': cs.company_name,
                        'short_title': cs.short_title,
                        'description': cs.description,
                        'about_the_owner': cs.about_the_owner,
                        'image_data': ast.literal_eval(cs.property_image),
                        'videos': cs.property_video,
                        'videos_thumbnail': cs.videos_thumbnail,
                        'company_logo': cs.company_logo,
                        'maximum_drawing': cs.maximum_drawing,
                        'minimum_drawing': cs.minimum_drawing,
                        'share_for_sale': cs.share_for_sale,
                        'price_per_share': cs.price_per_share,
                        'filter_price': cs.price_per_share,
                        'number_of_share': cs.number_of_share,
                        'self_report': cs.self_report,
                        'nominal_share_price': cs.nominal_share_price,
                        'e_post': cs.e_post,
                        'issue_account_number': cs.issue_account_number,
                        'establish_year': cs.establish_year,
                        'premises_from': cs.premises_from,
                        'background_for_sale': cs.background_for_sale,
                        'company_website': cs.company_website,
                        'number_of_employee': cs.number_of_employee,
                        'company_email': cs.company_email,
                        'company_telephone': cs.company_telephone,
                        'youtube': cs.youtube,
                        'upload_team_data': cs.upload_team_data,
                        'upload_team_name': cs.upload_team_name,
                        'upload_team_size': cs.upload_team_size,
      
                        'upload_board_data': cs.upload_board_data,
                        'upload_board_name': cs.upload_board_name,
                        'upload_board_size': cs.upload_board_size,
      
                        'upload_partner_data': cs.upload_partner_data,
                        'upload_partner_name': cs.upload_partner_name,
                        'upload_partner_size': cs.upload_partner_size,
                        'location': cs.location,
                        'country': cs.country,
                        'state': cs.state,
                        'city': cs.city,
                        'zip_code': cs.zip_code,
                        'landmark': cs.landmark,
                        'share_holder_image': cs.share_holder_image,
                        'enter_shares': cs.enter_shares,
                        'status': cs.status,
                        'agency': cs.agency.id if cs.agency else None,
                        'subscription_type': cs.subscription_type,
                        'latitude': cs.latitude,
                        'longitude': cs.longitude,
                        'start_date': cs.start_date,
                        'end_date': cs.end_date,
                        # 'is_favourite': cs.is_favourite,
                        # 'favourite_date': cs.favourite_date,
                        # 'is_favourite':favourite,
                        'is_ad_featured':cs.is_featured,
                        'status':status_info,
                        'type':"companySeeking"
                    })
            if saleProperty:

                for salelist in saleProperty:
                    if salelist.status == 0:
                        status_info = "Pending"
                    elif salelist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':salelist.id,
                        'title':salelist.title,
                        'image_data':ast.literal_eval(salelist.image_data),
                        'price':salelist.price,
                        'descriptioon':salelist.descriptioon,
                        'latitude':salelist.latitude,
                        'longitude':salelist.longitude,
                        'location':salelist.location,
                        'property_demension':salelist.property_demension,
                        'filter_price':salelist.price,
                        'bedrooms':salelist.bedrooms,
                        'bathrooms':salelist.bathrooms,
                        'created_date':salelist.created_at,
                        'location':salelist.location,
                        'created_date':salelist.created_at,
                        'type':"SaleProperty",
                          'is_ad_featured':salelist.is_featured,
                        'status':status_info,
                    }
                    allData.append(alldata)
            if rentProperty:
                for rentlist in rentProperty:
                    if rentlist.status == 0:
                        status_info = "Pending"
                    elif rentlist.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    alldata = {
                        'id':rentlist.id,
                        'title':rentlist.title,
                        'image_data':ast.literal_eval(rentlist.image_data),
                        'video':rentlist.video,
                        'rooms':rentlist.rooms,
                        'bedrooms':rentlist.bedrooms,
                        'size':rentlist.size,
                        'country': rentlist.country,
                        'state': rentlist.state,
                        'city': rentlist.city,
                        'postal_code':rentlist.postal_code,
                        'landmark': rentlist.landmark,
                        'house_number': rentlist.house_number,
                        'filter_price':rentlist.monthly_rent,
                        'rental_period':rentlist.rental_period,
                        'heading':rentlist.heading,
                        'name_of_ad':rentlist.name_of_ad,
                        'visibilty':rentlist.visibilty,
                        'location':rentlist.location,
                        'latitude':rentlist.latitude,
                        'longitude':rentlist.longitude,
                        'type':"RentProperty",
                          'is_ad_featured':rentlist.is_featured,
                        'status':status_info,
                    }
                    allData.append(alldata)
            if bussinessSale:
                for bs in bussinessSale:
                    allData.append({
                        'id': bs.id,
                        'customer_name' : bs.customerId.firstName +' '+ bs.customerId.lastName,
                        'company_name': bs.company_name,
                        'short_title': bs.short_title,
                        'image_data':  ast.literal_eval(bs.image_data),
                        'videos': bs.videos,
                        'videos_thumbnail': bs.videos_thumbnail,
                        'company_name': bs.company_name,
                        'description': bs.description,
                        'total_turnover': bs.total_turnover,
                        'rent': bs.rent,
                        'established_year': bs.established_year,
                        'premises': bs.premises,
                        'years_of_work': bs.years_of_work,
                        'operation_concept': bs.operation_concept,
                        'operation_opening_hours': bs.operation_opening_hours,
                        'turnover_last_year': bs.turnover_last_year,
                        'salary_percentage': bs.salary_percentage,
                        'other_operating_cost': bs.other_operating_cost,
                          'filter_price':bs.cost,
                        'cost': bs.cost,
                        'reason_for_sale':bs.reason_for_sale,
                        'website_link':bs.website_link,
                        'number_of_employes':bs.number_of_employes,
                        'other_operating_cost':bs.other_operating_cost,
                        'area':bs.area,
                        'term_of_lease': bs.term_of_lease,
                        'document':ast.literal_eval(bs.document),
                        'details': bs.details,
                        'service':bs.service,
                        'operations':bs.operations,
                        'market_initatives':bs.market_initatives,
                        'advantage_and_oppurtunity':bs.advantage_and_oppurtunity,
                        'valuation':bs.valuation,
                        'owner_name':bs.owner_name,
                        'phone':bs.phone,
                        'telephone':bs.telephone,
                        'email':bs.email,
                        'company':bs.company,
                        'public_order':bs.public_order,
                        'avaiable_attachment':bs.avaiable_attachment,
                        'location':bs.location,
                        'latitude':bs.latitude,
                        'longitude':bs.longitude,    
                        'subscription_type':bs.subscription_type,
                        'created_date':bs.start_date,
                        'is_ad_featured':bs.is_featured,
                        'type':"BusinessSale"})
            if houseWantedRent:
                for hWr in houseWantedRent:
                    if hWr.status == 0:
                        status_info = "Pending"
                    elif hWr.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                        'id': hWr.id,
                        'short_title':hWr.short_title,
                        'customer_id':hWr.customerId.id,
                        'fullname': hWr.first_name+' '+ hWr.last_name,
                        'profile_visiblity':hWr.profile_visiblity,
                        'profile_hidden':hWr.profile_hidden,
                        'image_data': ast.literal_eval(hWr.image),
                        'first_name': hWr.first_name,
                        'last_name': hWr.last_name,
                        'gender': hWr.gender,
                        'dob': hWr.dob,
                        'nationality': hWr.nationality,
                        'phone_number':hWr.phone_number,
                        'email': hWr.email,
                        'quantity': hWr.quantity,
                        'rental_period': hWr.rental_period,
                        'max_rent': hWr.max_rent,
                        'from_date': hWr.from_date,
                        'housing_type':hWr.housing_type,
                        'number_of_people':hWr.number_of_people,
                          'filter_price':hWr.max_month_price,
                        'max_month_price': hWr.max_month_price,
                        'desired_start_date':hWr.desired_start_date,
                        'desired_area': hWr.desired_area,
                        'latitude':hWr.latitude,
                        'longitude':hWr.longitude,
                        'location':hWr.location,
                        'about':hWr.about,
                        'education':hWr.education,
                        'martial_status':hWr.martial_status,
                        'cleanliness':hWr.cleanliness,
                        'party_habits':hWr.party_habits,
                        'work':hWr.work,
                        'interest':hWr.interest,
                        'subscription_type':hWr.subscription_type,
                        'is_draft':hWr.is_draft,
                        'created_date':hWr.start_date,
                        'status':status_info,
                        'country':hWr.country,
                        'state':hWr.state,
                        'city':hWr.city,
                        'postal_code':hWr.postal_code,
                        'landmark':hWr.landmark,
                        'floor':hWr.floor,
                        'description':hWr.description,
                        'is_ad_featured':hWr.is_featured,
                        'type':"HouseRent"})
            if investmentProject:
                for ip in investmentProject:
                    
                    allData.append({'id':ip.id,
                        'customer_id':ip.customerId.id,
                        'fullname': ip.customerId.firstName+' '+ ip.customerId.lastName,
                        'property_name':ip.property_name,
                        'image_data':ast.literal_eval(ip.image_data),
                        'videos':ip.videos,
                        'documents_data':ip.documents_data,
                        'property_type':ip.property_type,
                        'assest_equality':ip.assest_equality,
                        'investment_highlight':ip.investment_highlight,
                        'filter_price':ip.equity_price,
                        'equity_price':ip.equity_price,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'gp_equity_percent':ip.gp_equity_percent,
                        'debt_percent':ip.debt_percent,
                        'property_at_glance_title':ip.property_at_glance_title,
                        'description':ip.description,
                        'bussiness_plan':ip.bussiness_plan,
                        'minimum_investment':ip.minimum_investment,
                        'investment_strategy':ip.investment_strategy,
                        'expected_attitude_price':ip.expected_attitude_price,
                        'financed':ip.financed,
                        'target_return_on_cost':ip.target_return_on_cost,
                        'target_irr':ip.target_irr,
                        'lp_equity_percent':ip.lp_equity_percent,
                        'offered_by':ip.offered_by,
                        'estimated_first_distribution':ip.estimated_first_distribution,
                        'type_of_investment':ip.type_of_investment,
                        'phone_number':ip.phone_number,
                        'measure_for_multiplier':ip.measure_for_multiplier,
                        'address':ip.address,
                        'location_details':ip.location_details,
                        # 'property_summary':ip.property_summary,
                        # 'property_details':ip.property_details,
                        # 'overview':ip.overview,
                        # 'debt_assumption':ip.debt_assumption,
                        'location':ip.location,
                        'latitude':ip.latitude,
                        'longitude':ip.longitude,
                        'status':ip.status,
                        'type':"InvestmentProject"})
            if investmentCompany:
                for ic in investmentCompany:
                    allData.append({'id':ic.id,
                         'title':ic.property_name,
                        'company_name':ic.property_name,
                        'image_data':ic.company_logo,
                        'description':ic.description,
                        'the_valuation':ic.the_valuation,
                        'nomial_share_price':ic.nominal_share_price,
                        'filter_price':ic.nominal_share_price,
                        'created_date':ic.start_date,
                        'type':"InvestmentCompany"})
            if propertyProject:
                for pp in propertyProject:
                    if pp.status == 0:
                        status_info = "Pending"
                    elif pp.status == 1:
                        status_info = "Approved"
                    else:
                        status_info = "Disapproved"
                    allData.append({
                          'id': pp.id,
                        'customer_id':pp.customerId.id,
                        'fullname': pp.customerId.firstName+' '+ pp.customerId.lastName,
                        'spend_too_much_time':pp.spend_too_much_time,
                        'most_useless_skill':pp.most_useless_skill,
                        'fun_act':pp.fun_act,
                        'biography':pp.biography,
                        'short_title':pp.short_title,
                        'property_overview':pp.property_overview,
                        'property_description':pp.property_description,
                        'image_data':ast.literal_eval(pp.image_data),
                        'videos':pp.videos,
                        'property_document':pp.property_document,
                        'category':pp.category,
                        'property_name':pp.property_name,
                        'property_dimension':pp.property_dimension,
                        'country':pp.country,
                        'state':pp.state,
                        'city':pp.city,
                        'postal_code':pp.postal_code,
                        'landmark':pp.landmark,
                        'house_number':pp.house_number,
                        'location':pp.location,
                        'latitude':pp.latitude,
                        'longitude':pp.longitude,
                        'facility':pp.facility,
                        'benefits':pp.benefits,
                        'return_on_investment':pp.return_on_investment,
                        'finder_fee':pp.finder_fee,
                        'gross_income':pp.gross_income,
                        'price':pp.price,
                        'cashflow_pcm':pp.cashflow_pcm,
                        'total_termination_fee':pp.total_termination_fee,
                        'purchase_price':pp.purchase_price,
                        'potential_cashflow_pcm':pp.potential_cashflow_pcm,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'investment_return_on_investment_fee':pp.investment_return_on_investment_fee,
                        'rental':pp.rental,
                        'the_vision':pp.the_vision,
                        'cost_to_consider':pp.cost_to_consider,
                        'capital_required':pp.capital_required,
                        'cashflow_forecast':pp.cashflow_forecast,
                        'investment_finder_fee':pp.investment_finder_fee,
                        'is_draft':pp.is_draft,
                          'filter_price':pp.price,
                           'created_date':pp.start_date,
                        'subscription_type':pp.subscription_type,
                        'status':status_info,
                          'is_ad_featured':pp.is_featured,
                           'type':"PropertyProject"
                        })


            return Response({'status_code':status.HTTP_200_OK,'message':'Success','recently_added':allData},status=status.HTTP_200_OK)


class PayAdminCut(APIView):
    def post(self, request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj = Customer.objects.filter(user=user_id).first()
            else:
                customerObj = None

            seeking_id = request.data.get('property_id')
            if not seeking_id:
                return Response({'message': 'seeking_id is required'}, status=status.HTTP_400_BAD_REQUEST)

            price = request.data.get('price')
            if not price:
                return Response({'message': 'Price is required'}, status=status.HTTP_400_BAD_REQUEST)
            
            currency = request.data.get('currency')
            stripe.api_key = settings.STRIPE_SECRET_KEY
            payment_token = request.data.get('payment_token')
            property_type = request.data.get('property_type')

            if not payment_token:
                return Response({'message': 'Payment token is required'}, status=status.HTTP_400_BAD_REQUEST)

            if not property_type:
                return Response({'message': 'Property type is required'}, status=status.HTTP_400_BAD_REQUEST)
            try:
                charge = stripe.Charge.create(
                    amount=int(price) * 100,
                    currency=currency,
                    source=payment_token,
                    description='Admin cut payment'
                )
            except stripe.error.CardError as e:
                # Handle card errors (e.g., declined cards, etc.)
                return Response({'status_code': 400, 'status_message': str(e)}, status=status.HTTP_400_BAD_REQUEST)
            except stripe.error.RateLimitError as e:
                # Handle rate limit errors
                return Response({'status_code': 429, 'status_message': str(e)}, status=status.HTTP_429_TOO_MANY_REQUESTS)
            except stripe.error.InvalidRequestError as e:
                # Handle invalid requests, e.g., wrong token
                return Response({'status_code': 400, 'status_message': f"Invalid request: {str(e)}"}, status=status.HTTP_400_BAD_REQUEST)
            except stripe.error.AuthenticationError as e:
                # Handle authentication errors
                return Response({'status_code': 401, 'status_message': f"Authentication error: {str(e)}"}, status=status.HTTP_401_UNAUTHORIZED)
            except stripe.error.APIConnectionError as e:
                # Handle API connection errors
                return Response({'status_code': 502, 'status_message': f"API connection error: {str(e)}"}, status=status.HTTP_502_BAD_GATEWAY)
            except stripe.error.StripeError as e:
                # Handle general Stripe errors
                return Response({'status_code': 500, 'status_message': f"Stripe error: {str(e)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
            except Exception as e:
                # Handle any other errors
                return Response({'status_code': 500, 'status_message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


            if charge:
                if property_type == "seeking_equity":
                    company_seeking_payment_status = CompanySeekingEquity.objects.filter(id=seeking_id).first()
                    if company_seeking_payment_status:
                        company_seeking_payment_status.payment_done = True
                        company_seeking_payment_status.payment_currency_type=currency
                        company_seeking_payment_status.save()
                        return Response({'status_code': status.HTTP_200_OK, 'message': 'Payment successful for Company Seeking and status updated'}, status=status.HTTP_200_OK)
                    else:
                        return Response({'message': 'Company Seeking not found'}, status=status.HTTP_404_NOT_FOUND)

                elif property_type == "property_developers":
                    property_developer = PropertyDevelopers.objects.filter(id=seeking_id).first()
                    if property_developer:
                        property_developer.payment_done = True
                        property_developer.save()
                        property_developer.payment_currency_type=currency
                        return Response({'status_code': status.HTTP_200_OK, 'message': 'Payment successful for Property Developer and status updated'}, status=status.HTTP_200_OK)
                    else:
                        return Response({'message': 'Property Developer not found'}, status=status.HTTP_404_NOT_FOUND)

                elif property_type == "business_for_sale":
                    business_for_sale = BussinessForSale.objects.filter(id=seeking_id).first()
                    if business_for_sale:
                        business_for_sale.payment_done = True
                        business_for_sale.payment_currency_type=currency
                        business_for_sale.save()
                        
                        return Response({'status_code': status.HTTP_200_OK, 'message': 'Payment successful for Business Sale and status updated'}, status=status.HTTP_200_OK)
                    else:
                        return Response({'message': 'Business for Sale not found'}, status=status.HTTP_404_NOT_FOUND)

                elif property_type == "PropertyProject":
                    property_project = PropertyProject.objects.filter(id=seeking_id).first()
                    if property_project:
                        property_project.payment_done = True
                        property_project.payment_currency_type=currency
                        try:
                            print(seeking_id,'------------')
                            finder_fee_status_change = inquirePropertyProject.objects.filter(property_project_id=seeking_id, property_type='PropertyProject').first()
                            if finder_fee_status_change:
                                finder_fee_status_change.finder_free_status = 'completed'
                                finder_fee_status_change.save()
                            else:
                                print("No matching finder fee status found.")
                        except Exception as e:
                            print(e,'-------------')
                            ...
                        property_project.save()
                        return Response({'status_code': status.HTTP_200_OK, 'message': 'Payment successful for Property Project and status updated'}, status=status.HTTP_200_OK)
                    else:
                        return Response({'message': 'Property Project not found'}, status=status.HTTP_404_NOT_FOUND)
            else:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'message': 'Payment failed'}, status=status.HTTP_400_BAD_REQUEST)

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



class payDoItByReeipo(APIView):
    def post(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            property_type = "do_it_by_reepio"

            payment_token = request.data.get('payment_token')
            price = request.data.get('price')
            form_id = request.data.get('form_id')

            if not payment_token:
                return Response({'message':'payment_token is required'},status=status.HTTP_400_BAD_REQUEST)
            stripe.api_key =settings.STRIPE_SECRET_KEY
            today = datetime.today()
            charge = stripe.Charge.create(
                amount=int(price) * 100,
                currency='usd',
                source=payment_token,
                description='Do it by reepio'
            )

            if charge:
                new_data = CustomersFeatureAdsHistory.objects.create(customer=customerObj,payment_date= today,property_type=property_type,is_active=True)
                allrequests_obj = DoItByReeipoRequests.objects.filter(id=form_id).update(payment_status=True)
                print(charge)
                return Response({'status_code':status.HTTP_200_OK,'message':'Success'},status=status.HTTP_200_OK)
            else:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Success'},status=status.HTTP_400_BAD_REQUEST)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)





class FillDoitReeipoForm(APIView):
    def post(self,request):
        # try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            full_name = request.data.get('full_name')
            property_project = request.data.get('property_project')
            email_address = request.data.get('email_address')
            business_for_sale = request.data.get('business_for_sale')
            phone_number = request.data.get('phone_number')
            property_type = request.data.get('property_type')
            category = request.data.get('category')
            property_image = request.data.get('property_image')
            print(property_image)
            property_video = request.data.get('property_video')
            property_doc = request.data.get('property_doc')
            property_name = request.data.get('property_name')
            signature = request.data.get('signature')
            payment_status = request.data.get('payment_status')
            if not full_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'full_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email_address:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'email_address is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not business_for_sale:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'business_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone_number:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not category:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_image:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_image is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_video:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_doc:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_doc is required'},status=status.HTTP_400_BAD_REQUEST)
            if not signature:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'signature is required'},status=status.HTTP_400_BAD_REQUEST)
            
            create_obj=DoItByReeipoRequests.objects.create(customer=customerObj,name=full_name,property_type=category,email=email_address,mobile_number=phone_number,property_image=property_image,property_video=property_video,property_doc=property_doc,property_name=property_name,status="Pending",buyer_signature=signature,payment_status=False,do_it_by_type='reeipo')


            return Response({'status_code':status.HTTP_200_OK,'message':'Success','id':create_obj.id},status=status.HTTP_200_OK)

        # except Exception as e:
        #     print(e)
        #     return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class FillDoitAgencyForm(APIView):
    def post(self,request):
        # try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0

            
            full_name = request.data.get('full_name')
            email_address = request.data.get('email_address')
            phone_number = request.data.get('phone_number')
            amount=request.data.get('amount')
            category = request.data.get('category')
            property_video = request.data.get('property_video')
            property_doc = request.data.get('property_doc')
            property_image = request.data.get('property_image')
            property_name = request.data.get('property_name')



            payment_status = request.data.get('payment_status')
            if not full_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'full_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email_address:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'email_address is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not business_for_sale:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'business_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone_number:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not category:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_image:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_image is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_video:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_doc:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_doc is required'},status=status.HTTP_400_BAD_REQUEST)
            if not amount:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'amount is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
            
            create_obj=DoItByReeipoRequests.objects.create(customer=customerObj,name=full_name,property_type=category,email=email_address,mobile_number=phone_number,property_image=property_image,property_video=property_video,property_doc=property_doc,property_name=property_name,status="Pending",payment_status=False,do_it_by_type='agency',price=amount)


            return Response({'status_code':status.HTTP_200_OK,'message':'Success','id':create_obj.id},status=status.HTTP_200_OK)

        # except Exception as e:
        #     print(e)
        #     return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class MyDoItReeipoFormListings(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]
            allrequests_obj = DoItByReeipoRequests.objects.filter(customer=customerObj,payment_status=True,do_it_by_type='reeipo').order_by('start_date')
            page = self.request.query_params.get('page')
            if not page:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            page_per_data = self.request.query_params.get('page_per_data') 
            if not page_per_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            total_count =  DoItByReeipoRequests.objects.filter(end_date__isnull = True).count()
            paginator = Paginator(allrequests_obj, page_per_data)
            try:
                allrequests_obj = paginator.page(page)
            except PageNotAnInteger:
                allrequests_obj = paginator.page(1)
            except EmptyPage:
                allrequests_obj = paginator.page(paginator.num_pages)
            price= SetdoitbyReeipoPrice.objects.last()
            if price :
                price=price.price
            else:
                price="N/A"
            count=0
            for data in allrequests_obj:
                count+=1
                print('in loop')
                print("--------------------------")
                print(data.property_doc)
                print("----------------")
                print(data.property_video)

                all_data.append({
                    'id':data.id,
                    'name':data.name,
                    'property_type':data.property_type,
                    'email':data.email,
                    'mobile_number':data.mobile_number,
                    'property_image': ast.literal_eval(data.property_image) if data.property_image else None,
                    'property_video': str(data.property_video) if data.property_video else None,
                    'property_doc': str(data.property_doc) if data.property_doc else None,
                    'price':price,
                    'submitted_date':data.start_date,
                    'property_name':data.property_name,
                    'property_id':data.property_id,
                    'status':data.status,
                    'signature':data.buyer_signature
                })


            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched Successfully','data':all_data,'total':count},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class MyDoItReeipoDetail(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]
            reeipo_form_id=self.request.query_params.get('reeipo_form_id')
            if not reeipo_form_id:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            allrequests_obj = DoItByReeipoRequests.objects.filter(id=reeipo_form_id,payment_status=True,do_it_by_type='reeipo')
            # page = self.request.query_params.get('page')
            # if not page:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            # page_per_data = self.request.query_params.get('page_per_data') 
            # if not page_per_data:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            # total_count =  DoItByReeipoRequests.objects.filter(end_date__isnull = True).count()
            # paginator = Paginator(allrequests_obj, page_per_data)
            # try:
            # 	allrequests_obj = paginator.page(page)
            # except PageNotAnInteger:
            # 	allrequests_obj = paginator.page(1)
            # except EmptyPage:
            # 	allrequests_obj = paginator.page(paginator.num_pages)
            price= SetdoitbyReeipoPrice.objects.last()
            if price :
                price=price.price
            else:
                price="N/A"
            for data in allrequests_obj:
                print('in loop')
                print("--------------------------")
                print(data.property_doc)
                print("----------------")
                print(data.property_video)
         
                all_data.append({
                    'id':data.id,
                    'name':data.name,
                    'property_type':data.property_type,
                    'email':data.email,
                    'mobile_number':data.mobile_number,
                    'property_image':ast.literal_eval(data.property_image) if data.property_image else None,
                    'property_video': str(data.property_video) if data.property_video else None,
                    'property_doc': str(data.property_doc) if data.property_doc else None,
                    'price':price,
                    'submitted_date':data.start_date,
                    'property_name':data.property_name,
                    'property_id':data.property_id,
                    'status':data.status,
                    'signature':data.buyer_signature
                })


            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched Successfully','data':all_data[0]},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class MyDoItAgencyFormListings(APIView):
    def get(self,request):
        # try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]
            allrequests_obj = DoItByReeipoRequests.objects.filter(customer=customerObj,do_it_by_type='agency').order_by('start_date')
            page = self.request.query_params.get('page')

            if not page:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            page_per_data = self.request.query_params.get('page_per_data') 
            if not page_per_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            total_count =  DoItByReeipoRequests.objects.filter(end_date__isnull = True).count()
            paginator = Paginator(allrequests_obj, page_per_data)
            try:
                allrequests_obj = paginator.page(page)
            except PageNotAnInteger:
                allrequests_obj = paginator.page(1)
            except EmptyPage:
                allrequests_obj = paginator.page(paginator.num_pages)
            price= SetdoitbyReeipoPrice.objects.last()
            if price :
                price=price.price
            else:
                price="N/A"
            count=0
            for data in allrequests_obj:
                count+=1
                print('in loop')
                print("--------------------------")
                print(data.property_doc)
                print("----------------")
                print(data.property_video)

                all_data.append({
                    'id':data.id,
                    'name':data.name,
                    'property_type':data.property_type,
                    'email':data.email,
                    'mobile_number':data.mobile_number,
                    'property_image': ast.literal_eval(data.property_image) if data.property_image else None,
                    'property_video': str(data.property_video) if data.property_video else None,
                    'property_doc': str(data.property_doc) if data.property_doc else None,
                    'price':price,
                    'submitted_date':data.start_date,
                    'property_name':data.property_name,
                    'property_id':data.property_id,
                    'status':data.status,
                    'signature':data.buyer_signature
                    
                })


            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched Successfully','data':all_data,'total':count},status=status.HTTP_200_OK)
        
        # except Exception as e:
        #     print(e)
        #     return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class MyDoItAgencyDetail(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]
            reeipo_form_id=self.request.query_params.get('reeipo_form_id')
            if not reeipo_form_id:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            allrequests_obj = DoItByReeipoRequests.objects.filter(id=reeipo_form_id,do_it_by_type='agency')
            # page = self.request.query_params.get('page')
            # if not page:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            # page_per_data = self.request.query_params.get('page_per_data') 
            # if not page_per_data:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            # total_count =  DoItByReeipoRequests.objects.filter(end_date__isnull = True).count()
            # paginator = Paginator(allrequests_obj, page_per_data)
            # try:
            # 	allrequests_obj = paginator.page(page)
            # except PageNotAnInteger:
            # 	allrequests_obj = paginator.page(1)
            # except EmptyPage:
            # 	allrequests_obj = paginator.page(paginator.num_pages)
            price= SetdoitbyReeipoPrice.objects.last()
            if price :
                price=price.price
            else:
                price="N/A"
            for data in allrequests_obj:
                print('in loop')
                print("--------------------------")
                print(data.property_doc)
                print("----------------")
                print(data.property_video)

                all_data.append({
                    'id':data.id,
                    'name':data.name,
                    'property_type':data.property_type,
                    'email':data.email,
                    'mobile_number':data.mobile_number,
                    'property_image':ast.literal_eval(data.property_image) if data.property_image else None,
                    'property_video': str(data.property_video) if data.property_video else None,
                    'property_doc': str(data.property_doc) if data.property_doc else None,
                    'price':price,
                    'submitted_date':data.start_date,
                    'property_name':data.property_name,
                    'property_id':data.property_id,
                    'status':data.status,
                    'signature':data.buyer_signature
                })


            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched Successfully','data':all_data[0]},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class FillBuyPropertyForm(APIView):
    def post(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]
            first_name = request.data.get('first_name')
            last_name = request.data.get('last_name')
            gender = request.data.get('gender')
            dob = request.data.get('dob')
            email = request.data.get('email')
            property_id = request.data.get('property_id')
            property_type = request.data.get('property_type')
            customer_id=request.data.get('customer_id')
            
            if not first_name:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'first_name  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not last_name:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'last_name  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not gender:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'gender is required'},status=status.HTTP_400_BAD_REQUEST)
            if not dob:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'dob is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'email id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_id:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_type:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_type is required'},status=status.HTTP_400_BAD_REQUEST)

            get_user=Customer.objects.filter(id=customer_id).first()
            if property_type=='sale_rent_property':
                get_property = SaleAndRentProperty.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,sale_rent_property=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)
            
            elif property_type=='sale_property':
                get_property = SaleProperty.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,sale_property=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)

            elif property_type=='rent_property':
                get_property = RentProperty.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,rent_property=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)
            elif property_type=='bussiness_for_sale':
                get_property = BussinessForSale.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,bussiness_for_sale=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)
    
            elif property_type=='house_wanted_for_rent':
                get_property = HouseWantedForRent.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,house_wanted_for_rent=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)

            elif property_type=='investment_my_project':
                get_property = InvestmentMyProject.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,investment_my_project=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)

            elif property_type=='investment_my_company':
                get_property = InvestmentMyCompany.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,investment_my_company=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)

            elif property_type=='property_project':
                get_property = PropertyProject.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,property_project=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)


            elif property_type=='company_seeking_equity':
                get_property = CompanySeekingEquity.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,company_seeking_equity=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)

            elif property_type=='property_developers':
                get_property = PropertyDevelopers.objects.filter(id=property_id).first()
                fill_form  = FillRequestBuyPropertyForm.objects.create(request_from=customerObj,request_to=get_user,property_developers=get_property,first_name=first_name,last_name=last_name,gender=gender,dob=dob,email=email)


            return Response({'status_code':status.HTTP_200_OK,'message':'Created Successfully'},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class MyLeads(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]

            allrequests_obj = FillRequestBuyPropertyForm.objects.filter(request_from=customerObj)

            property_type = self.request.query_params.get('property_type')
            page = self.request.query_params.get('page')
            if not page:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
            page_per_data = self.request.query_params.get('page_per_data') 
            if not page_per_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
            total_count =  DoItByReeipoRequests.objects.filter(end_date__isnull = True).count()
            paginator = Paginator(allrequests_obj, page_per_data)
            try:
                allrequests_obj = paginator.page(page)
            except PageNotAnInteger:
                allrequests_obj = paginator.page(1)
            except EmptyPage:
                allrequests_obj = paginator.page(paginator.num_pages)

            allrequests_obj = FillRequestBuyPropertyForm.objects.filter(request_to=customerObj)
            all_data = []

            for data in allrequests_obj:
                if property_type=='PropertyProject':
                    all_data.append({
                        'property_project': data.property_project.title if data.property_project else None,
                        'property_project_image': data.property_project.image_data if data.property_project else None})
                
                if property_type=='SaleProperty':
                    all_data.append({
                        'sale_property': data.sale_property.title if data.sale_property else None,
                        'sale_property_image': data.sale_property.image_data if data.sale_property else None,
                    })
                if property_type=='RentProperty':
                    all_data.append({
                        'rent_property': data.rent_property.title if data.rent_property else None,
                        'rent_property_image': data.rent_property.image_data if data.rent_property else None,
                    })
                if property_type=='HouseRent':
                    all_data.append({
                        'house_wanted_for_rent': data.house_wanted_for_rent.title if data.house_wanted_for_rent else None,
                        'house_wanted_for_rent_image': data.house_wanted_for_rent.image_data if data.house_wanted_for_rent else None,
                    })
                if property_type=='BusinessSale':
                    all_data.append({
                        'bussiness_for_sale': data.bussiness_for_sale.title if data.bussiness_for_sale else None,
                        'bussiness_for_sale_image': data.bussiness_for_sale.image_data if data.bussiness_for_sale else None,

                    })
                if property_type=='PropertyDevelopers':
                    all_data.append({
                        'property_developers': data.property_developers.title if data.property_developers else None,
                        'property_developers_image': data.property_developers.image_data if data.property_developers else None,
                    })
                if property_type=='SeekingEquity':
                    all_data.append({
                        'company_seeking_equity': data.company_seeking_equity.title if data.company_seeking_equity else None,
                        'company_seeking_equity_image': data.company_seeking_equity.image_data if data.company_seeking_equity else None,
                    })
                if property_type=='InvestmentMyProject':
                    all_data.append({
                        'investment_my_project': data.investment_my_project.title if data.investment_my_project else None,
                        'investment_my_project_image': data.investment_my_project.image_data if data.investment_my_project else None,
                    })
                if property_type=='InvestmentMyCompany':
                    all_data.append({
                        'investment_my_company': data.investment_my_company.title if data.investment_my_company else None,
                        'investment_my_company_image': data.investment_my_company.image_data if data.investment_my_company else None,
                    })
                

                all_data.append({
                    'id': data.id,
                    'request_from': data.request_to.firstName if data.request_to else None,
                    'request_from_email': data.request_to.email if data.request_to else None,
                    'request_from_phoneNumber': data.request_to.phoneNumber if data.request_to else None,
                    'first_name': data.first_name,
                    'last_name': data.last_name,
                    'gender': data.gender,
                    'dob': data.dob,
                    'email': data.email,
                    'message': data.message,
                    'end_date': data.end_date,
                })




            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched Successfully','data':all_data},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class MyDeals(APIView):
    def get(self,request):
        # try:
        token = get_authorization_header(request)
        if token:
            decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
            user_id = decoded['user_id']
            customerObj=Customer.objects.filter(user=user_id).first()
        else:
            customerObj= 0
        all_data=[]
        allrequests_obj = FillRequestBuyPropertyForm.objects.filter(request_from=customerObj)

        page = self.request.query_params.get('page')
        if not page:
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page Number id is required'},status=status.HTTP_400_BAD_REQUEST)
        page_per_data = self.request.query_params.get('page_per_data') 
        if not page_per_data:
            return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page per data id is required'},status=status.HTTP_400_BAD_REQUEST)
        total_count =  DoItByReeipoRequests.objects.filter(end_date__isnull = True).count()
        paginator = Paginator(allrequests_obj, page_per_data)
        try:
            allrequests_obj = paginator.page(page)
        except PageNotAnInteger:
            allrequests_obj = paginator.page(1)
        except EmptyPage:
            allrequests_obj = paginator.page(paginator.num_pages)

        # allrequests_obj = FillRequestBuyPropertyForm.objects.filter(request_from=customerObj)

        all_data = []

        for data in allrequests_obj:
            all_data.append({
                # 'id': data.id,
                'request_to': data.request_to.firstName if data.request_from else None,
                'request_to_email': data.request_to.email if data.request_from else None,
                'request_to_phoneNumber': data.request_to.phoneNumber if data.request_from else None,

                # Sale Property
                # 'sale_property': data.sale_property.title if data.sale_property else None,
                'sale_property_image': data.sale_property.image_data if data.sale_property else None,

                # Sale Rent Property
                # 'sale_rent_property': data.sale_rent_property.title if data.sale_rent_property else None,
                'sale_rent_property_image': data.sale_rent_property.image_data if data.sale_rent_property else None,

                # Rent Property
                # 'rent_property': data.rent_property.title if data.rent_property else None,
                'rent_property_image': data.rent_property.image_data if data.rent_property else None,

                # Business for Sale
                # 'bussiness_for_sale': data.bussiness_for_sale.title if data.bussiness_for_sale else None,
                'bussiness_for_sale_image': data.bussiness_for_sale.image_data if data.bussiness_for_sale else None,

                # House Wanted for Rent
                # 'house_wanted_for_rent': data.house_wanted_for_rent.title if data.house_wanted_for_rent else None,
                'house_wanted_for_rent_image': data.house_wanted_for_rent.image_data if data.house_wanted_for_rent else None,

                # Investment My Project
                # 'investment_my_project': data.investment_my_project.title if data.investment_my_project else None,
                'investment_my_project_image': data.investment_my_project.image_data if data.investment_my_project else None,

                # Investment My Company
                # 'investment_my_company': data.investment_my_company.title if data.investment_my_company else None,
                'investment_my_company_image': data.investment_my_company.image_data if data.investment_my_company else None,

                # Property Project
                # 'property_project': data.property_project.title if data.property_project else None,
                'property_project_image': data.property_project.image_data if data.property_project else None,

                # Company Seeking Equity
                # 'company_seeking_equity': data.company_seeking_equity.title if data.company_seeking_equity else None,
                'company_seeking_equity_image': data.company_seeking_equity.image_data if data.company_seeking_equity else None,

                # Property Developers
                # 'property_developers': data.property_developers.title if data.property_developers else None,
                'property_developers_image': data.property_developers.image_data if data.property_developers else None,

                # Other fields from FillRequestBuyPropertyForm
                'first_name': data.first_name,
                'last_name': data.last_name,
                'gender': data.gender,
                'dob': data.dob,
                'email': data.email,
                'message': data.message,
                'end_date': data.end_date,
            })




        return Response({'status_code':status.HTTP_200_OK,'message':'Fetched Successfully','data':all_data},status=status.HTTP_200_OK)
        
        # except Exception as e:
        #     print(e)
        #     return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


from django.db import transaction
from django.db.models import Q

class FinalizeAgency(APIView):
    def post(self, request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj = Customer.objects.filter(user=user_id).first()
            else:
                customerObj = None

            property_type = request.data.get('property_type')
            final_amount = request.data.get('final_amount')
            customer_signature = request.data.get('customer_signature')
            request_id = request.data.get('request_id')

            if not property_type:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'property_type is required'}, status=status.HTTP_400_BAD_REQUEST)
            if not final_amount:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'final_amount is required'}, status=status.HTTP_400_BAD_REQUEST)
            if not customer_signature:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'customer_signature is required'}, status=status.HTTP_400_BAD_REQUEST)
            if not request_id:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'request_id is required'}, status=status.HTTP_400_BAD_REQUEST)

            with transaction.atomic():
                # Lock the row so two finalizations can't happen concurrently
                get_request = (
                    AgencyPropertyRequests.objects
                    .select_for_update()
                    .filter(id=request_id)
                    .first()
                )
                if not get_request:
                    return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'request not found'}, status=status.HTTP_400_BAD_REQUEST)
                if not get_request.customer:
                    return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'Customer not found'}, status=status.HTTP_400_BAD_REQUEST)
                if not get_request.agency:
                    return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'Agency not found'}, status=status.HTTP_400_BAD_REQUEST)

                # Create finalize record
                FinalizeAgencyTable.objects.create(
                    customer=get_request.customer,
                    agency=get_request.agency,
                    property_type=property_type,
                    property_image=get_request.property_image,
                    property_video=get_request.property_video,
                    property_doc=get_request.property_doc,
                    property_name=get_request.property_name,
                    final_amount=final_amount,
                    customer_signature=customer_signature,
                    agency_property_requests=get_request,
                    finalized_status="finalized by customer"
                )

                # Update the chosen request
                get_request.finalized_status = "finalized by customer"
                get_request.save(update_fields=["finalized_status"])

                # DELETE other requests with the same property_name
                if get_request.property_name:
                    (
                        AgencyPropertyRequests.objects
                        .filter(property_name=get_request.property_name)
                        .exclude(id=get_request.id)
                        .delete()
                    )

            return Response({'status_code': status.HTTP_200_OK, 'message': 'Created Successfully'}, status=status.HTTP_200_OK)

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






# class FinalizeAgency(APIView):
#     def post(self,request):
#         try:
#             token = get_authorization_header(request)
#             if token:
#                 decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
#                 user_id = decoded['user_id']
#                 customerObj=Customer.objects.filter(user=user_id).first()
#             else:
#                 customerObj= 0
#             all_data=[]
#             property_type = request.data.get('property_type')
#             final_amount = request.data.get('final_amount')
#             customer_signature = request.data.get('customer_signature')
#             request_id = request.data.get('request_id')
            
#             if not property_type:
#                  return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_type  is required'},status=status.HTTP_400_BAD_REQUEST)
#             if not final_amount:
#                  return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'final_amount  is required'},status=status.HTTP_400_BAD_REQUEST)
#             if not customer_signature:
#                  return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'customer_signature is required'},status=status.HTTP_400_BAD_REQUEST)
#             if not request_id:
#                  return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'request_id is required'},status=status.HTTP_400_BAD_REQUEST)

#             get_request=AgencyPropertyRequests.objects.filter(id=request_id).first()
#             if not get_request:
#                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'request not found'},status=status.HTTP_400_BAD_REQUEST)


#             if not get_request.customer :
#                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Cutomer not found'},status=status.HTTP_400_BAD_REQUEST)
#             if not get_request.agency:
#                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Agency not found'},status=status.HTTP_400_BAD_REQUEST)


#             FinalizeAgencyTable.objects.create(customer=get_request.customer,agency=get_request.agency,property_type=property_type,property_image=get_request.property_image,property_video=get_request.property_video,property_doc=get_request.property_doc,property_name=get_request.property_name,final_amount=final_amount,customer_signature=customer_signature,agency_property_requests=get_request,finalized_status="finalized by customer")
           
#             get_request.finalized_status="finalized by customer"
#             get_request.save()

#             return Response({'status_code':status.HTTP_200_OK,'message':'Created Successfully'},status=status.HTTP_200_OK)
        
#         except Exception as e:
#             print(e)
#             return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class Finalizelawyer(APIView):
    def post(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]
            # property_type = request.data.get('property_type')
            final_amount = request.data.get('final_amount')
            customer_signature = request.data.get('customer_signature')
            lawyer_id = request.data.get('lawyer_id')
            property_id = request.data.get('property_id')
            
            
            # if not property_type:
            #      return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_type  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not customer_signature:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'customer_signature is required'},status=status.HTTP_400_BAD_REQUEST)
          
            get_lawyer=Customer.objects.filter(id=lawyer_id).first()
            if not get_lawyer:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Lawyer not found'},status=status.HTTP_400_BAD_REQUEST)

            FinalizeLawyerTable.objects.create(customer=customerObj,lawyer=get_lawyer,customer_signature=customer_signature,status="pending",finalized_status="finalized by customer")
            

            return Response({'status_code':status.HTTP_200_OK,'message':'Created Successfully'},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class Finalizelawyer(APIView):
    def post(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]
            # property_type = request.data.get('property_type')
            final_amount = request.data.get('final_amount')
            customer_signature = request.data.get('customer_signature')
            lawyer_id = request.data.get('lawyer_id')
            contract_id = request.data.get('contract_id')
            
            # if not property_type:
            #      return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_type  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not customer_signature:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'customer_signature is required'},status=status.HTTP_400_BAD_REQUEST)
          
            get_lawyer=Customer.objects.filter(id=lawyer_id).first()
            if not get_lawyer:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Lawyer not found'},status=status.HTTP_400_BAD_REQUEST)
            
            check_deal=LawyerContractDeals.objects.filter(id=contract_id).first()

            FinalizeLawyerTable.objects.create(customer=customerObj,contract=check_deal,lawyer=get_lawyer,customer_signature=customer_signature,status="pending",finalized_status="finalized by customer")
            

            check_deal.req_status='finalized by customer'
            check_deal.save()

            return Response({'status_code':status.HTTP_200_OK,'message':'Created Successfully'},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class getFinalizedlawyer(APIView):
    def get(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]

          
            

            get_finalized=FinalizeLawyerTable.objects.filter(customer=customerObj)
            all_data = []

            for data in get_finalized:
                all_data.append({
                    'customer_id': data.customer.id if data.customer else None,
                    'customer_email': data.customer.email if data.customer else None,
                    # Email entered manually in the inquiry

                    'customer_phone_number': data.customer.phoneNumber if data.customer else None,
                    # Phone number entered manually in the inquiry

                    'customer_name': data.customer.firstName if data.customer else None,
                    'lawyer_id': data.lawyer.id if data.lawyer else None,
                    'lawyer_email': data.lawyer.email if data.lawyer else None,
                    # Email entered manually in the inquiry

                    'lawyer_phone_number': data.lawyer.phoneNumber if data.lawyer else None,
                    # Phone number entered manually in the inquiry

                    'final_amount': data.final_amount if data.final_amount else None,
                    'customer_signature': data.customer_signature if data.customer_signature else None,
                    'lawyer_signature': data.lawyer_signature if data.lawyer_signature else None,
                    'status': data.status if data.status else None,
                    'finalized_status': data.finalized_status if data.finalized_status
                     else None,
                })

            

            return Response({'status_code':status.HTTP_200_OK,'message':'Fetched Successfully','all_data':all_data},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)




class SendLawyerPropertyRequest(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            
            customerObj=Customer.objects.filter(user=uid).first()
            full_name = request.data.get('full_name')
            email_address = request.data.get('email_address')
            phone_number = request.data.get('phone_number')
            amount=request.data.get('amount')
            category = request.data.get('category')
            property_video = request.data.get('property_video')
            property_doc = request.data.get('property_doc')
            property_image = request.data.get('property_image')
            property_name = request.data.get('property_name')
            payment_status = request.data.get('payment_status')



            if not full_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'full_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not email_address:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'email_address is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not business_for_sale:
            # 	return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'business_for_sale is required'},status=status.HTTP_400_BAD_REQUEST)
            if not phone_number:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
            if not category:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'category is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_image:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_image is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_video:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_video is required'},status=status.HTTP_400_BAD_REQUEST)
            if not property_doc:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_doc is required'},status=status.HTTP_400_BAD_REQUEST)
            if not amount:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'amount is required'},status=status.HTTP_400_BAD_REQUEST)
            
            customer_lat = customerObj.latitude
            customer_long = customerObj.longitude
            lookups = Q()
            lat = float(customer_lat)
            long = float(customer_long)
            kmrange = 10
            lookups.add(Q(latitude__gte= (lat - kmrange/111.1),latitude__lte=(lat + kmrange/111.1),longitude__gte=(long - kmrange/111.1),longitude__lte=(long + kmrange/111.1)),Q.AND)
            lawyer_obj = Customer.objects.filter(lookups,loginUserType = "lawyer").exclude(id=customerObj.id)
            for lawyer in lawyer_obj:
                check_sub = LawyerSubscriptions.objects.filter(customer=lawyer).first()  
                if check_sub:
                    check_deal=LawyerPropertyRequests.objects.filter(customer=customerObj,mobile_number=phone_number,name=full_name,email=email_address,lawyer = lawyer,price=amount,property_name=property_name,property_type=category,property_image=property_image,property_video=property_video,property_doc=property_doc).first()
                    if not check_deal:
                        LawyerPropertyRequests.objects.create(customer=customerObj,mobile_number=phone_number,name=full_name,email=email_address,lawyer = lawyer,price=amount,property_name=property_name,property_type=category,property_image=property_image,property_video=property_video,property_doc=property_doc) 

            return Response({'status':status.HTTP_200_OK,'message':'Request sent successfully'},status=status.HTTP_200_OK)
        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 MyLawyerSendReceivedRequest(APIView):
    def get(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response(
                    {'status': status.HTTP_401_UNAUTHORIZED, 'message': str(e)},
                    status=status.HTTP_401_UNAUTHORIZED
                )

            customerObj = Customer.objects.filter(user=uid).first()
            if not customerObj:
                return Response(
                    {'status': status.HTTP_400_BAD_REQUEST, 'message': 'Customer not found'},
                    status=status.HTTP_400_BAD_REQUEST
                )

            # Fetch all requests this customer sent, and the linked lawyer in one go
            send_qs = (
                LawyerPropertyRequests.objects
                .filter(customer=customerObj)
                .select_related('lawyer')
            )

            # Pull all contracts for those requests in a single query
            req_ids = list(send_qs.values_list('id', flat=True))
            contracts = LawyerDoItPropertyContract.objects.filter(property_request_id__in=req_ids)

            # Map: property_request_id -> contract object (assuming at most one)
            contracts_by_req = {c.property_request_id: c for c in contracts}

            all_Data = []
            for req in send_qs:
                contract = contracts_by_req.get(req.id)

                contract_data = None
                if contract:
                    contract_data = {
                        'id': contract.id,
                        'contract_file': contract.contract_file,
                        'company_name': contract.company_name,
                        'full_name': contract.full_name,
                        'tasks': contract.tasks,
                        'owner_full_name': contract.owner_full_name,
                        'owner_email': contract.owner_email,
                        'owner_signature': contract.owner_signature,
                        'buyer_full_name': contract.buyer_full_name,
                        'buyer_email': contract.buyer_email,
                        'buyer_signature': contract.buyer_signature,
                        'status': contract.status,
                        'start_date': contract.start_date,
                        'end_date': contract.end_date,
                    }

                send_all_data = {
                    'id': req.id,
                    'mobile_number': req.mobile_number,
                    'email': req.email,
                    'name': req.name,
                    'property': req.property_type,
                    'lawyer_id': req.lawyer.id if req.lawyer else None,
                    'lawyer_image': getattr(req.lawyer, 'profileImage', None) if req.lawyer else None,
                    'lawyer_email': getattr(req.lawyer, 'email', None) if req.lawyer else None,
                    'lawyer_name': getattr(req.lawyer, 'firstName', None) if req.lawyer else None,
                    'lawyer_address': getattr(req.lawyer, 'address', None) if req.lawyer else None,
                    'is_contract_created': req.is_contract_created,
                    'req_status': req.status,

                    'contract': contract_data,
                }
                all_Data.append(send_all_data)

            return Response(
                {'status': status.HTTP_200_OK, 'message': 'success', 'data': all_Data},
                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 FinalizeDoItLawyer(APIView):
    def post(self,request):
        try:
            token = get_authorization_header(request)
            if token:
                decoded = jwt.decode(token, settings.SECRET_KEY,algorithms=["HS256"])
                user_id = decoded['user_id']
                customerObj=Customer.objects.filter(user=user_id).first()
            else:
                customerObj= 0
            all_data=[]
            customer_signature = request.data.get('customer_signature')
            contract_id = request.data.get('contract_id')

            if not customer_signature:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'customer_signature is required'},status=status.HTTP_400_BAD_REQUEST)
          
            if not contract_id:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'contract_id is required'},status=status.HTTP_400_BAD_REQUEST)
          

            check_deal=LawyerDoItPropertyContract.objects.filter(id=contract_id).first()            
            prop_obj = LawyerPropertyRequests.objects.filter(id = check_deal.property_request.id).first()


            prop_obj.status='finalized by customer and lawyer'
            prop_obj.buyer_signature = customer_signature
            prop_obj.save() 
            return Response({'status_code':status.HTTP_200_OK,'message':'Created Successfully'},status=status.HTTP_200_OK)
        
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)




class fetchCurrency(APIView):
    def get(self,request):
        currencyObj = CurrencyHandler.objects.all()
        all_Data = []
        for currency in currencyObj:
            all_data = {
                'id': currency.id,
                'symbol': currency.symbol,
                'name': currency.name,
                'converted_price': currency.converted_price,
            }
            all_Data.append(all_data)
        return Response({'status':status.HTTP_200_OK,'message': 'success', 'data': all_Data},status=status.HTTP_200_OK)

        

"""-------- added by rishu--------"""
class updatefinderfee(APIView):
    def post(self, request):
        property_Id = request.data.get("id")
        if not property_Id:
            return Response({"error": "Property Id is Required"}, status=status.HTTP_400_BAD_REQUEST)
        property_obj = inquirePropertyProject.objects.filter(property_project_id= property_Id).first()
        if property_obj:
            property_obj.finder_free_status = "completed"
            property_obj.save()
            return Response({'status':status.HTTP_200_OK,'message':'Status updated to completed'},status=status.HTTP_200_OK)
        else:
            return Response({"error": "Property Not Found"}, status=status.HTTP_404_NOT_FOUND)

        