from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from datetime import timedelta
from django.utils import timezone

from datetime import datetime
from django.conf import settings
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework_simplejwt.backends import TokenBackend
from rest_framework.authentication import get_authorization_header
import jwt
from rest_framework import exceptions
from .models import *
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.db.models import Q
from datetime import date
import datetime
from django.template.loader import render_to_string
from django.http.response import HttpResponse
import requests
from django.http import JsonResponse
from django.shortcuts import redirect
from customer_api.authentication import authenticated
from customer_api.models import *
import re
from admin_api.models import *
from customer_api.functions import *
from django.core import mail
from django.core.mail import EmailMultiAlternatives
from django.contrib.auth import authenticate
import ast
import json

from twilio.jwt.access_token.grants import (
    SyncGrant,
    ChatGrant,
    VideoGrant
)
from twilio.rest import Client
from twilio.jwt.access_token import AccessToken
from django.utils.timesince import timesince
from django.db.models.functions import TruncMonth
from django.db.models import Count,Avg
from customer_api.models  import FinalizeAgencyTable

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)

class AgncyRegister(APIView):
    def post(self,request):
        try:
            data = request.data
            company = data.get('company_name')
            first_name = data.get('first_name')
            last_name = data.get('last_name')
            email = data.get('email')
            password = data.get('password')
            loginUserType = data.get('loginUserType')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            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({'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 email:
                return Response({'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not password:
                return Response({'message':'password is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not state:
            #     return Response({'message':'state is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not house_number:
            #     return Response({'message':'house_number is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not street_name:
            #     return Response({'message':'street_name is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not region:
            #     return Response({'message':'region is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not city:
            #     return Response({'message':'city is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not zipcode:
            #     return Response({'message':'zipcode is required'},status=status.HTTP_400_BAD_REQUEST)
            # if not country:
            #     return Response({'message':'country 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 (re.search(regex,email)):
                return Response({'message':'Invalid Email'},status=status.HTTP_400_BAD_REQUEST)
            userObj = User.objects.filter(username=email).first()
            if userObj:
                return Response({"message":"The email is already registered"},status=status.HTTP_409_CONFLICT)
            else:
                userObj = User.objects.create_user(username = email, password = password)
                customerObj = Customer.objects.create(user=userObj,firstName=first_name,lastName=last_name,email=email,loginUserType=loginUserType,agency_company = company,longitude=longitude,latitude=latitude,house_number=house_number,street_name=street_name,region=region,city=city,zipcode=zipcode,country=country,address=address)
                AdminNotifications.objects.create(message= first_name+''+last_name+' agency has been successfully registered with us.',is_read=True,notification_type='new_agency_registered')
                print("here ")
                OTP=GernateOTP()
                print("here2")

                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)
                print("here 3")

                to_emails = customerObj.email
                subject = "Verify OTP:"

                message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                message.send(fail_silently=False)

                existing_sub = AgencySubscriptions.objects.filter(customer=customerObj).first()

                # if not existing_sub:
                #     basic_plan = AgencySubscriptionPlan.objects.filter(planName="Basic").first()

                #     if basic_plan:
                #         # Set start date as now
                #         start_date = timezone.now().date()
                #         # Set expiry date 30 days from start
                #         end_date = start_date + timedelta(days=30)

                #         # Create subscription with start and expiry date
                #         AgencySubscriptions.objects.create(
                #             customer=customerObj,
                #             plan=basic_plan,
                #             sub_start_date=start_date,
                #             sub_expiry_date=end_date,
                #             is_active=True
                #         )

                #         # Update customer has_subscription flag
                #         customerObj.has_subscription = True
                #         customerObj.save()
                isRoleAgency = data.get('isRoleAgency', False)

                if isRoleAgency:  
                    existing_sub = AgencySubscriptions.objects.filter(customer=customerObj).first()

                    if not existing_sub:
                        basic_plan = AgencySubscriptionPlan.objects.filter(planName="Basic").first()

                        if basic_plan:
                            start_date = timezone.now().date()
                            end_date = start_date + timedelta(days=30)

                            AgencySubscriptions.objects.create(
                                customer=customerObj,
                                plan=basic_plan,
                                sub_start_date=start_date,
                                sub_expiry_date=end_date,
                                is_active=True
                            )

                            customerObj.has_subscription = True
                            customerObj.save()

                else:
                    existing_sub = CustomersSubscriptions.objects.filter(customer=customerObj).first()

                    if not existing_sub:
                        basic_plan = FeatureAddPricing.objects.filter(name="Silver").first()

                        if basic_plan:
                            start_date = timezone.now().date()
                            end_date = start_date + timedelta(days=30)

                            CustomersFeatureAdsHistory.objects.create(
                                customer=customerObj,
                                plan=basic_plan,
                                is_active=True
                            )

                            customerObj.has_subscription = True
                            customerObj.save()

                refresh_token = RefreshToken.for_user(userObj)
                sub_data = AgencySubscriptions.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()
                print("here 4")
                if sub_data:
                    plan_id = sub_data.plan_id
                else:
                    plan_id = ""
                userData = {
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'company':customerObj.agency_company,
                    'email':customerObj.email,
                    'otp':customerObj.otp,
                    'email_verified':customerObj.emailVerified,
                    'customer_id':customerObj.id,
                    'has_subscription':customerObj.has_subscription,
                    'subscription_id':plan_id,
                }
                allData={
                    'refresh': str(refresh_token),
                    'access': str(refresh_token.access_token),
                    'user': userData
                    }

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

class AgencyemailVerifyOtp(APIView):
    def post(self, request):
        try:
            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({'message':'otp is required'},status=status.HTTP_400_BAD_REQUEST)
            if customerObj.otp != otp:
                return Response({'message':'Invalid Otp'},status=status.HTTP_400_BAD_REQUEST)
            customerObj.emailVerified = True
            customerObj.save()
            refresh_token = RefreshToken.for_user(userObj)
            sub_data = AgencySubscriptions.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()
            if sub_data:
                plan_id = sub_data.plan_id
            else:
                plan_id = ""
            userData = {
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'company':customerObj.agency_company,
                    'profile_image':customerObj.profileImage,
                    'email':customerObj.email,
                    'otp':customerObj.otp,
                    'email_verified':customerObj.emailVerified,
                    'isProfileCompleted':customerObj.isProfileCompleted,
                    'phoneVerified':customerObj.phoneVerified,
                    'customer_id':customerObj.id,
                    'has_subscription':customerObj.has_subscription,
                    'subscription_id':plan_id,

                }

            allData={
                    'refresh': str(refresh_token),
                    'access': str(refresh_token.access_token),
                    'user': userData
                    }
            return Response({'message':'OTP Verified','data':allData})
        except  Exception as e:
            return Response({"message":str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

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


class Agencylogin(APIView):
    def post(self,request):
        try:
            data = request.data
            email = data.get('email')
            password = data.get('password')
            if not email:
                return Response({'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not password:
                return Response({'message':'password is required'},status=status.HTTP_400_BAD_REQUEST)
            userObj = authenticate(username = email, password = password)
            if not userObj:
                return Response({'message':'email or password is incorrect'},status=status.HTTP_400_BAD_REQUEST)
            customerObj = Customer.objects.filter(user=userObj,loginUserType='agency').first()
            if not customerObj:return Response({'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 = {}
                to_emails = customerObj.email
                subject = "Verify OTP:"
                message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                message.send(fail_silently=False)
            refresh_token = RefreshToken.for_user(userObj)
            sub_data = AgencySubscriptions.objects.filter(customer=customerObj,is_active=True).order_by('-id').first()
            if sub_data:
                plan_id = sub_data.plan_id
            else:
                plan_id = ""

            userData = {
                    'first_name':customerObj.firstName,
                    'last_name':customerObj.lastName,
                    'company':customerObj.agency_company,
                    'email':customerObj.email,
                    'profile_image':customerObj.profileImage,
                    'isProfileCompleted':customerObj.isProfileCompleted,
                    'phoneVerified':customerObj.phoneVerified,
                    'email_verified':customerObj.emailVerified,
                    'customer_id':customerObj.id,
                    'has_subscription':customerObj.has_subscription,
                    'subscription_id':plan_id,
                    'loginUserType':customerObj.loginUserType,
                    'role':customerObj.loginUserType,
                }
            allData={
                    'refresh': str(refresh_token),
                    'access': str(refresh_token.access_token),
                    'user': userData
                    }

 
            return Response({'message':'Login Successfully','data':allData})

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


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

            allData = {}

            customerObj = Customer.objects.filter(user=uid).first()
            sub_data = AgencySubscriptions.objects.filter(customer=customerObj, is_active=True).order_by('-id').first()
            if sub_data:
                plan_id = sub_data.plan_id
            else:
                plan_id = ""
            if customerObj:
                allData.update({
                    'first_name': customerObj.firstName,
                    'last_name': customerObj.lastName,
                    'agency_company': customerObj.agency_company,
                    'email': customerObj.email,
                    'is_active': customerObj.is_active,
                    'profile_image': customerObj.profileImage,
                    'role': customerObj.loginUserType,
                    'isProfileCompleted': customerObj.isProfileCompleted,
                    'phoneVerified': customerObj.phoneVerified,
                    'customer_id': customerObj.id,
                    'has_subscription': customerObj.has_subscription,
                    'subscription_id': plan_id,
                    'phone_number': customerObj.phoneNumber,
                    'your_self':customerObj.bio,
                    'address':customerObj.address,
                    'latitude':customerObj.latitude,
                    'longitude':customerObj.longitude,
                })


            return Response({'message': 'Success', 'data': allData})
        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)
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            address = data.get('address')
            latitude = data.get('latitude')
            longitude = data.get('longitude')
            your_self = data.get('your_self')
            first_name = data.get('first_name')
            last_name = data.get('last_name')
            email = data.get('email')
            company = data.get('company')
            profile_image = data.get('profile_image')
            phone_number = data.get('phone_number')
            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 email:return Response({'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not address:return Response({'message':'address is required'},status=status.HTTP_400_BAD_REQUEST)
            if not your_self:return Response({'message':'your_self is required'},status=status.HTTP_400_BAD_REQUEST)
            if not company:return Response({'message':'company 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)

            customerObj.address = address
            customerObj.latitude = latitude
            customerObj.longitude = longitude
            customerObj.bio = your_self
            customerObj.firstName = first_name
            customerObj.lastName = 	last_name
            customerObj.email = email
            customerObj.profileImage = profile_image
            customerObj.agency_company = company
            customerObj.isProfileCompleted = True
            customerObj.phoneNumber = phone_number
            customerObj.save()
            AdminNotifications.objects.create(message= customerObj.firstName+''+customerObj.lastName+' agnecy has completed their profile',is_read=True,notification_type='complete_profile')
            return Response({'message':'Success'})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class AgencyPropertyRequest(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,loginUserType="agency").first()
            propertyObj =  AgencyPropertyRequests.objects.filter(location_agency = customerObj.id)
            propertyData = []
            for property in propertyObj:
                approved_requested = AgencyApprovedProperty.objects.filter(agency = customerObj.id,property_request = property.id)
                if approved_requested:
                    is_requested = True
                else:
                    is_requested = False

                data = {
                    'id':property.id,
                    'mobile_number':property.mobile_number,
                    'name':property.name,
                    'email':property.email,
                    'property_type':property.property_type,
                    'status':property.property_status,
                    'is_requested':is_requested,
                    'date':property.start_date,
                }
                propertyData.append(data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':propertyData,'has_subscription':customerObj.has_subscription})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class ApprovePropertyRequest(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,loginUserType="agency").first()
            property_id = request.data.get('property_id')
            if not property_id:
                return Response({'message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)
            property_obj = AgencyPropertyRequests.objects.filter(id= property_id).first()
            if not property_obj:
                return Response({'message':'Property request not found'},status=status.HTTP_400_BAD_REQUEST)
            request_customer = Customer.objects.filter(id=property_obj.customer.id).first()
            AgencyApprovedProperty.objects.create(agency_id = customerObj.id,customer = request_customer,property_request = property_obj)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)




class AgencyNotification(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,loginUserType="agency").first()
            notificationObj =  AgencyNotifications.objects.filter(agency_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({'message':'success','data':allData})
        except Exception as e:
            print(e)

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


class AgencyDeleteNotifications(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,loginUserType="agency").first()
            data = request.data
            notificaton_ids = data.get('id')
            if not notificaton_ids:
                return Response({'message':'id required'},status=status.HTTP_400_BAD_REQUEST)
            for i in notificaton_ids:
                AgencyNotifications.objects.filter(id=i).update(end_date = datetime.datetime.now())
            return Response({'message':'success'})
        except Exception as e:
            print(e)
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class AgencyReadNotifications(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,loginUserType="agency").first()
            data = request.data
            notificaton_ids = data.get('id')
            if notificaton_ids:
                for i in notificaton_ids:
                    AgencyNotifications.objects.filter(id=i).update(is_read = True)
            else:
                not_obj = AgencyNotifications.objects.filter(is_read = False)
                for notify in not_obj:
                    notify.is_read = True
                    notify.save()
            return Response({'message':'success'})
        except Exception as e:
            print(e)
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



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

            print(f"Logged in agency id :{uid}")
            customerObj = Customer.objects.filter(user=uid, loginUserType="agency").first()
            print('customerObj.id', customerObj.id)

            propertyObj = AgencyPropertyRequests.objects.filter(agency=customerObj)

            # Simple pagination logic
            page = int(request.GET.get('page', 1))
            page_size = int(request.GET.get('page_size', 10))
            start = (page - 1) * page_size
            end = start + page_size

            total = propertyObj.count()
            paginated_property_obj = propertyObj[start:end]

            propertyData = []
            for property_data in paginated_property_obj:
                print(property_data.property_image)
                data = {
                    'id': property_data.id,
                    'mobile_number': property_data.mobile_number,
                    'name': property_data.name,
                    'email': property_data.email,
                    'property_type': property_data.property_type,
                    'customer_id': property_data.customer.id,
                    'property_name': property_data.property_name,
                    'property_type': property_data.property_type,
                    'property_image': property_data.property_image,
                    'property_video': property_data.property_video,
                    'property_doc': property_data.property_doc,
                    'status': property_data.property_status,
                }
                propertyData.append(data)

            return Response({
                'status_code': status.HTTP_200_OK,
                'status_message': 'Success',
                'total_records': total,
                'page': page,
                'page_size': page_size,
                'data': propertyData
            })

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

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

            print(f"Logged in agency id :{uid}")
            customerObj = Customer.objects.filter(user=uid, loginUserType="agency").first()
            print('customerObj.id', customerObj.id)
            property_id=request.GET.get('property_id')

            propertyObj = AgencyPropertyRequests.objects.filter(id=property_id)

            # Simple pagination logic
            page = int(request.GET.get('page', 1))
            page_size = int(request.GET.get('page_size', 10))
            start = (page - 1) * page_size
            end = start + page_size

            total = propertyObj.count()
            paginated_property_obj = propertyObj[start:end]

            propertyData = []
            for property_data in paginated_property_obj:
                print(property_data.property_image)
                data = {
                    'id': property_data.id,
                    'mobile_number': property_data.mobile_number,
                    'name': property_data.name,
                    'email': property_data.email,
                    'property_type': property_data.property_type,
                    'customer_id': property_data.customer.id,
                    'property_name': property_data.property_name,
                    'property_type': property_data.property_type,
                    'property_image': property_data.property_image,
                    'property_video': property_data.property_video,
                    'property_doc': property_data.property_doc,
                    'status': property_data.property_status,
                }
                propertyData.append(data)

            return Response({
                'status_code': status.HTTP_200_OK,
                'status_message': 'Success',
                'total_records': total,
                'page': page,
                'page_size': page_size,
                'data': propertyData
            })

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

class AgencyAcceptRejectRequest(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message':str(e)},status=status.HTTP_401_UNAUTHORIZED)
            print(f"Logged in agency id :{uid}")
            customerObj=Customer.objects.filter(user=uid,loginUserType="agency").first()
            request_id=request.data.get('request_id')
            response_type=request.data.get('response_type')
            if not request_id:
                return Response({'message':'request_id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not response_type:
                return Response({'message':'response_type is required'},status=status.HTTP_400_BAD_REQUEST)

            propertyObj =  AgencyPropertyRequests.objects.filter(id = request_id).first()
            propertyObj.property_status=response_type
            propertyObj.save()
            
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success'})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class AgencyLoginAsUser(APIView):
    def post(self,request):
        try:
            token = get_authorization_header(request)
            if token is None or token == "null" or token.strip() == "":
                raise exceptions.AuthenticationFailed('Authorization Header or Token is missing on Request Headers')
            decoded = jwt.decode(token, settings.SECRET_KEY)
            user_id = decoded['user_id']
            data=request.data
            customer_id = data.get('id')
            if not customer_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            customer_obj = Customer.objects.filter(id=customer_id).first()
            if not customer_obj:
                return Response({'message':'no user found'},status=status.HTTP_400_BAD_REQUEST)
            refresh_token = RefreshToken.for_user(customer_obj)
            allData={
                    'refresh': str(refresh_token),
                    'access': str(refresh_token.access_token),
                    'login_by':'agency'
                    }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success','data':allData})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class AgencyChangePassword(APIView):
    def post(self,request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'message':str(e)},status=status.HTTP_401_UNAUTHORIZED)
            customer_obj=Customer.objects.filter(user=uid,loginUserType="agency").first()
            if not customer_obj:
                return Response({'message':'no user found'},status=status.HTTP_400_BAD_REQUEST)
            old_password = request.data.get('old_password')
            if not old_password:
                return Response({'message':'Old password is required'},status=status.HTTP_400_BAD_REQUEST)
            password = request.data.get('password')
            if not password:
                return Response({'message':'Password is required'},status=status.HTTP_400_BAD_REQUEST)
            confirm_password = request.data.get('confirm_password')
            if not confirm_password:
                return Response({'message':'Confirm password is required'},status=status.HTTP_400_BAD_REQUEST)
            if customer_obj.user.check_password(old_password) == False:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Does not match with the old password'},status=status.HTTP_400_BAD_REQUEST)
            if customer_obj.user.check_password(confirm_password) == True:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'You cannot set new password same as old password'},status=status.HTTP_400_BAD_REQUEST)
            customer_obj.user.set_password(confirm_password)
            customer_obj.user.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Successfully Password Changed','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 AgencyCustomerLeads(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,loginUserType="agency").first()
            if not customerObj:
                return Response({'message': 'Agency user not found'}, status=status.HTTP_404_NOT_FOUND)
            
            planObj = AgencySubscriptions.objects.filter(customer_id=customerObj.id).first()
            max_properties = planObj.plan.property_number if planObj else None

            inquirePropertyProjectObj = inquirePropertyProject.objects.filter(property_project__agency_id=customerObj,status=1).order_by('id')
            allData = []
            if max_properties is not None:
                inquirePropertyProjectObj=inquirePropertyProjectObj[:max_properties]

            for ppinquire in inquirePropertyProjectObj:
                allData.append({
                    'id':ppinquire.id,
                    'property_id': ppinquire.property_project.id,
                    'property_name':ppinquire.property_project.property_name,
                    'image_data':ppinquire.property_project.image_data,
                    'image_data':ppinquire.property_project.image_data,
                    'videos':ppinquire.property_project.videos,
                    'property_document':ppinquire.property_project.property_document,
                    'house_number':ppinquire.property_project.house_number,
                    'postal_code':ppinquire.property_project.postal_code,
                    'property_dimension':ppinquire.property_project.property_dimension,
                    'region':ppinquire.property_project.region,
                    'phone_number':ppinquire.property_project.phone_number,
                    'rent_to_landlord':ppinquire.property_project.rent_to_landlord,
                    'cashflow_pcm':ppinquire.property_project.cashflow_pcm,
                    'cashflow_pa':ppinquire.property_project.cashflow_pa,
                    'return_on_investment':ppinquire.property_project.return_on_investment,
                    'property_description':ppinquire.property_project.property_description,
                    'rental_description':ppinquire.property_project.rental_description,
                    'vision_description':ppinquire.property_project.vision_description,
                    'cashflow_forecast':ppinquire.property_project.cashflow_forecast,
                    'costs_to_consider':ppinquire.property_project.costs_to_consider,
                    'location':ppinquire.property_project.location,
                    'latitude':ppinquire.property_project.latitude,
                    'longitude':ppinquire.property_project.longitude,
                    'telephone':ppinquire.telephone,
                    'name':ppinquire.name,
                    'contract_status':ppinquire.contract_status,
                    'contract_id':ppinquire.contract_id,
                    'type':"PropertyProject"

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



class AgencyDashboard(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,loginUserType="agency").first()

            total_requests = AgencyPropertyRequests.objects.all().count()
            approved_requests =  AgencyPropertyRequests.objects.filter(agency_id = customerObj.id,property_status = "Accepted").count()
            total_lead = inquirePropertyProject.objects.filter(property_project__agency_id=customerObj,status=1).count()
            latest_request = AgencyPropertyRequests.objects.all().order_by("-id")[:5]
            unique_customers_count = AgencyPropertyRequests.objects.values('customer').distinct().count()
            lead_customer = inquirePropertyProject.objects.filter(property_project__agency_id=customerObj,status=1).count()


            propertyData = []
            for property in latest_request:
                data = {
                    'id':property.id,
                    'mobile_number':property.mobile_number,
                    'name':property.name,
                    'email':property.email,
                    'property_type':property.property_type,
                    'status':property.property_status,
                }
                propertyData.append(data)

            latest_leads = inquirePropertyProject.objects.filter(property_project__agency_id=customerObj,status=1).order_by("-id")[:5]
            allLeadsData = []
            for ppinquire in latest_leads:
                allLeadsData.append({
                    'id':ppinquire.id,
                    'property_id': ppinquire.property_project.id,
                    'property_name':ppinquire.property_project.property_name,
                    'image_data':ppinquire.property_project.image_data,
                    'image_data':ppinquire.property_project.image_data,
                    'videos':ppinquire.property_project.videos,
                    'property_document':ppinquire.property_project.property_document,
                    'house_number':ppinquire.property_project.house_number,
                    'postal_code':ppinquire.property_project.postal_code,
                    'property_dimension':ppinquire.property_project.property_dimension,
                    'region':ppinquire.property_project.region,
                    'phone_number':ppinquire.property_project.phone_number,
                    'rent_to_landlord':ppinquire.property_project.rent_to_landlord,
                    'cashflow_pcm':ppinquire.property_project.cashflow_pcm,
                    'cashflow_pa':ppinquire.property_project.cashflow_pa,
                    'return_on_investment':ppinquire.property_project.return_on_investment,
                    'property_description':ppinquire.property_project.property_description,
                    'rental_description':ppinquire.property_project.rental_description,
                    'vision_description':ppinquire.property_project.vision_description,
                    'cashflow_forecast':ppinquire.property_project.cashflow_forecast,
                    'costs_to_consider':ppinquire.property_project.costs_to_consider,
                    'location':ppinquire.property_project.location,
                    'latitude':ppinquire.property_project.latitude,
                    'longitude':ppinquire.property_project.longitude,
                    'telephone':ppinquire.telephone,
                    'name':ppinquire.name,
                    'contract_status':ppinquire.contract_status,
                    'contract_id':ppinquire.contract_id,
                    'type':"PropertyProject"

                })


            monthly_requests = (
                AgencyPropertyRequests.objects.annotate(month=TruncMonth('start_date'))
                .values('month')
                .annotate(request_count=Count('id'))
                .order_by('month')
            )

            # Format the data for Chart.js
            graph_data = {
                "labels": [entry['month'].strftime('%Y-%m') for entry in monthly_requests],  # Months
                "data": [entry['request_count'] for entry in monthly_requests],  # Request counts
            }
            return Response({'message':'success','total_requests':total_requests,'approved_requests':approved_requests,'total_lead':total_lead,'property_request':propertyData,'allLeadsData':allLeadsData,'unique_customers_count':unique_customers_count,'lead_customer':lead_customer,'graph_data':graph_data})


class AgencyCheckSubscriptionExipre(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(loginUserType="agency").first()
            for customer in customerObj:
                agency_obj = AgencySubscriptions.objects.filter(customer=customer.id,is_active = True).order_by('-id').first()
                today = date.today()
                if agency_obj.sub_expiry_date == today:
                    customer.has_subscription = False
                    customer.save()
                    agency_obj.is_active = False
                    agency_obj.save()
            return Response({'message':'success'})
        except Exception as e:
                return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)




class AgencyAddRatingReview(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({'message':'rating_data is required'},status=status.HTTP_400_BAD_REQUEST)
            review_data = request.data.get('review_data')
            if not review_data:
                return Response({'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({'message':'receive_customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            receieve_customer_obj = Customer.objects.filter(id = receive_customer_id).first()
            AgencyRatingAndReview.objects.create(user_send_customer=customerObj,agency_receive_customer=receieve_customer_obj,rating=rating_data,review=review_data)
            return Response({'message': 'Success'})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class AgencyEditRatingReview(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()
            rating_id =  request.query_params.get('rating_id')
            if not rating_id:
                return Response({'message':'rating_id is required'},status=status.HTTP_400_BAD_REQUEST)
            rating_obj = AgencyRatingAndReview.objects.filter(id=rating_id).first()
            if not rating_obj:
                return Response({'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({'message': 'Success','data':all_data})
        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({'message':'rating_id is required'},status=status.HTTP_400_BAD_REQUEST)
            rating_data = request.data.get('rating_data')
            if not rating_data:
                return Response({'message':'rating_data is required'},status=status.HTTP_400_BAD_REQUEST)
            review_data = request.data.get('review_data')
            if not review_data:
                return Response({'message':'review_data is required'},status=status.HTTP_400_BAD_REQUEST)
            AgencyRatingAndReview.objects.filter(id=rating_id).update(rating=rating_data,review=review_data)
            return Response({'message': 'Success'})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class AgencyDeleteRatingReview(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_id = request.data.get('rating_id')
            if not rating_id:
                return Response({'message':'rating_id is required'},status=status.HTTP_400_BAD_REQUEST)
            rating_obj = AgencyRatingAndReview.objects.filter(id = rating_id).first()
            rating_obj.delete()
            return Response({'message': 'Success'})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class AgencyGetMyRatings(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()
            rating_obj = AgencyRatingAndReview.objects.filter(agency_receive_customer=customerObj )
            all_Data = []
            for rating in rating_obj:
                all_data = {
                    'customer_name': rating.user_send_customer.firstName +" "+ rating.user_send_customer.lastName,
                    'customer_image': rating.user_send_customer.profileImage,
                    'rating': rating.rating,
                    'reviews':rating.review,
                    'rating_date': rating.start_date,
                }
                all_Data.append(all_data)
            return Response({'message': 'Success','data':all_Data})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class AgencyGetMyReviews(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 = AgencyRatingAndReview.objects.filter(agency_receive_customer=customerObj )
            all_Data = []
            for review in review_obj:
                all_data = {
                    'customer_name':review.user_send_customer.firstName+" "+review.user_send_customer.lastName,
                    'customer_image':review.user_send_customer.profileImage,
                    'reviews':review.review,
                    'review_date':review.start_date,
                }
                all_Data.append(all_data)
            return Response({'message': 'Success','data':all_Data})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class AgencyViewRatingReviews(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()
            customer_id =  request.query_params.get('customer_id')
            if not customer_id:
                return Response({'message':'customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            rating_obj = AgencyRatingAndReview.objects.filter(agency_receive_customer = customer_id)
            if rating_obj:
                average_rating = AgencyRatingAndReview.objects.filter(agency_receive_customer=customer_id).aggregate(Avg('rating'))['rating__avg']
                total_reviews = AgencyRatingAndReview.objects.filter(agency_receive_customer = customer_id).count()
                rating_review_data = []
                for rating in rating_obj:
                    all_data = {
                        'customer_name':rating.user_send_customer.firstName+" "+rating.user_send_customer.firstName,
                        'customer_image':rating.user_send_customer.profileImage,
                        'rating':rating.rating,
                        'review':rating.review,
                        'rating_review_date':rating.start_date,

                    }
                    rating_review_data.append(all_data)
                return Response({'message': 'Success','rating_review_data':rating_review_data,'average_rating':round(average_rating),'total_reviews':total_reviews})
            else:
                return Response({'message': 'Success','rating_review_data':" ",'average_rating':" ",'total_reviews':" "})

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



class agentCustomerListing(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()
            customer_id =  request.query_params.get('customer_id')
            if not customer_id:
                return Response({'message':'customer_id is required'},status=status.HTTP_400_BAD_REQUEST)

            requests = AgencyPropertyRequests.objects.filter(agency_id = customerObj.id,property_status = "Accepted")
            # Manually format the data
            data = []
            for request_obj in requests:
                data.append({
                    "customer_id": request_obj.customer.id,
                    "customer_firstname": request_obj.customer.firstName,
                    "customer_lastname": request_obj.customer.lastName,
                    "customer_email":request_obj.customer.email,
                     "customer_image":request_obj.customer.profileImage,
                    "property_type":request_obj.property_type,
                })
            return Response({'message': 'Success','data':data})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class createChatTokenAgency(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

                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 Created Successfully','data':alldata})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class agencyCustomerChatListing(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()
            customer_id =  request.query_params.get('customer_id')
            if not customer_id:
                return Response({'message':'customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            conversations = ConversationAgency.objects.filter(agency = 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,
                    "agency_id":conversation.agency.id,
                    "agency_name": conversation.agency.name,
                    "agency_image": conversation.agency.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':'success','data':conversation_list})

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



class deleteCustomerAgencyChat(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()
            customer_id =  request.query_params.get('customer_id')
            if not customer_id:
                return Response({'message':'customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            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'})
            conversations = ConversationAgency.objects.filter(id = converstation_id ).first()
            conversations.delete()
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'success'})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class getPrivacyPolicy(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()
            customer_id =  request.query_params.get('customer_id')
            if not customer_id:
                return Response({'message':'customer_id is required'},status=status.HTTP_400_BAD_REQUEST)
            privacy_obj  = ContentPagesAdmin.object.filter(page_type_name = 'agency_privacy').first()
            all_data = {
                'id':privacy_obj.id,
                'page_type_name':privacy_obj.page_type_name,
                'page_title':privacy_obj.page_title,
                'page_content':privacy_obj.page_content,
                'status':privacy_obj.status,
            }
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'success','all_data':all_data})
        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class getTermsCondition(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()
            terms_obj  = ContentPagesAdmin.object.filter(page_type_name = 'agency_terms').first()
            all_data = {
                'id':terms_obj.id,
                'page_type_name':terms_obj.page_type_name,
                'page_title':terms_obj.page_title,
                'page_content':terms_obj.page_content,
                'status':terms_obj.status,
            }
            return Response ({'status_code':status.HTTP_200_OK,'status_message':'success','all_data':all_data})

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


class getFAQagency(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()
            customer_id =  request.query_params.get('customer_id')
            faq_obj  =  AgencyFaq.objects.filter(end_date__isnull = True)
            all_Data = []
            for faq in faq_obj:
                all_Data.append({
                    'id':faq.id,
                    'title':faq.title,
                    'content':faq.content,
                })

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



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






        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
class DoItByAgencyTeamRequestList(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()
            allData = []
            allrequests_obj = DoItByReeipoRequests.objects.filter(end_date__isnull=True,payment_status=True).order_by('-id')
            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,do_it_by_type='agency').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)
            
            get_data = DoItByReeipoRequests.objects.filter(payment_status=True).order_by('start_date')
            price= SetdoitbyReeipoPrice.objects.last()
            if price :
                price=price.price
            else:
                price="N/A"
            for all_request in allrequests_obj:
                all_data = {
                    'id':all_request.id,
                    'name':all_request.name,
                    'mobile_number':all_request.mobile_number,
                    'email':all_request.email,
                    'customer_id':all_request.customer.id,
                    'property_type':all_request.property_type,
                    'price':price,
                    'submitted_date':all_request.start_date,
                    'status':all_request.status,
                    'is_viewed':all_request.is_viewed,
                    'is_published':all_request.is_published,
                    'is_contacted':all_request.is_contacted,
                    'property_id':all_request.property_id,
                    'signature':all_request.buyer_signature,
                    'property_image':ast.literal_eval(all_request.property_image) if all_request.property_image else None,
                    'property_video': str(all_request.property_video) if all_request.property_video else None,
                    'property_doc': str(all_request.property_doc) if all_request.property_doc else None,
                    'property_name':all_request.property_name,
                    'property_id':all_request.property_id,


                }
                allData.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(allrequests_obj),'total':total_count})
        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 DoItByAgencyTeamDetail(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()
            allData = []
            reeipo_form_id=request.GET.get('reeipo_form_id')
            allrequests_obj = DoItByReeipoRequests.objects.filter(id=reeipo_form_id,end_date__isnull=True,do_it_by_type='agency')
            price= SetdoitbyReeipoPrice.objects.last()
            if price :
                price=price.price
            else:
                price="N/A"
            for all_request in allrequests_obj:
                all_data = {
                    'id':all_request.id,
                    'name':all_request.name,
                    'mobile_number':all_request.mobile_number,
                    'email':all_request.email,
                    'customer_id':all_request.customer.id,
                    'property_type':all_request.property_type,
                    'price':price,
                    'submitted_date':all_request.start_date,
                    'status':all_request.status,
                    'is_viewed':all_request.is_viewed,
                    'is_published':all_request.is_published,
                    'is_contacted':all_request.is_contacted,
                    'property_id':all_request.property_id,
                    'property_image':ast.literal_eval(all_request.property_image) if all_request.property_image else None,
                    'property_video': str(all_request.property_video) if all_request.property_video else None,
                    'property_doc': str(all_request.property_doc) if all_request.property_doc else None,
                    'property_name':all_request.property_name,
                    'property_id':all_request.property_id,
                    'signature':all_request.buyer_signature,

                }
                allData.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched Successfully','all_data':allData[0]})
        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 ListingFinalizeAgency(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)


            get_finalise = FinalizeAgencyTable.objects.filter(agency=customerObj)
            # if not get_finalise:
            #     return Response({
            #         'status_code': status.HTTP_400_BAD_REQUEST,
            #         'status_message': 'finalise_table not found'
            #     }, status=status.HTTP_400_BAD_REQUEST)

            # === Pagination Params ===
            page = int(request.GET.get('page', 1))
            page_size = int(request.GET.get('page_size', 10))
            start = (page - 1) * page_size
            end = start + page_size

            all_data = []
            filtered_data = [f for f in get_finalise if f.finalized_status != "finalized by customer and agency"]

            for finalise in get_finalise[start:end]:
                all_data.append({
                    "id": finalise.id,
                    "customer_id": finalise.customer.id if finalise.customer else None,
                    "customer_firstName": finalise.customer.firstName if finalise.customer else "",
                    "customer_lastName": finalise.customer.lastName if finalise.customer else "",
                    "customer_email": finalise.customer.email if finalise.customer else "",
                    "customer_phoneNumber": finalise.customer.phoneNumber if finalise.customer else "",

                    "agency_id": finalise.agency.id if finalise.agency else None,
                    "agency_company": finalise.agency.agency_company if finalise.agency else "",
                    "agency_email": finalise.agency.email if finalise.agency else "",
                    "agency_phoneNumber": finalise.agency.phoneNumber if finalise.agency else "",

                    "property_type": finalise.property_type,
                    "final_amount": finalise.final_amount,
                    "customer_signature": finalise.customer_signature,
                    "agency_signature": finalise.agency_signature,
                    "finalized_status": finalise.finalized_status,
                    "created_at": finalise.created_at,
                    "updated_at": finalise.updated_at,
                    "end_date": finalise.end_date,
                })

            return Response({
                'status_code': status.HTTP_200_OK,
                'message': 'Listed Successfully',
                'all_data': all_data,
                'page': page,
                'page_size': page_size,
                'total_records': len(get_finalise)
            }, 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 CompleteFinalizeAgency(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=[]
            finalize_request_id = request.GET.get('finalize_request_id')
            if not finalize_request_id:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'finalize_request_id  is required'},status=status.HTTP_400_BAD_REQUEST)
            finalise=FinalizeAgencyTable.objects.filter(id=finalize_request_id).first()

            if not finalise:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'finalise_table not found'},status=status.HTTP_400_BAD_REQUEST)
            all_data.append({
                    "id": finalise.id,
                    "customer_id": finalise.customer.id if finalise.customer else None,
                    "customer_firstName": finalise.customer.firstName if finalise.customer else "",
                    "customer_lastName": finalise.customer.lastName if finalise.customer else "",
                    "customer_email": finalise.customer.email if finalise.customer else "",
                    "customer_phoneNumber": finalise.customer.phoneNumber if finalise.customer else "",

                    "agency_id": finalise.agency.id if finalise.agency else None,
                    "agency_company": finalise.agency.agency_company if finalise.agency else "",
                    "agency_email": finalise.agency.email if finalise.agency else "",
                    "agency_phoneNumber": finalise.agency.phoneNumber if finalise.agency else "",
                    "finalized_status":finalise.finalized_status,
                    "property_type": finalise.property_type,
                    "final_amount": finalise.final_amount,
                    "customer_signature": finalise.customer_signature,
                    "agency_signature": finalise.agency_signature,
                    "created_at": finalise.created_at,
                    "updated_at": finalise.updated_at,
                    "end_date": finalise.end_date,
                })
            
            

            return Response({'status_code':status.HTTP_200_OK,'message':'Listed Successfully',"all_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)
    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=[]
            finalize_request_id = request.data.get('finalize_request_id')
            agency_signature = request.data.get('agency_signature')
            if not finalize_request_id:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'finalize_request_id  is required'},status=status.HTTP_400_BAD_REQUEST)
            if not agency_signature:
                 return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'agency_signature  is required'},status=status.HTTP_400_BAD_REQUEST)
            finalise=FinalizeAgencyTable.objects.filter(id=finalize_request_id).first()
            if not finalise:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'finalise_table not found'},status=status.HTTP_400_BAD_REQUEST)
            elif finalise.finalized_status=="finalized by customer and agency":
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Already finalized'},status=status.HTTP_400_BAD_REQUEST)
            finalise.agency_signature=agency_signature
            finalise.finalized_status="finalized by customer and agency"
            finalise.save()
            # customerObj=Customer.objects.filter(user=finalise.customer.id).first()
            # agency_property_requests=AgencyPropertyRequests.objects.filter(customer=customerObj).first()
            # agency_property_requests
            
            

            return Response({'status_code':status.HTTP_200_OK,'message':'Signature added 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 addPropertyProject(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
            data = request.data
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            
            if customerObj.can_add_property_count==0:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'You have to buy subscription to add property'},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.datetime.now(),
                is_draft=is_draft,
                subscription_type=subscription_tyre,
                agency=agency_obj,
                status =  1,
                added_by='by_agency'
            )
            form_id=data.get('form_id')
            customerObj.can_add_property_count-=1
            customerObj.save()
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=property_project.id

                get_form.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:
            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
            data = request.data
            customerObj=Customer.objects.filter(user=uid).first()
            plan_obj = CustomersSubscriptions.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_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 = 1
            propertyProject_obj.save()
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=propertyProject_obj.id
                get_form.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 addSaleProperty(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
            if customerObj.can_add_property_count==0:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'You have to buy subscription to add property'},status=status.HTTP_400_BAD_REQUEST)
            data = request.data
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            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')
            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,added_by='by_agency')
            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.status = 1
            
            sale_obj.save()
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':sale_obj.id,
            }
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=sale_obj.id
                
                get_form.save()
            
            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:
            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
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            data = request.data
            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 = 1
            sale_obj.save()
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=sale_obj.id
                get_form.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 addPropertyRent(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
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            if customerObj.can_add_property_count==0:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'You have to buy subscription to add property'},status=status.HTTP_400_BAD_REQUEST)
            data = request.data
            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,added_by='by_agency')
            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.status = 1
            
            
   
   
            rentprop.save()
            customerObj.can_add_property_count-=1
            customerObj.save()
            allData = {
                'id':rentprop.id,
            }
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=rentprop.id
                get_form.save()
   
            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:
            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
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            data = request.data
            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 = 1

            rentprop.save()
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=rentprop.id
                get_form.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 bussinessForSale(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
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            data = request.data
            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.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
                    status = 1,
                    added_by='by_agency'
                    # agency=agency_obj,  # Uncomment this if you want to add agency
                )
            allData = {
                'id':bussine_sale.id,
                
            }
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=bussine_sale.id
                get_form.save()
            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:
            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
            plan_obj = CustomersSubscriptions.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_code':status.HTTP_400_BAD_REQUEST,'message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)
            data = request.data
            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':'rentdatetime.now() 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.datetime.now()			
            businessSale.subscription_type = subscription_tyre
            businessSale.status = 1
            businessSale.shareholder_name = shareholder_name
            businessSale.shareholder_share = shareholder_share
            businessSale.shareholder_description = shareholder_description

            businessSale.save()
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=businessSale.id
                get_form.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 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 = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            if customerObj.can_add_property_count==0:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'You have to buy subscription to add property'},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,
                short_title=short_title,
                description=description,
                about_the_owner=about_the_owner,
                company_name=company_name,
                property_image=property_image,
                property_video=property_video,
                videos_thumbnail=videos_thumbnail,
                company_logo=company_logo,
                maximum_drawing=maximum_drawing,
                minimum_drawing=minimum_drawing,
                share_for_sale=share_for_sale,
                price_per_share=price_per_share,
                number_of_share=number_of_share,
                self_report=self_report,
                nominal_share_price=nominal_share_price,
                e_post=e_post,
                issue_account_number=issue_account_number,
                share_before_share=share_before_share,
                name_of_shareholder=name_of_shareholder,
                beskrivelse=beskrivelse,
                establish_year=establish_year,
                premises_from=premises_from,
                background_for_sale=background_for_sale,
                company_website=company_website,
                number_of_employee=number_of_employee,
                company_email=company_email,
                company_telephone=company_telephone,
                youtube=youtube,
                upload_team_data=upload_team_data,
                upload_team_size=upload_team_size,
                upload_team_name=upload_team_name,
                upload_board_data=upload_board_data,
                upload_board_name=upload_board_name,
                upload_board_size=upload_board_size,
                upload_partner_data=upload_partner_data,
                upload_partner_name=upload_partner_name,
                upload_partner_size=upload_partner_size,
                location=location,
                country=country,
                state=state,
                city=city,
                zip_code=zip_code,
                landmark=landmark,
                share_holder_image=share_holder_image,
                enter_shares=enter_shares,
                latitude=latitude,
                longitude=longitude,
                is_draft=is_draft,
                subscription_type=subscription_tyre,
                status = 1,
                added_by='by_agency'
            )

            
            
            sale_obj.save()
            allData = {
                'id':sale_obj.id,
                
            }
            form_id=data.get('form_id')
            customerObj.can_add_property_count-=1
            customerObj.save()
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=sale_obj.id
                get_form.save()
            
            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 = CustomersSubscriptions.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 = 1
            sale_obj.save()
   
            allData = {
                'id':sale_obj.id,
            }
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=sale_obj.id
                get_form.save()
            
            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:
            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
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            if customerObj.can_add_property_count==0:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'You have to buy subscription to add property'},status=status.HTTP_400_BAD_REQUEST)
            data = request.data
            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,
                property_name=property_name,
                property_image=property_image,
                videos=videos,
                videos_thumbnail=videos_thumbnail,
                document=document,
                property_type=property_type,
                assest_equality=assest_equality,
                investment_highlight=investment_highlight,
                equity_price=equity_price,
                lp_equity_percent=lp_equity_percent,
                gp_equity_percent=gp_equity_percent,
                debt_percent=debt_percent,
                short_title=short_title,
                description=description,
                bussiness_plan=bussiness_plan,
                minimum_investment=minimum_investment,
                investment_strategy=investment_strategy,
                expected_period=expected_period,
                financed=financed,
                target_return_on_cost=target_return_on_cost,
                target_irr=target_irr,
                offered_by=offered_by,
                estimated_first_distribution=estimated_first_distribution,
                type_of_investment=type_of_investment,
                phone_number=phone_number,
                measure_of_multiplier=measure_of_multiplier,
                address=address,
                minimum_goal=minimum_goal,
                nominal_share_price=nominal_share_price,
                the_valuation=the_valuation,
                minimum_drawing=minimum_drawing,
                no_of_drawings=no_of_drawings,
                share_for_sale=share_for_sale,
                remaining_share=remaining_share,
                maximum_drawing=maximum_drawing,
                short_description=short_description,
                why_invest=why_invest,
                problem_to_be_solved=problem_to_be_solved,
                our_solution=our_solution,
                start_date_data=start_date_data,
                end_date_data=end_date_data,
                number_of_share=number_of_share,
                price_of_share=price_of_share,
                issue_minimum_investment=issue_minimum_investment,
                issue_maximum_investment=issue_maximum_investment,
                value_before_issue=value_before_issue,
                raised_capital_minimum_limit=raised_capital_minimum_limit,
                raised_capital_maximum_limit=raised_capital_maximum_limit,
                share_of_company_sold_minimum_limit=share_of_company_sold_minimum_limit,
                share_of_company_sold_maximum_limit=share_of_company_sold_maximum_limit,
                self_report=self_report,
                discussion_description=discussion_description,
                new_exisiting_details=new_exisiting_details,
                drawing_on_behalf=drawing_on_behalf,
                foundation=foundation,
                foundation_name=foundation_name,
                satutes=satutes,
                satutes_name=satutes_name,
                annual_account=annual_account,
                annual_account_name=annual_account_name,
                valuation=valuation,
                valuation_name=valuation_name,
                agreement_on_co=agreement_on_co,
                agreement_on_co_name=agreement_on_co_name,
                conversion_of_debt=conversion_of_debt,
                conversion_of_debt_name=conversion_of_debt_name,
                balance_sheet=balance_sheet,
                balance_sheet_name=balance_sheet_name,
                result_report=result_report,
                result_report_name=result_report_name,
                country=country,
                state=state,
                city=city,
                postal_code=postal_code,
                landmark=landmark,
                house_number=house_number,
                location=location,
                latitude=latitude,
                longitude=longitude,
                is_draft=is_draft,
                subscription_type=subscription_tyre,
                status=1,
                added_by='by_agency'
            )

            allData = {
                'id':sale_obj.id,
            }
            form_id=data.get('form_id')
            customerObj.can_add_property_count-=1
            customerObj.save()
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=sale_obj.id
                get_form.save()
            
            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:
            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
            data = request.data
            plan_obj = CustomersSubscriptions.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')
            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.status = 1

            sale_obj.save()
            allData = {
                'id':sale_obj.id,
            }
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=sale_obj.id
                get_form.save()
            
            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 houseWantedForRent(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
            data = request.data
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0
            
            
   
            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,
                short_title=short_title,
                profile_visiblity=profile_visiblity,
                profile_hidden=profile_hidden,
                image=image,
                first_name=first_name,
                last_name=last_name,
                gender=gender,
                dob=dob,
                nationality=nationality,
                phone_number=phone_number,
                email=email,
                quantity=quantity,
                rental_period=rental_period,
                max_rent=max_rent,
                from_date=from_date,
                housing_type=housing_type,
                number_of_people=number_of_people,
                max_month_price=max_month_price,
                desired_start_date=desired_start_date,
                desired_area=desired_area,
                about=about,
                education=education,
                martial_status=martial_status,
                cleanliness=cleanliness,
                party_habits=party_habits,
                work=work,
                interest=interest,
                subscription_type=subscription_tyre,
                country=country,
                state=state,
                city=city,
                postal_code=postal_code,
                landmark=landmark,
                floor=floor,
                description=description,
                latitude=latitude,
                longitude=longitude,
                location=location,
                is_draft=is_draft,
                status=0,
                added_by='by_agency'
            )


            allData = {
                'id':house_rent.id,
            }
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=house_rent.id
                get_form.save()
            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:
            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
            data = request.data
            plan_obj = CustomersSubscriptions.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)
            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 = 1

            house_rent.save()
            form_id=data.get('form_id')
            get_form=DoItByReeipoRequests.objects.filter(id=form_id).first()
            if get_form:
                get_form.status="Published"
                get_form.property_id=house_rent.id
                get_form.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 createConverstationCustomer(APIView):
    def post(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
        
        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()
            else:
                customerObj= 0
            # 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 = 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 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)