from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from admin_api.models import *
import random
from datetime import datetime
from django.conf import settings
from passlib.hash import django_pbkdf2_sha256 as handler
from .functions import *
from django.contrib.auth import authenticate, login
import math, random, pytz, string
from django.template.loader import render_to_string
from django.shortcuts import render

from django.core import mail
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework_simplejwt.backends import TokenBackend
from django.conf import settings
from rest_framework import authentication
from rest_framework import exceptions
import jwt
from rest_framework.authentication import get_authorization_header
from drf_yasg.utils import swagger_auto_schema
from rest_framework.parsers import FormParser, MultiPartParser, FileUploadParser
from .swagger_serializer import *
from customer_api.models import *
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.core import mail
from django.db.models import Q
from agency_panel.models import *
from lawyer_panel.models import *
from django.core import mail
from django.core.mail import EmailMultiAlternatives
import ast
from rest_framework.permissions import IsAdminUser
from django.utils import timezone
class superadminLogin(APIView):
    def post(self,request):
        try:
            email = request.data.get('email')
            print(email)
            if not email:
               return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'email is required'},status=status.HTTP_400_BAD_REQUEST)
            password = request.data.get('password')
            print(password)
            if not password:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'password is required'},status=status.HTTP_400_BAD_REQUEST)
            userObj = authenticate(username=email, password=password)
            if not userObj:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'email or password is incorrect'},status=status.HTTP_400_BAD_REQUEST)
            superUser = SuperAdmin.objects.filter(user=userObj).first()
            if not superUser:
                return Response({'status':status.HTTP_400_BAD_REQUEST,'message':'Invalid Credentials'},status=status.HTTP_400_BAD_REQUEST)
            refresh_token = RefreshToken.for_user(userObj)
            userData={'id':superUser.id,
                    'email':superUser.email,
                    'phone_number':superUser.phoneNumber,
                    'first_name':superUser.firstName,
                    'last_name':superUser.lastName,
                    'avatar':superUser.avatar,
                    # 'role_name':superUser.role.role_name,
                    'role':"admin",
                    # 'permission':superUser.role.permission,
                    }
            allData={
                    'refresh': str(refresh_token),
                    'access': str(refresh_token.access_token),
                    'user': userData
                    }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Login Successfully','data':allData},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 adminForgetPassword(APIView):
    def post(self,request):
        try:
            email = request.data.get('email')
            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)
            check = SuperAdmin.objects.filter(email=email).first()
            if not check:
                return Response({"status_code":status.HTTP_404_NOT_FOUND,"status_message":'Email not exist in our database'},status=status.HTTP_404_NOT_FOUND,)
            random_number = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(12)])
            forgot_link = 'admin-api/reset-password/' + str(check.email) + '/'+ random_number
            complete_link = str(settings.BASE_URL)+forgot_link
            check.forgotPasswordLink = complete_link
            check.save()
            subject = 'Forgot Password'
            html_message = render_to_string('forget-password-email.html', {'link': complete_link})
            plain_message = html_message
            from_email = 'testsingh28@gmail.com'
            to = email
            mail.send_mail(subject, plain_message, from_email, [to], html_message=html_message)
            return Response({"status_code":status.HTTP_200_OK,"status_message":"Success"},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 ForgetPasswordVerification(APIView):
    def get(self,request):
        try:
            link = str(self.request.build_absolute_uri())
            user_email = link.split('/')[-2]
            user_obj = SuperAdmin.objects.filter(email = user_email, forgotPasswordLink = link).first()
            if user_obj:
                return Response({"status_code":status.HTTP_200_OK,"status_message":"Success"},status=status.HTTP_200_OK)
            else:
                return Response({"status_code":status.HTTP_400_BAD_REQUEST,"status_message":'Invalid link'},status=status.HTTP_400_BAD_REQUEST)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    
    def post(self,request):
        try:
            new_password = request.data.get('new_password')
            if not new_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'New Password is required'},status=status.HTTP_400_BAD_REQUEST)
            confirm_password = data.get('confirm_password')
            if not confirm_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Confirm Password is required'},status=status.HTTP_400_BAD_REQUEST)
            link = str(self.request.build_absolute_uri())
            user_email = link.split('/')[-2]
            user_Obj = SuperAdmin.objects.filter(email = user_email).first()
            if user_Obj:
                new_password_val = handler.hash(new_password)
                user_Obj.password = new_password_val
                user_Obj.save()
            return Response({"status_code":status.HTTP_200_OK,"status_message":"Password changed 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 adminProfile(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            admin_obj =  SuperAdmin.objects.filter(user_id = user_id).first()
            alldata = {
                'email': admin_obj.email,
                'phone_number': admin_obj.phoneNumber,
                'avatar':admin_obj.avatar,
                'first_name':admin_obj.firstName,
                'last_name':admin_obj.lastName,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata},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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            admin_obj =  SuperAdmin.objects.filter(user_id = user_id).first()
            email = request.data.get('email')
            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)
            first_name = request.data.get('first_name')
            if not first_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'First Name is required'},status=status.HTTP_400_BAD_REQUEST)
            last_name = request.data.get('last_name')
            if not last_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Last Name is required'},status=status.HTTP_400_BAD_REQUEST)
            phone_number = request.data.get('phone_number')
            if not phone_number:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Phone Number is required'},status=status.HTTP_400_BAD_REQUEST)
            admin_obj.email = email
            admin_obj.firstName = first_name
            admin_obj.lastName = last_name
            admin_obj.phoneNumber = phone_number
            if request.data.get('avatar'):
                fileUrl=uploadTheProfile(request.data.get('avatar'))
                fileUrl=str(settings.BASE_URL)+fileUrl
                admin_obj.avatar=str(fileUrl)
            admin_obj.save()
            allData={'id':admin_obj.id,
                    'email':admin_obj.email,
                    'first_name':admin_obj.firstName,
                    'last_name':admin_obj.lastName,
                    'phone_number':admin_obj.phoneNumber,
                    'token':admin_obj.token,
                    'avatar':admin_obj.avatar,
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':allData},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 adminChangePassword(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            admin_obj =  User.objects.filter(id = user_id).first()
            old_password = request.data.get('old_password')
            if not old_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Old password is required'},status=status.HTTP_400_BAD_REQUEST)
            new_password = request.data.get('new_password')
            if not new_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'New password is required'},status=status.HTTP_400_BAD_REQUEST)
            confirm_password = request.data.get('confirm_password')
            if not confirm_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'New password is required'},status=status.HTTP_400_BAD_REQUEST)
            if new_password != confirm_password:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Password and confirm password are not same'},status=status.HTTP_400_BAD_REQUEST)
            if admin_obj.check_password(old_password) == False:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Old password is not correct'},status=status.HTTP_400_BAD_REQUEST)
            else:
                admin_obj.set_password(confirm_password)
                admin_obj.save()
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Password changed 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 investorContentPage(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Investor').first()
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_content':content_obj.page_content,
                    'page_title_nw':content_obj.page_title_nw,
                    'page_content_nw':content_obj.page_content_nw,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata},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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)


            mydata = ContentPagesAdmin.objects.filter(page_type_name="Investor").first()
            if mydata:
                ContentPagesAdmin.objects.filter(id=mydata.id).update(page_title=page_title,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_content=page_content,page_type_name='Investor')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_content=page_content,page_type_name='Investor')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'},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 propertyContentPage(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Property_developer').first()
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_content':content_obj.page_content,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata},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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            data = ContentPagesAdmin.objects.filter(page_type_name='Property_developer').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Property_developer')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Property_developer')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'},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 projectContentPage(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Project_type').first()
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_content':content_obj.page_content,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata},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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            data = ContentPagesAdmin.objects.filter(page_type_name='Project_type').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Project_type')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Project_type')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'},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 saleContentPage(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Sale_condition').first()
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_content':content_obj.page_content,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata},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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            

            data = ContentPagesAdmin.objects.filter(page_type_name='Sale_condition').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Sale_condition')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Sale_condition')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'},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 howItWorkContentPage(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='How_it_work').first()
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_title_nw':content_obj.page_title_nw,

                    'page_content':content_obj.page_content,
                    'page_content_nw':content_obj.page_content_nw,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':alldata},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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            data = ContentPagesAdmin.objects.filter(page_type_name='How_it_work').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='How_it_work')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='How_it_work')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'},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 termsAndConditions(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Terms_And_Conditions').first()
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_title_nw':content_obj.page_title_nw,

                    'page_content':content_obj.page_content,
                    'page_content_nw':content_obj.page_content_nw,

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

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
            data = ContentPagesAdmin.objects.filter(page_type_name='Terms_And_Conditions').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_type_name='Terms_And_Conditions',page_title_nw=page_title_nw,page_content_nw=page_content_nw)
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_type_name='Terms_And_Conditions',page_title_nw=page_title_nw,page_content_nw=page_content_nw)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'created successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class privacyPolicy(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Privacy_Policy').first()
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_title_nw':content_obj.page_title_nw,

                    'page_content':content_obj.page_content,
                    'page_content_nw':content_obj.page_content_nw,

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

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            

            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            data = ContentPagesAdmin.objects.filter(page_type_name='Privacy_Policy').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_type_name='Privacy_Policy',page_title_nw=page_title_nw,page_content_nw=page_content_nw)
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_type_name='Privacy_Policy',page_title_nw=page_title_nw,page_content_nw=page_content_nw)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Created successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class propertyProjectContent(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Property_project').first()
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_title_nw':content_obj.page_title_nw,

                    'page_content':content_obj.page_content,
                    'page_content_nw':content_obj.page_content_nw,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched Successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            data = ContentPagesAdmin.objects.filter(page_type_name='Property_project').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Property_project')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Property_project')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Created Successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class propertySaleRentContentPage(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Propert_sale_rent').first()
            # if not content_obj:
            #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No data found'},status=status.HTTP_400_BAD_REQUEST)
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_title_nw':content_obj.page_title_nw,

                    'page_content':content_obj.page_content,
                    'page_content_nw':content_obj.page_content_nw,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched Successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
            data = ContentPagesAdmin.objects.filter(page_type_name='Propert_sale_rent').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Propert_sale_rent')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Propert_sale_rent')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Created Successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class bussinessForSaleContentPage(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Bussiness_for_sale').first()
            # if not content_obj:
            #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No data found'},status=status.HTTP_400_BAD_REQUEST)
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_title_nw':content_obj.page_title_nw,

                    'page_content':content_obj.page_content,
                    'page_content_nw':content_obj.page_content_nw,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched Successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
            data = ContentPagesAdmin.objects.filter(page_type_name='Bussiness_for_sale').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Bussiness_for_sale')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Bussiness_for_sale')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Created Successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class bussinessDeveloperContentPage(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_obj = ContentPagesAdmin.objects.filter(page_type_name='Bussiness_developer').first()
            # if not content_obj:
            #     return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No data found'},status=status.HTTP_400_BAD_REQUEST)
            alldata = {}
            if content_obj:
                alldata = {
                    'page_title':content_obj.page_title,
                    'page_title_nw':content_obj.page_title_nw,

                    'page_content':content_obj.page_content,
                    'page_content_nw':content_obj.page_content_nw,
                    'created_at':content_obj.created_at
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page_title = request.data.get('page_title')
            if not page_title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page title is required'},status=status.HTTP_400_BAD_REQUEST)
            page_content = request.data.get('page_content')
            if not page_content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Page content is required'},status=status.HTTP_400_BAD_REQUEST)
            
            page_title_nw = request.data.get('page_title_nw')
            page_content_nw = request.data.get('page_content_nw')
            
            if not page_title_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_title_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            if not page_content_nw:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'page_content_nw is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
            
            data = ContentPagesAdmin.objects.filter(page_type_name='Bussiness_developer').first()
            if data:
                ContentPagesAdmin.objects.filter(id=data.id).update(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Bussiness_developer')
            else:
                ContentPagesAdmin.objects.create(page_title=page_title,page_content=page_content,page_title_nw=page_title_nw,page_content_nw=page_content_nw,page_type_name='Bussiness_developer')
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Created successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class faqlisting(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data_obj = AdminFaq.objects.filter(end_date__isnull = True).order_by('-id')
            allData = []
            for faq in data_obj:
                alldata = {  'id':faq.id,
                            'title':faq.title,
                            'content':faq.content,
                        }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq fetched successfully','data':allData},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class addFaq(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq title is required'},status=status.HTTP_400_BAD_REQUEST)
            content = request.data.get('content')
            if not content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq content is required'},status=status.HTTP_400_BAD_REQUEST)
            AdminFaq.objects.create(title=title,content=content)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq 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 editFaq(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            faq_id = request.data.get('faq_id')
            if not faq_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq Id is required'},status=status.HTTP_400_BAD_REQUEST)
            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq title is required'},status=status.HTTP_400_BAD_REQUEST)
            content = request.data.get('content')
            if not content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq content is required'},status=status.HTTP_400_BAD_REQUEST)
            AdminFaq.objects.filter(id=faq_id).update(title=title,content=content)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq updated 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 deleteFaq(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            faq_id = request.data.get('faq_id')
            if not faq_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq Id is required'},status=status.HTTP_400_BAD_REQUEST)
            AdminFaq.objects.filter(id=faq_id).update(end_date=datetime.now())
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq deleted 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 getCustomerList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            customer_obj = Customer.objects.filter(loginUserType = "customer").order_by('-id')
            customer_count = Customer.objects.filter(loginUserType = "customer").count()
            search_post =  self.request.query_params.get('search')
            if search_post:
                customer_obj = Customer.objects.filter(Q(firstName__icontains=search_post)|Q(lastName__icontains=search_post)|Q(email__icontains=search_post)|Q(phone_number__icontains=search_post),loginUserType = "customer")
            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)
            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)
            paginator = Paginator(customer_obj, page_per_data)
            try:
                customer_obj = paginator.page(page)
            except PageNotAnInteger:
                customer_obj = paginator.page(1)
            except EmptyPage:
                customer_obj = paginator.page(paginator.num_pages)
            allData = []
            for customer in customer_obj:
                alldata = {
                    'id':customer.id,
                    'first_name':customer.firstName,
                    'last_name':customer.lastName,
                    'email':customer.email,
                    'phone_number':customer.phoneNumber,
                    # 'user_type':customer.userType,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Customer fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(customer_obj),'total':customer_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 changeUserStatus(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            userid = self.request.query_params.get('userid')
            if not userid:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'User Id is required'},status=status.HTTP_400_BAD_REQUEST)
            status_data = self.request.query_params.get('status')
            if not status_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Status is required'},status=status.HTTP_400_BAD_REQUEST)        
            status_obj        = Customer.objects.get(user_id = userid)
            status_obj.is_active = status_data
            status_obj.save()
            if status_obj.is_active == "1":
                return Response({'status_code':status.HTTP_200_OK,'status_message':'User activated successfully'},status=status.HTTP_200_OK)
            else:
                return Response({'status_code':status.HTTP_200_OK,'status_message':'User deactivated 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 viewUserDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            userid = self.request.query_params.get('userid')
            if not userid:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'User Id is required'},status=status.HTTP_400_BAD_REQUEST)
            user_obj = Customer.objects.filter(id = userid).first()
            sub_obj = CustomersSubscriptions.objects.filter(customer=userid).first()
            if sub_obj:
                plan_name = sub_obj.plan.planName
                plan_start_date = sub_obj.sub_start_date
                plan_expiry_date = sub_obj.sub_expiry_date
                plan_is_active = sub_obj.is_active
                plan_validity = sub_obj.plan.planDurationDays
                plan_price = sub_obj.plan.price
            else:
                plan_name = "N/A"
                plan_start_date = "N/A"
                plan_expiry_date = "N/A"
                plan_is_active = "N/A"
                plan_validity = "N/A"
                plan_price = "N/A"

            if not user_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No user found'},status=status.HTTP_400_BAD_REQUEST)
            alldata = {
                'user_type':user_obj.userType,
                'first_name':user_obj.firstName,
                'last_name':user_obj.lastName,
                'email':user_obj.email,
                'dob':user_obj.dob,
                'profile_image':user_obj.profileImage,
                'gender':user_obj.gender,
                'address':user_obj.address,
                'nationality':user_obj.nationality,
                'bio':user_obj.bio,
                'image_video':user_obj.image_video,
                'past_experience':user_obj.pastExperience,
                'past_field':user_obj.pastField,
                'subscription_name':plan_name,
                'plan_start_date':plan_start_date,
                'plan_expiry_date':plan_expiry_date,
                'plan_is_active':plan_is_active,
                'plan_validity':plan_validity,
                'facebook_url':user_obj.facebook_url,
                'twitter_url':user_obj.twitter_url,
                'youtube_url':user_obj.youtube_url,
                'linkedin_url':user_obj.linkedin_url,
                'pintrest_url':user_obj.pintrest_url,
                'instagram_url':user_obj.instagram_url,
                'blog':user_obj.blog,
                'phoneNumber':user_obj.phoneNumber,
                'house_number':user_obj.house_number,
                'street_name':user_obj.street_name,
                
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Customer details fetched successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class editCustomer(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            userid = request.data.get('userid')
            if not userid:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'User Id is required'},status=status.HTTP_400_BAD_REQUEST)
            first_name = request.data.get('first_name')
            if not first_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'First name is required'},status=status.HTTP_400_BAD_REQUEST)
            last_name = request.data.get('last_name')
            if not last_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Last name is required'},status=status.HTTP_400_BAD_REQUEST)
            email = request.data.get('email')
            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)
            dob = request.data.get('dob')
            if not dob:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Date of birth is required'},status=status.HTTP_400_BAD_REQUEST)
            gender = request.data.get('gender')
            if not gender:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Gender is required'},status=status.HTTP_400_BAD_REQUEST)
            address = request.data.get('address')
            if not address:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Address is required'},status=status.HTTP_400_BAD_REQUEST)
            nationality = request.data.get('nationality')
            if not nationality:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Nationality is required'},status=status.HTTP_400_BAD_REQUEST)
            bio= request.data.get('bio')
            if not bio:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Bio is required'},status=status.HTTP_400_BAD_REQUEST)
            past_experience = request.data.get('past_experience')
            if not past_experience:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Past experience is required'},status=status.HTTP_400_BAD_REQUEST)
            past_field = request.data.get('past_field')
            if not past_field:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Past field is required'},status=status.HTTP_400_BAD_REQUEST)
            Customer.objects.filter(user_id=userid).update(firstName=first_name,lastName=last_name,email=email,dob=dob,gender=gender,address=address,nationality=nationality,bio=bio,past_experience=past_experience,past_field=past_field)
        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 getCompanyList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            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)
            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)
            company_obj = Company.objects.all()
            search_post =  self.request.query_params.get('search')
            if search_post:
                company_obj = Customer.objects.filter(Q(companyName__icontains=search_post)|Q(companyEmail__icontains=search_post))
            paginator = Paginator(company_obj, page_per_data)
            try:
                company_obj = paginator.page(page)
            except PageNotAnInteger:
                company_obj = paginator.page(1)
            except EmptyPage:
                company_obj = paginator.page(paginator.num_pages)
            allData = []
            for company in company_obj:
                alldata = {
                    'company_id':company.id,
                    'company_name':company.companyName,
                    'company_url':company.companyUrl,
                    'company_slogan':company.companySlogan,
                    'company_category':company.companyCategory,
                    'company_email':company.companyEmail,
                    'company_telephone':company.companyTelephone,
                    'company_detail':company.companyDetail,
                    'company_media':company.companyMedia,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Company fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(company_obj)},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 editCompany(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,algorithms=["HS256"])
            user_id = decoded['user_id']

            company_id = request.data.get('company_id')
            if not company_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Company id is required'},status=status.HTTP_400_BAD_REQUEST)
 
            company_name = request.data.get('company_name')
            if not company_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Company name is required'},status=status.HTTP_400_BAD_REQUEST)
            
            company_url = request.data.get('company_url')
            if not company_url:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Company url is required'},status=status.HTTP_400_BAD_REQUEST)

            company_slogan = request.data.get('company_slogan')
            if not company_slogan:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Company slogan is required'},status=status.HTTP_400_BAD_REQUEST)

            company_category = request.data.get('company_category')
            if not company_category:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Company category is required'},status=status.HTTP_400_BAD_REQUEST)

            company_email = request.data.get('company_email')
            if not company_email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Company email is required'},status=status.HTTP_400_BAD_REQUEST)

            company_telephone = request.data.get('company_telephone')
            if not company_telephone:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Company telephone is required'},status=status.HTTP_400_BAD_REQUEST)

            company_detail = request.data.get('company_detail')
            if not company_detail:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Company details is required'},status=status.HTTP_400_BAD_REQUEST)

            check_company = Company.objects.filter(id=company_id).first()
            if not check_company:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No company found'},status=status.HTTP_400_BAD_REQUEST)

            Company.objects.filter(id=company_id).update(
                companyName = company_name,
                companyUrl = company_url,
                companySlogan = company_slogan,
                companyCategory = company_category,
                companyEmail = company_email,
                companyTelephone = company_telephone,
                companyDetail = company_detail
            )
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Company updated 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 getPropertyRequest(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            property_obj = SaleAndRentProperty.objects.all()
            property_obj_count = SaleAndRentProperty.objects.all().count()
            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)
            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)
            paginator = Paginator(property_obj, page_per_data)
            try:
                property_obj = paginator.page(page)
            except PageNotAnInteger:
                property_obj = paginator.page(1)
            except EmptyPage:
                property_obj = paginator.page(paginator.num_pages)
            allData=[]
            for property in property_obj:
                if property.propertyStatus == 0:
                    status_info = "Pending"
                elif property.propertyStatus == 1:
                    status_info = "Accepted"
                else:
                    status_info = "Rejected"
                alldata ={
                    'id':property.id,
                    'property_type':property.propertyType,
                    'title':property.title,
                    'category':property.category,
                    'subcategory':property.subCategory,
                    'image':property.image_data,
                    'customer':property.customerId.id,
                    'status':status_info
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Property request fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(property_obj),'total':property_obj_count},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  

class getSaleProperty(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            property_obj = SaleProperty.objects.all()
            property_obj_count = SaleProperty.objects.all().count()
            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)
            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)
            paginator = Paginator(property_obj, page_per_data)
            try:
                property_obj = paginator.page(page)
            except PageNotAnInteger:
                property_obj = paginator.page(1)
            except EmptyPage:
                property_obj = paginator.page(paginator.num_pages)
            allData=[]
            for property in property_obj:
                if property.status == 0:
                    status_info = "Pending"
                elif property.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                alldata ={
                    'id':property.id,
                    'title':property.title,
                    'main_category':property.main_category,
                    'subcategory':property.subCategory,
                    'image_data':property.image_data,
                    'customer':property.customerId.id,
                    'status':status_info
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Sale property fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(property_obj),'total':property_obj_count},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  

class salePropertDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            request_property_id = self.request.query_params.get('id')
            if not request_property_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Property id is required'},status=status.HTTP_400_BAD_REQUEST)
            property_obj = SaleProperty.objects.filter(id=request_property_id).first()
            if not property_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No property found'},status=status.HTTP_400_BAD_REQUEST)
            if property_obj.status == 0:
                status_info = "Accepted"
            else:
                status_info = "Rejected"
                
                
            alldata = {
                'id':property_obj.id,
                'customer_id':property_obj.customerId.id,
                'fullname': property_obj.customerId.firstName+' '+ property_obj.customerId.lastName,
                'customer_image':property_obj.customerId.profileImage,
                'title':property_obj.title,
                'main_category': property_obj.main_category,
                'sub_category': property_obj.subCategory,
                'image_data' : ast.literal_eval(property_obj.image_data.strip()) if property_obj.image_data and property_obj.image_data.strip() else [],
                'video': property_obj.video,
                'videos_thumbnail': property_obj.videos_thumbnail,

                'property_name': property_obj.property_name,
                'house_number': property_obj.house_number,
                'country': property_obj.country,
                'state': property_obj.state,
                'city': property_obj.city,
                'benefits':ast.literal_eval(property_obj.benfits.strip()) if property_obj.benfits and property_obj.benfits.strip() else [],
    
                'postal_code': property_obj.postal_code,
                'youtubeUrl': property_obj.youtubeUrl,
                'phoneNumber': property_obj.phoneNumber,
                'price': property_obj.price,
                'property_demension': property_obj.property_demension,
                'vision': property_obj.vision,
                'rental': property_obj.rental,
                'descriptioon': property_obj.descriptioon,
                'closingFee': property_obj.closingFee,
                'bedrooms': property_obj.bedrooms,
                'bathrooms': property_obj.bathrooms,
                'readyBy': property_obj.readyBy,
                'propertyReferenceId': property_obj.propertyReferenceId,
                'maintenanceFee': property_obj.maintenanceFee,

                'finance_rental':property_obj.finance_rental,
                'finance_total_closing_fee':property_obj.finance_total_closing_fee,
                'finance_maintaince_fee':property_obj.finance_maintaince_fee,
                'finance_bill_utilites':property_obj.finance_bill_utilites,
                
                'cashflow_forecast': property_obj.cashflow_forecast,
                'disclaimer':property_obj.disclaimer,
                'property_information':property_obj.property_information,
                'required_capital':property_obj.required_capital,
                'residental_property_details':property_obj.residental_property_details,
                'facility':ast.literal_eval(property_obj.facilities.strip()) if property_obj.facilities and property_obj.facilities.strip() else [],
                'location':property_obj.location,
                'latitude':property_obj.latitude,
                'longitude':property_obj.longitude,
                'subscription_type':property_obj.subscription_type,
                'is_draft':property_obj.is_draft,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  

class getRentProperty(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            property_obj = RentProperty.objects.all()
            property_obj_count = RentProperty.objects.all().count()
            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)
            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)
            paginator = Paginator(property_obj, page_per_data)
            try:
                property_obj = paginator.page(page)
            except PageNotAnInteger:
                property_obj = paginator.page(1)
            except EmptyPage:
                property_obj = paginator.page(paginator.num_pages)
            allData=[]
            for property in property_obj:
                if property.status == 0:
                    status_info = "Pending"
                elif property.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                alldata ={
                    'id':property.id,
                    'title':property.title,
                    'main_category':property.category,
                    'subcategory':property.subCategory,
                    'image_data':property.image_data,
                    'customer':property.customerId.id,
                    'status':status_info
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Rent property fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(property_obj),'total':property_obj_count},status=status.HTTP_200_OK,)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  

class getRentPropertDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            rent_id = self.request.query_params.get('rent_id')
            if not rent_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Rent Id is required'},status=status.HTTP_400_BAD_REQUEST)
            rentobj = RentProperty.objects.filter(id=rent_id).first()
            if not rentobj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No rent property found'},status=status.HTTP_400_BAD_REQUEST)
            if rentobj.status == 0:
                status_info = "Accepted"
            else:
                status_info = "Rejected"

            alldata = {
                    'id':rentobj.id,
                     'customer_id' : rentobj.customerId.id,
                     'customer_name' : rentobj.customerId.firstName +' '+ rentobj.customerId.lastName,
                     'customer_phone_number' : rentobj.customerId.phoneNumber,
                     'customer_images' : rentobj.customerId.profileImage,
         
                    'title':rentobj.title,
                    'category': rentobj.category,
                    'sub_category': rentobj.subCategory,
                    'image_data': ast.literal_eval(rentobj.image_data.strip()) if rentobj.image_data and rentobj.image_data.strip() else [],
                    'video':rentobj.video,
                     'videos_thumbnail':rentobj.videos_thumbnail,
                    'floor': rentobj.floor,
                    'rooms': rentobj.rooms,
                    'bedrooms': rentobj.bedrooms,
                    'size': rentobj.size,
                    'facilites':  ast.literal_eval(rentobj.facilites.strip()) if rentobj.facilites and rentobj.facilites.strip() else [],
                    'deposit': rentobj.deposit,
                    'country' : rentobj.country,
                    'state' : rentobj.state,
                    'city' :rentobj.city,
                    'postal_code' : rentobj.postal_code,
                    'house_number' : rentobj.house_number,
                    'landmark' : rentobj.landmark,
                     'benefits': ast.literal_eval(rentobj.benefits.strip()) if rentobj.benefits and rentobj.benefits.strip() else [],

                    'rental_period': rentobj.rental_period,
                    'avaiable_from_date': rentobj.avaiable_from_date,
                    'monthly_rent': rentobj.monthly_rent,
                    'monthly_rent_includes': ast.literal_eval(rentobj.monthly_rent_includes.strip()) if rentobj.monthly_rent_includes and rentobj.monthly_rent_includes.strip() else [], 
                    'security': ast.literal_eval(rentobj.security.strip()) if rentobj.security and rentobj.security.strip() else [], 
                    'security_amount': rentobj.security_amount,
                    'heading': rentobj.heading,
                    'description': rentobj.description,
                    'display_information': rentobj.display_information,
                    'name_of_ad': rentobj.name_of_ad,
                    'visibilty': rentobj.visibilty,
                    'location': rentobj.location,
                    'latitude': rentobj.latitude,
                    'longitude':rentobj.longitude,
                    'subscription_type':rentobj.subscription_type,
                    'property_overview': rentobj.property_overview,
                    'type_property': rentobj.type_property,
                    'description_home': rentobj.description_home,
                    'spend_time': rentobj.spend_time,
                    'useless_skill': rentobj.useless_skill,
                    'fun_act': rentobj.fun_act,
                    'biography': rentobj.biography,
                    'primary_room': rentobj.primary_room,
                    'housing_type': rentobj.housing_type,
                    'key_info_bedroom': rentobj.key_info_bedroom,
                    'story': rentobj.story,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  

class viewPropertyRequest(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            request_property_id = self.request.query_params.get('request_property_id')
            if not request_property_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Property request is required'},status=status.HTTP_400_BAD_REQUEST)
            property_obj = SaleAndRentProperty.objects.filter(id=request_property_id).first()
            if not property_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No property found'},status=status.HTTP_400_BAD_REQUEST)
            if property_obj.propertyStatus == 0:
                status_info = "Pending"
            elif property_obj.status == 1:
                status_info = "Approved"
            else:
                status_info = "Disapproved"

            alldata = {
                'property_id':property_obj.id,
                'property_type':property_obj.propertyType,
                'title':property_obj.title,
                'category':property_obj.subCategory,
                'subcategory':property_obj.subCategory,
                'image':property_obj.image,
                'youtube_url':property_obj.youtubeUrl,
                'phone_number':property_obj.phoneNumber,
                'description':property_obj.descriptioon,
                'size':property_obj.size,
                'closingFee':property_obj.closingFee,
                'bedrooms':property_obj.bedrooms,
                'bathrooms':property_obj.bathrooms,
                'developer':property_obj.developer,
                'annual_community_fee':property_obj.annualCommunityFee,
                'property_reference_id':property_obj.propertyReferenceId,
                'buyer_transfer_fee':property_obj.buyerTransferFee,
                'seller_transfer_fee':property_obj.sellerTransferFee,
                'maintenance_fee':property_obj.maintenanceFee,
                'occupancy_status':property_obj.occupancyStatus,
                'amenities':property_obj.amenities,
                'user_is':property_obj.userIs,
                'building':property_obj.building,
                'neighbourhood':property_obj.neighbourhood,
                'latitude':property_obj.latitude,
                'longitude':property_obj.longitude,
                'status':status_info
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  

class addCategory(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            category_name = request.data.get('category_name')
            if not category_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Catgeory name is required'},status=status.HTTP_400_BAD_REQUEST)
            category_description = request.data.get('category_description')
            if not category_description:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Categroy description is required'},status=status.HTTP_400_BAD_REQUEST)
            category_obj = categories.objects.create(category_name=category_name,category_description=category_description)
            if request.data.get('category_image'):
                    fileUrl=uploadThecategory(request.data.get('category_image'))
                    fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                    category_obj.category_image=str(fileUrl)
            category_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Main category created successfully'},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  

class editCategory(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            category_id = request.data.get('category_id')
            if not category_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Category Id is required'},status=status.HTTP_400_BAD_REQUEST)
            category_name = request.data.get('category_name')
            if not category_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Category name is required'},status=status.HTTP_400_BAD_REQUEST)
            category_description = request.data.get('category_description')
            if not category_description:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Category name is required'},status=status.HTTP_400_BAD_REQUEST)
            categories.objects.filter(id=category_id).update(category_name=category_name,category_description=category_description)
            if request.data.get('category_image'):
                fileUrl=uploadThecategory(request.data.get('category_image'))
                fileUrl=str(settings.BASE_URL)+'/'+fileUrl
                categories.objects.filter(id=category_id).update(category_image=str(fileUrl))
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Catgeory updated 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 changeStatusCategory(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            category_id = request.data.get('category_id')
            if not category_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Category Id is required'},status=status.HTTP_400_BAD_REQUEST)
            status_data = request.data.get('status')
            if not status_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Status is required'},status=status.HTTP_400_BAD_REQUEST)        
            status_obj        = categories.objects.get(id = category_id)
            status_obj.status = status_data
            status_obj.save()
            if status_obj.status == "1":
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Category activated successfully'},status=status.HTTP_200_OK)
            else:
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Category deactivated 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 deleteCategory(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            category_id = request.data.get('category_id')
            categories.objects.filter(id = category_id).update(end_date = datetime.now())
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Category deleted 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 categoryListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_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)
            search = self.request.query_params.get('search')
            if search:
                category_obj = categories.objects.filter(Q(product_name_arabic__icontains=search),end_date__isnull=True)
            else:
                category_obj = categories.objects.filter(end_date__isnull=True)
            paginator = Paginator(category_obj, page_per_data)
            try:
                category_obj = paginator.page(page)
            except PageNotAnInteger:
                category_obj = paginator.page(1)
            except EmptyPage:
                category_obj = paginator.page(paginator.num_pages)
            allData = []
            for category in category_obj:
                all_data = {
                    'category_id':category.id,
                    'category_name': category.category_name,
                    'category_description':category.category_description,
                    'category_image':category.category_image
                }
                allData.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Category fetched successfully','page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(product_obj)},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 adminContactManagement(APIView):
    def get (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,algorithms=["HS256"])
            user_id = decoded['user_id']
            contact = AdminContactManagement.objects.all().first()
            alldata = {
                    'id' : contact.id,
                    'phone_number' : contact.phone_number,
                    'email' : contact.email,
                    'instagram_url' : contact.instagram_url,
                    'facebook_url' : contact.facebook_url,
                    'youtube_url' : contact.youtube_url,
                    'twitter_url' : contact.twitter_url,
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            phone_number = request.data.get('phone_number')
            if not phone_number:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Phone number id is required'},status=status.HTTP_400_BAD_REQUEST)
            email = request.data.get('email')
            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Email id is required'},status=status.HTTP_400_BAD_REQUEST)
            instagram_url = request.data.get('instagram_url')
            if not instagram_url:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Instagram url is required'},status=status.HTTP_400_BAD_REQUEST)
            facebook_url = request.data.get('facebook_url')
            if not facebook_url:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Facebook url is required'},status=status.HTTP_400_BAD_REQUEST)
            youtube_url = request.data.get('youtube_url')
            if not youtube_url:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Youtube url is required'},status=status.HTTP_400_BAD_REQUEST)
            twitter_url = request.data.get('twitter_url')
            if not twitter_url:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Twitter url is required'},status=status.HTTP_400_BAD_REQUEST)
            contact_obj = AdminContactManagement.objects.all().first()
            if not contact_obj:
                contact = AdminContactManagement.objects.create(phone_number=phone_number,email=email,instagram_url=instagram_url,facebook_url=facebook_url,
                twitter_url=twitter_url)
            else:
                contact = AdminContactManagement.objects.filter(id=contact_obj.id).update(phone_number=phone_number,email=email,instagram_url=instagram_url,facebook_url=facebook_url, twitter_url=twitter_url)
            
            alldata = {
                'id' : contact.id,
                'phone_number' : contact.phone_number,
                'email' : contact.email,
                'instagram_url' : contact.instagram_url,
                'facebook_url' : contact.facebook_url,
                'youtube_url' : contact.youtube_url,
                'twitter_url' : contact.twitter_url,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class adminNotifications(APIView):
    def get (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,algorithms=["HS256"])
            user_id = decoded['user_id']
            not_obj =  AdminNotifications.objects.filter(end_date__isnull = True).order_by('-id')
            allData = []
            for notify in not_obj:
                alldata = {
                    'id':notify.id,
                    'message':notify.message,
                    'notification_type':notify.notification_type,
                    'is_read':notify.is_read,
                    'date':notify.start_date
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData},status=status.HTTP_200_OK)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 

class deleteAdminNotifications(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            ids = request.data.get('delete_id')
            for i in ids:
                AdminNotifications.objects.filter(id=i).update(end_date = datetime.now())
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Deleted 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 readNotificationsSelect(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            ids = request.data.get('delete_id')
            for i in ids:
                AdminNotifications.objects.filter(id=i).update(is_read = True)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Read successfully'})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 



class readNotifications(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            not_obj = AdminNotifications.objects.all()
            for notify in not_obj:
                notify.is_read = True
                notify.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Readed 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 bussinessSaleListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_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)
            sale_obj = BussinessForSale.objects.all().order_by('-id')
            total_count = BussinessForSale.objects.all().count()
            paginator = Paginator(sale_obj, page_per_data)
            try:
                sale_obj = paginator.page(page)
            except PageNotAnInteger:
                sale_obj = paginator.page(1)
            except EmptyPage:
                sale_obj = paginator.page(paginator.num_pages)
            
            
            
                
            allData = []
            for sale in sale_obj:
                if sale.status == 0:
                    status_info = "Pending"
                elif sale.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                alldata={
                    'id': sale.id,
                    'customer_name' : sale.customerId.firstName +' '+ sale.customerId.lastName,
                    'company_name': sale.company_name,
                    'short_title': sale.short_title,
                    'image_data': ast.literal_eval(sale.image_data) if sale.image_data else None,
                    'videos': sale.videos,
                    'videos_thumbnail': sale.videos_thumbnail,
                    'company_name': sale.company_name,
                    'description': sale.description,
                    'total_turnover': sale.total_turnover,
                    'rent': sale.rent,
                    'established_year': sale.established_year,
                    'premises': sale.premises,
                    'years_of_work': sale.years_of_work,
                    'operation_concept': sale.operation_concept,
                    'operation_opening_hours': sale.operation_opening_hours,
                    'turnover_last_year': sale.turnover_last_year,
                    'salary_percentage': sale.salary_percentage,
                    'other_operating_cost': sale.other_operating_cost,
                    'cost': sale.cost,
                    'reason_for_sale':sale.reason_for_sale,
                    'website_link':sale.website_link,
                    'number_of_employes':sale.number_of_employes,
                    'other_operating_cost':sale.other_operating_cost,
                    'area':sale.area,
                    'term_of_lease': sale.term_of_lease,
                    'document':ast.literal_eval(sale.document) if sale.document else None, 
                    'details': sale.details,
                    'service':sale.service,
                    'operations':sale.operations,
                    'market_initatives':sale.market_initatives,
                    'advantage_and_oppurtunity':sale.advantage_and_oppurtunity,
                    'valuation':sale.valuation,
                    'owner_name':sale.owner_name,
                    'phone':sale.phone,
                    'telephone':sale.telephone,
                    'email':sale.email,
                    'company':sale.company,
                    'public_order':sale.public_order,
                    'avaiable_attachment':sale.avaiable_attachment,
                    'location':sale.location,
                    'latitude':sale.latitude,
                    'longitude':sale.longitude,    
                    'status':status_info,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(sale_obj),'total':total_count})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 

class bussinessSaleDetail(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            bussiness_id = self.request.query_params.get('bussiness_id') 
            if not bussiness_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Bussiness sale Id is required'},status=status.HTTP_400_BAD_REQUEST)
            bussiness_obj = BussinessForSale.objects.filter(id=bussiness_id).first()
            if not bussiness_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No bussiness sale found'},status=status.HTTP_400_BAD_REQUEST)
            if bussiness_obj.status == 0:
                status_info = "Pending"
            elif bussiness_obj.status == 1:
                status_info = "Approved"
            else:
                status_info = "Disapproved"
            alldata = {
                'id': bussiness_obj.id,
                'customer_name' : bussiness_obj.customerId.firstName +' '+ bussiness_obj.customerId.lastName,
                'company_name': bussiness_obj.company_name,
                'short_title': bussiness_obj.short_title,
                'image_data': ast.literal_eval(bussiness_obj.image_data),
                'videos': bussiness_obj.videos,
                'videos_thumbnail': bussiness_obj.videos_thumbnail,
                'company_name': bussiness_obj.company_name,
                'description': bussiness_obj.description,
                'total_turnover': bussiness_obj.total_turnover,
                'rent': bussiness_obj.rent,
                'established_year': bussiness_obj.established_year,
                'premises': bussiness_obj.premises,
                'years_of_work': bussiness_obj.years_of_work,
                'operation_concept': bussiness_obj.operation_concept,
                'operation_opening_hours': bussiness_obj.operation_opening_hours,
                'turnover_last_year': bussiness_obj.turnover_last_year,
                'salary_percentage': bussiness_obj.salary_percentage,
                'other_operating_cost': bussiness_obj.other_operating_cost,
                'cost': bussiness_obj.cost,
                'reason_for_sale':bussiness_obj.reason_for_sale,
                'website_link':bussiness_obj.website_link,
                'number_of_employes':bussiness_obj.number_of_employes,
                'other_operating_cost':bussiness_obj.other_operating_cost,
                'area':bussiness_obj.area,
                'term_of_lease': bussiness_obj.term_of_lease,
                'document':ast.literal_eval(bussiness_obj.document), 
                'details': bussiness_obj.details,
                'service':bussiness_obj.service,
                'operations':bussiness_obj.operations,
                'market_initatives':bussiness_obj.market_initatives,
                'advantage_and_oppurtunity':bussiness_obj.advantage_and_oppurtunity,
                'valuation':bussiness_obj.valuation,
                'owner_name':bussiness_obj.owner_name,
                'phone':bussiness_obj.phone,
                'telephone':bussiness_obj.telephone,
                'email':bussiness_obj.email,
                'company':bussiness_obj.company,
                'public_order':bussiness_obj.public_order,
                'avaiable_attachment':bussiness_obj.avaiable_attachment,
                'location':bussiness_obj.location,
                'latitude':bussiness_obj.latitude,
                'status':status_info,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata})
        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 houseWantedForRentList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            page = 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 = 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)
            rent_obj =  HouseWantedForRent.objects.all()
            total_count = HouseWantedForRent.objects.all().count()
            paginator = Paginator(rent_obj, page_per_data)
            try:
                rent_obj = paginator.page(page)
            except PageNotAnInteger:
                rent_obj = paginator.page(1)
            except EmptyPage:
                rent_obj = paginator.page(paginator.num_pages)
            allData = []
            for rent in rent_obj:
                if rent.status == 0:
                    status_info = "Pending"
                elif rent.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"

                alldata = {
                    'id': rent.id,
                    'customer_id':rent.customerId.id,
                    'fullname': rent.first_name+' '+ rent.last_name,
                    'phone_number':rent.phone_number,
                    'max_month_price':rent.max_month_price,
                    'short_title':rent.short_title,
                    'rental_period':rent.rental_period,
                    'desired_start_date':rent.desired_start_date,
                    'location':rent.location,
                    'status':status_info
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(rent_obj),'total':total_count})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class houseWantedForRentDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            rent_id = self.request.query_params.get('rent_id') 
            if not rent_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Rent sale Id is required'},status=status.HTTP_400_BAD_REQUEST)
            rent_obj = HouseWantedForRent.objects.filter(id=rent_id).first()
            if not rent_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No house for rent found'},status=status.HTTP_400_BAD_REQUEST)
            
            if rent_obj.status == 0:
                status_info = "Pending"
            elif rent_obj.status == 1:
                status_info = "Approved"
            else:
                status_info = "Disapproved"

            alldata = {
                
                'id': rent_obj.id,
                'short_title':rent_obj.short_title,
                'customer_id':rent_obj.customerId.id,
                'fullname': rent_obj.first_name+' '+ rent_obj.last_name,
                'profile_visiblity':rent_obj.profile_visiblity,
                'profile_hidden':rent_obj.profile_hidden,
                'image': ast.literal_eval(rent_obj.image),
                'first_name': rent_obj.first_name,
                'last_name': rent_obj.last_name,
                'gender': rent_obj.gender,
                'dob': rent_obj.dob,
                'nationality': rent_obj.nationality,
                'phone_number':rent_obj.phone_number,
                'email': rent_obj.email,
                'quantity': rent_obj.quantity,
                'rental_period': rent_obj.rental_period,
                'max_rent': rent_obj.max_rent,
                'from_date': rent_obj.from_date,
                'housing_type':rent_obj.housing_type,
                'number_of_people':rent_obj.number_of_people,
                'max_month_price': rent_obj.max_month_price,
                'desired_start_date':rent_obj.desired_start_date,
                'desired_area': rent_obj.desired_area,
                'latitude':rent_obj.latitude,
                'longitude':rent_obj.longitude,
                'location':rent_obj.location,
                'about':rent_obj.about,
                'education':rent_obj.education,
                'martial_status':rent_obj.martial_status,
                'cleanliness':rent_obj.cleanliness,
                'party_habits':rent_obj.party_habits,
                'work':rent_obj.work,
                'interest':rent_obj.interest,
                'subscription_type':rent_obj.subscription_type,
                'is_draft':rent_obj.is_draft,
                'created_date':rent_obj.start_date,
                'status':status_info,
        
            
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata})

        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 investProjectList(APIView):
    def get(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, algorithms=["HS256"])
            user_id = decoded['user_id']

            page = self.request.query_params.get('page')
            if not page:
                return Response({'status_code': status.HTTP_400_BAD_REQUEST, 'status_message': 'Page Number 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 is required'}, status=status.HTTP_400_BAD_REQUEST)

            invest_obj = InvestmentMyProject.objects.all()
            total_count = invest_obj.count()
            paginator = Paginator(invest_obj, page_per_data)

            try:
                invest_obj = paginator.page(page)
            except PageNotAnInteger:
                invest_obj = paginator.page(1)
            except EmptyPage:
                invest_obj = paginator.page(paginator.num_pages)

            allData = []
            for invest in invest_obj:
                alldata = {
                    'id': invest.id,
                    'customer_id': invest.customerId.id,
                    'fullname': f"{invest.customerId.firstName} {invest.customerId.lastName}",
                    'property_name': invest.property_name,
                    'image_data': invest.image_data,
                    'videos': invest.videos,
                    'documents_data': invest.documents_data,
                    'property_type': invest.property_type,
                    'assest_equality': invest.assest_equality,
                    'investment_highlight': invest.investment_highlight,
                    'equity_price': invest.equity_price,
                    'lp_equity_percent': invest.lp_equity_percent,
                    'gp_equity_percent': invest.gp_equity_percent,
                    'debt_percent': invest.debt_percent,
                    'property_at_glance_title': invest.property_at_glance_title,
                    'description': invest.description,
                    'bussiness_plan': invest.bussiness_plan,
                    'minimum_investment': invest.minimum_investment,
                    'investment_strategy': invest.investment_strategy,
                    'expected_attitude_price': invest.expected_attitude_price,
                    'financed': invest.financed,
                    'target_return_on_cost': invest.target_return_on_cost,
                    'target_irr': invest.target_irr,
                    'offered_by': invest.offered_by,
                    'estimated_first_distribution': invest.estimated_first_distribution,
                    'type_of_investment': invest.type_of_investment,
                    'phone_number': invest.phone_number,
                    'measure_for_multiplier': invest.measure_for_multiplier,
                    'address': invest.address,
                    'location_details': invest.location_details,
                    'property_summary': invest.property_summary,
                    'property_details': invest.property_details,
                    'overview': invest.overview,
                    'debt_assumption': invest.debt_assumption,
                    'location': invest.location,
                    'latitude': invest.latitude,
                    'longitude': invest.longitude,
                    'subscription_type': invest.subscription_type,
                    'status': invest.status,
                    'is_draft': invest.is_draft,
                }
                allData.append(alldata)

            # ✅ Now outside the loop
            return Response({
                'status_code': status.HTTP_200_OK,
                'status_message': 'Fetched successfully',
                'data': allData,
                'page': page,
                'page_count': paginator.num_pages,
                'per_page': len(invest_obj),
                'total': total_count
            })

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


class investProjectDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            project_id = self.request.query_params.get('project_id') 
            if not project_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Rent sale Id is required'},status=status.HTTP_400_BAD_REQUEST)
            pro_obj = InvestmentMyProject.objects.filter(id=project_id).first()
            if not pro_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No house for rent found'},status=status.HTTP_400_BAD_REQUEST)
            
            alldata = {
                    'id': pro_obj.id,
                    'customer_id':pro_obj.customerId.id,
                    'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                    'property_name':pro_obj.property_name,
                    'image_data':pro_obj.image_data,
                    'videos':pro_obj.videos,
                    'documents_data':pro_obj.documents_data,
                    'property_type':pro_obj.property_type,
                    'assest_equality':pro_obj.assest_equality,
                    'investment_highlight':pro_obj.investment_highlight,
                    'equity_price':pro_obj.equity_price,
                    'lp_equity_percent':pro_obj.lp_equity_percent,
                    'gp_equity_percent':pro_obj.gp_equity_percent,
                    'debt_percent':pro_obj.debt_percent,
                    'property_at_glance_title':pro_obj.property_at_glance_title,
                    'description':pro_obj.description,
                    'bussiness_plan':pro_obj.bussiness_plan,
                    'minimum_investment':pro_obj.minimum_investment,
                    'investment_strategy':pro_obj.investment_strategy,
                    'expected_attitude_price':pro_obj.expected_attitude_price,
                    'financed':pro_obj.financed,
                    'target_return_on_cost':pro_obj.target_return_on_cost,
                    'target_irr':pro_obj.target_irr,
                    'lp_equity_percent':pro_obj.lp_equity_percent,
                    'offered_by':pro_obj.offered_by,
                    'estimated_first_distribution':pro_obj.estimated_first_distribution,
                    'type_of_investment':pro_obj.type_of_investment,
                    'phone_number':pro_obj.phone_number,
                    'measure_for_multiplier':pro_obj.measure_for_multiplier,
                    'address':pro_obj.address,
                    'location_details':pro_obj.location_details,
                    'property_summary':pro_obj.property_summary,
                    'property_details':pro_obj.property_details,
                    'overview':pro_obj.overview,
                    'debt_assumption':pro_obj.debt_assumption,
                    'location':pro_obj.location,
                    'latitude':pro_obj.latitude,
                    'longitude':pro_obj.longitude,
                    'subscription_type':pro_obj.subscription_type,
                    'status':pro_obj.status,
                    'is_draft':pro_obj.is_draft,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata})

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

class investmentCompanyList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_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)
            property_obj =  InvestmentMyCompany.objects.all()
            total_count = InvestmentMyCompany.objects.all().count()
            paginator = Paginator(property_obj, page_per_data)
            try:
                property_obj = paginator.page(page)
            except PageNotAnInteger:
                property_obj = paginator.page(1)
            except EmptyPage:
                property_obj = paginator.page(paginator.num_pages)
            allData = []
            for pro_obj in property_obj:
                alldata = {
                    'id': pro_obj.id,
                    'customer_id':pro_obj.customerId.id,
                    'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                    'company_name' :pro_obj.property_name,
                    'company_established' :pro_obj.company_established,
                    'company_email' :pro_obj.company_email,
                    'the_valuation' :pro_obj.the_valuation,
                    'shares_for_sale' :pro_obj.shares_for_sale,
                    'price_per_share':pro_obj.price_per_share,
                    'minimum_drawing' :pro_obj.minimum_drawing,
                    'max_drawing' :pro_obj.max_drawing,
                    'status': pro_obj.status,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(property_obj),'total':total_count})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class investmentCompanyDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            project_id = self.request.query_params.get('project_id') 
            if not project_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Rent sale Id is required'},status=status.HTTP_400_BAD_REQUEST)
            pro_obj = InvestmentMyCompany.objects.filter(id=project_id).first()
            if not pro_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No house for rent found'},status=status.HTTP_400_BAD_REQUEST)
            
            alldata = {
                'id': pro_obj.id,
                'company_logo':pro_obj.company_logo,
                'company_video':pro_obj.company_video,
                'customer_id':pro_obj.customerId.id,
                'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                'property_name' :pro_obj.property_name,
                'documents_data':pro_obj.documents_data,
                'property_type' :pro_obj.property_type,
                'company_established' :pro_obj.company_established,
                'company_email' :pro_obj.company_email,
                'company_phonenumber':pro_obj.company_phonenumber,
                'company_address' :pro_obj.company_address,
                'shareholders' :pro_obj.shareholders,
                'share' :pro_obj.share,
                'description' :pro_obj.description,
                'the_valuation' :pro_obj.the_valuation,
                'shares_for_sale' :pro_obj.shares_for_sale,
                'price_per_share' :pro_obj.price_per_share,
                'postal_code' :pro_obj.postal_code,
                'bank_acc_created' :pro_obj.bank_acc_created,
                'issue_account_no' :pro_obj.issue_account_no,
                'post_number' :pro_obj.post_number,
                'self_report' :pro_obj.self_report,
                'minimum_drawing' :pro_obj.minimum_drawing,
                'max_drawing' :pro_obj.max_drawing,
                'remaninig_shares' :pro_obj.remaninig_shares,
                'no_share_bfr_issue' :pro_obj.no_share_bfr_issue,
                'nominal_share_price' :pro_obj.nominal_share_price,
                'company_website' :pro_obj.company_website,
                'subscription_type' :pro_obj.subscription_type,
                'status' :pro_obj.status,
                'agency' :pro_obj.agency.id,
                "location": pro_obj.location,
                'latitude': pro_obj.latitude,
                'longitude': pro_obj.longitude,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata})

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


class approveDisapproveRequest(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            request_type =  request.data.get('request_type')
            if not request_type:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'request_type id is required'},status=status.HTTP_400_BAD_REQUEST)
            
            property_id = request.data.get('property_id')
            if not property_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_id id is required'},status=status.HTTP_400_BAD_REQUEST)
                
            new_status = request.data.get('status')
            if not new_status:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'status  is required'},status=status.HTTP_400_BAD_REQUEST)
            
            
            if request_type == "property_project":
                property_obj = PropertyProject.objects.filter(id = property_id).first()
                if not property_obj:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No property project found'},status=status.HTTP_400_BAD_REQUEST)
                if new_status == 1:
                    property_obj.status = 1
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your property project:" + property_obj.short_title + " has been approved by the admin",notification_type="appprove_request")
                    message = "\nYour property project:\n" + property_obj.short_title + "\n has been approved by the admin"
                    to_emails = property_obj.customerId.email
                    subject = "Property Project Approved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
                else:
                    reason =  request.data.get('reason')
                    property_obj.status = 2
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your property project: " + property_obj.short_title + " has been disapproved by the admin.",notification_type="disappprove_request")
                    message = "\nYour property project:\n" + property_obj.short_title + "\n has been disapproved by the admin." + "\n Reason:"+ reason
                    to_emails = property_obj.customerId.email
                    subject = "Property Project Disapproved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
                    
            elif request_type == "sale_property":
                property_obj = SaleProperty.objects.filter(id = property_id).first()
                if not property_obj:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No sale property found'},status=status.HTTP_400_BAD_REQUEST)
                if new_status == 1:
                    property_obj.status = 1
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your sale property:" + property_obj.title + " has been approved by the admin",notification_type="appprove_request")

                    message = "\nYour sale property:\n" + property_obj.title + "\n has been approved by the admin"
                    to_emails = property_obj.customerId.email
                    subject = "Sale Property Approved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
                else:
                    reason =  request.data.get('reason')
                    property_obj.status = 2
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your sale property: " + property_obj.title + " has been disapproved by the admin.",notification_type="disappprove_request")

                    message = "\nYour sale property:\n" + property_obj.title + "\n has been disapproved by the admin." + "\n Reason:"+ reason
                    to_emails = property_obj.customerId.email
                    subject = "Sale Property Disapproved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
            elif request_type == "rent_property":
                property_obj = RentProperty.objects.filter(id = property_id).first()
                if not property_obj:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No rent property found'},status=status.HTTP_400_BAD_REQUEST)
                if new_status == 1:
                    property_obj.status = 1
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your rent property:" + property_obj.title + " has been approved by the admin",notification_type="appprove_request")

                    message = "\nYour rent property:\n" + property_obj.title + "\n has been approved by the admin"
                    to_emails = property_obj.customerId.email
                    subject = "Rent Property Approved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
                else:
                    reason =  request.data.get('reason')
                    property_obj.status = 2
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your rent property: " + property_obj.title + " has been disapproved by the admin.",notification_type="disappprove_request")

                    message = "\nYour rent property:\n" + property_obj.title + "\n has been disapproved by the admin." + "\n Reason:"+ reason
                    to_emails = property_obj.customerId.email
                    subject = "Rent Property Disapproved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)   
            elif request_type == "property_developers":
                property_obj = PropertyDevelopers.objects.filter(id = property_id).first()
                if not property_obj:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No property developer found'},status=status.HTTP_400_BAD_REQUEST)
                if new_status == 1:
                    property_obj.status = 1
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your property developers:" + property_obj.property_name + " has been approved by the admin",notification_type="appprove_request")

                    message = "\nYour property developers:\n" + property_obj.property_name + "\n has been approved by the admin"
                    to_emails = property_obj.customerId.email
                    subject = "Property Developer Approved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
                else:
                    reason =  request.data.get('reason')
                    property_obj.status = 2
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your property developers: " + property_obj.property_name + " has been disapproved by the admin.",notification_type="disappprove_request")

                    message = "\nYour property developers:\n" + property_obj.property_name + "\n has been disapproved by the admin." + "\n Reason:"+ reason
                    to_emails = property_obj.customerId.email
                    subject = "Property Developer Disapproved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)   
            elif request_type == "house_tenant":
                property_obj = HouseWantedForRent.objects.filter(id = property_id).first()
                if not property_obj:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No house tenant found'},status=status.HTTP_400_BAD_REQUEST)
                if new_status == 1:
                    property_obj.status = 1
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your house tenant:" + property_obj.short_title + " has been approved by the admin",notification_type="appprove_request")

                    message = "\nYour house tenant:\n" + property_obj.short_title + "\n has been approved by the admin"
                    to_emails = property_obj.customerId.email
                    subject = "House tenant Approved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
                else:
                    reason =  request.data.get('reason')
                    property_obj.status = 2
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your house tenant:" + property_obj.short_title + " has been disapproved by the admin",notification_type="appprove_request")

                    message = "\nYour house tenant:\n" + property_obj.short_title + "\n has been disapproved by the admin." + "\n Reason:"+ reason
                    to_emails = property_obj.customerId.email
                    subject = "House tenant Disapproved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)   
            elif request_type == "bussiness_for_sale":
                property_obj = BussinessForSale.objects.filter(id = property_id).first()
                if not property_obj:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No house tenant found'},status=status.HTTP_400_BAD_REQUEST)
                if new_status == 1:
                    property_obj.status = 1
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your bussiness for sale:" + property_obj.short_title + " has been approved by the admin",notification_type="appprove_request")

                    message = "\nYour bussiness for sale:\n" + property_obj.short_title + "\n has been approved by the admin"
                    to_emails = property_obj.customerId.email
                    subject = "Bussiness For Sale Approved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
                else:
                    reason =  request.data.get('reason')
                    property_obj.status = 2
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your bussiness for sale:" + property_obj.short_title + " has been disapproved by the admin",notification_type="appprove_request")

                    message = "\nYour bussiness for sale:\n" + property_obj.short_title + "\n has been disapproved by the admin." + "\n Reason:"+ reason
                    to_emails = property_obj.customerId.email
                    subject = "Bussiness For Sale Disapproved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)   
            elif request_type == "company_seeking":
                property_obj = CompanySeekingEquity.objects.filter(id = property_id).first()
                if not property_obj:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No company seeking found'},status=status.HTTP_400_BAD_REQUEST)
                if new_status == 1:
                    property_obj.status = 1
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your company seeking for equity:" + property_obj.short_title + " has been approved by the admin",notification_type="appprove_request")

                    message = "\nYour company seeking for equity:\n" + property_obj.short_title + "\n has been approved by the admin"
                    to_emails = property_obj.customerId.email
                    subject = "Company seeking equity Approved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)
                else:
                    reason =  request.data.get('reason')
                    property_obj.status = 2
                    property_obj.save()
                    CustomerNotifications.objects.create(customer_id =property_obj.customerId,message="Your company seeking for equity:" + property_obj.short_title + " has been disapproved by the admin",notification_type="appprove_request")

                    message = "\nYour company seeking for equity:\n" + property_obj.short_title + "\n has been approved by the admin." + "\n Reason:"+ reason
                    to_emails = property_obj.customerId.email
                    subject = "Company seeking equity Disapproved:"
                    message = EmailMultiAlternatives(subject=subject, from_email=settings.EMAIL_HOST_USER, to=[to_emails],body=message)
                    message.send(fail_silently=False)   

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




class propertyProjectList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_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)
            property_obj =  PropertyProject.objects.all()
            total_count = PropertyProject.objects.all().count()
            paginator = Paginator(property_obj, page_per_data)
            try:
                property_obj = paginator.page(page)
            except PageNotAnInteger:
                property_obj = paginator.page(1)
            except EmptyPage:
                property_obj = paginator.page(paginator.num_pages)
            allData = []
            for pro_obj in property_obj:
                if pro_obj.status == 0:
                    status_info = "Pending"
                elif pro_obj.status == 1:
                    status_info = "Accepted"
                else:
                    status_info = "Rejected"

                alldata = {
                    'id': pro_obj.id,
                    'customer_id':pro_obj.customerId.id,
                    'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                    'property_name':pro_obj.property_name,
                    'location':pro_obj.location,
                    'price':pro_obj.price,
                    'rent_to_landlord':pro_obj.rent_to_landlord,
                    'return_on_investment':pro_obj.return_on_investment,
                    'cashflow_pcm':pro_obj.cashflow_pcm,
                    'status': status_info,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(property_obj),'total':total_count})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class propertyProjectDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            project_id = self.request.query_params.get('project_id') 
            if not project_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Project Id is required'},status=status.HTTP_400_BAD_REQUEST)
            pro_obj = PropertyProject.objects.filter(id=project_id).first()
            if not pro_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No property project found'},status=status.HTTP_400_BAD_REQUEST)
            
            if pro_obj.status == 0:
                status_info = "Pending"
            elif pro_obj.status == 1:
                status_info = "Accepted"
            else:
                status_info = "Rejected"

            alldata = {
                'id': pro_obj.id,
                'customer_id':pro_obj.customerId.id,
                'fullname': pro_obj.customerId.firstName+' '+ pro_obj.customerId.lastName,
                'customer_image':pro_obj.customerId.profileImage,
                'spend_too_much_time':pro_obj.spend_too_much_time,
                'most_useless_skill':pro_obj.most_useless_skill,
                'fun_act':pro_obj.fun_act,
                'biography':pro_obj.biography,
                'short_title':pro_obj.short_title,
                'property_overview':pro_obj.property_overview,
                'property_description':pro_obj.property_description,
                'image_data': ast.literal_eval(pro_obj.image_data),
                'videos':pro_obj.videos,
                'videos_thumbnail':pro_obj.videos_thumbnail,
                'property_document':pro_obj.property_document,
                'category':pro_obj.category,
                'property_name':pro_obj.property_name,
                'property_dimension':pro_obj.property_dimension,
                'country':pro_obj.country,
                'state':pro_obj.state,
                'city':pro_obj.city,
                'postal_code':pro_obj.postal_code,
                'landmark':pro_obj.landmark,
                'house_number':pro_obj.house_number,
                'location':pro_obj.location,
                'latitude':pro_obj.latitude,
                'longitude':pro_obj.longitude,
                'facility':ast.literal_eval(pro_obj.facility),
                'benefits':ast.literal_eval(pro_obj.benefits),
                'return_on_investment':pro_obj.return_on_investment,
                'finder_fee':pro_obj.finder_fee,
                'gross_income':pro_obj.gross_income,
                'price':pro_obj.price,
                'cashflow_pcm':pro_obj.cashflow_pcm,
                'total_termination_fee':pro_obj.total_termination_fee,
                'purchase_price':pro_obj.purchase_price,
                'potential_cashflow_pcm':pro_obj.potential_cashflow_pcm,
                'investment_finder_fee':pro_obj.investment_finder_fee,
                'investment_return_on_investment_fee':pro_obj.investment_return_on_investment_fee,
                'rental':pro_obj.rental,
                'the_vision':pro_obj.the_vision,
                'cost_to_consider':pro_obj.cost_to_consider,
                'capital_required':pro_obj.capital_required,
                'cashflow_forecast':pro_obj.cashflow_forecast,
                'investment_finder_fee':pro_obj.investment_finder_fee,
                'rent_to_landlord':pro_obj.rent_to_landlord,
                'bill_utilities':pro_obj.bill_utilities,
                'is_draft':pro_obj.is_draft,
                'status':status_info,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':alldata})

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

class allInquire(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            inquire_property_obj = inquirePropertyProject.objects.all()
            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 = inquirePropertyProject.objects.all().count()
            paginator = Paginator(inquire_property_obj, page_per_data)
            try:
                inquire_property_obj = paginator.page(page)
            except PageNotAnInteger:
                inquire_property_obj = paginator.page(1)
            except EmptyPage:
                inquire_property_obj = paginator.page(paginator.num_pages)
            all_Data = []
            for inquire_property in inquire_property_obj:
                all_data = {
                    'id':inquire_property.id,
                    'name':inquire_property.name,
                    'telephone':inquire_property.telephone,
                    'email':inquire_property.email,
                    'message':inquire_property.message,
                    'status':inquire_property.status,
                    'type':"PropertyProject"
                }
                all_Data.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':all_Data,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(inquire_property_obj),'total':total_count})

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

class viewInquire(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            inquire_id = self.request.query_params.get('inquire_id') 
            if not inquire_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Inquire Id is required'},status=status.HTTP_400_BAD_REQUEST)
            type = self.request.query_params.get('type')
            if type == 'SaleAndRent':
                inquire_obj = inquireSaleAndRentProperty.objects.filter(id=inquire_id).first()
                all_data = {
                    'id':inquire_obj.id,
                    'name':inquire_obj.name,
                    'telephone':inquire_obj.telephone,
                    'email':inquire_obj.email,
                    'message':inquire_obj.message,
                    'property_id':inquire_obj.sale_rent.id,
                    'property_owner_email':inquire_obj.customerId.email,
                    'status':inquire_obj.status,
                    'type':"SaleAndRent"
                }
            elif type == 'SaleProperty':
                inquire_obj = inquireSaleProperty.objects.filter(id=inquire_id).first()
                all_data = {
                    'id':inquire_obj.id,
                    'name':inquire_obj.name,
                    'telephone':inquire_obj.telephone,
                    'email':inquire_obj.email,
                    'message':inquire_obj.message,
                    'property_id':inquire_obj.sale.id,
                    'property_owner_email':inquire_obj.customerId.email,
                    'status':inquire_obj.status,
                    'type':"SaleProperty"
                }
            elif type == 'BusinessSale':
                inquire_obj = inquireBusinessSaleProperty.objects.filter(id=inquire_id).first()
                all_data = {
                    'id':inquire_obj.id,
                    'name':inquire_obj.name,
                    'telephone':inquire_obj.telephone,
                    'email':inquire_obj.email,
                    'message':inquire_obj.message,
                    'property_id':inquire_obj.sale_rent.id,
                    'property_owner_email':inquire_obj.customerId.email,
                    'status':inquire_obj.status,
                    'type':"BusinessSale"
                }
            elif type == 'PropertyProject':
                inquire_obj = inquirePropertyProject.objects.filter(id=inquire_id).first()
                all_data = {
                    'id':inquire_obj.id,
                    'name':inquire_obj.name,
                    'telephone':inquire_obj.telephone,
                    'email':inquire_obj.email,
                    'message':inquire_obj.message,
                    'property_id':inquire_obj.property_project.id,
                    'property_owner_email':inquire_obj.customerId.email,
                    'status':inquire_obj.status,
                    'type':"PropertyProject"
                }
            else:
                pass
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','data':all_data})

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

class approveDisapproveInquire(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            inquire_id = request.data.get('inquire_id')

            inquire_obj = inquireSaleAndRentProperty.objects.filter(id=inquire_id).first()

            if not inquire_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Inquire Id is required'},status=status.HTTP_400_BAD_REQUEST)
            status_action = request.data.get('status_action')
            if not status_action:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Action is required'},status=status.HTTP_400_BAD_REQUEST)
            user_inquire = Customer.objects.filter(id=inquire_obj.customerId.id).first()
            property_user = Customer.objects.filter(id=inquire_obj.sale_rent.customerId.id).first() 
            if int(status_action) == 1:
                inquireSaleAndRentProperty.objects.filter(id=inquire_id).update(status=1)
                CustomerNotifications.objects.create(customer_id =user_inquire,message="Your Inquire for"+ str(inquire_obj.sale_rent.id)+ "is apporved",notification_type="inquire")
                CustomerNotifications.objects.create(customer_id =property_user,message="Your Inquire for"+ str(inquire_obj.sale_rent.id)+ "is dissproved",notification_type="inquire")
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Inquire is approved successfully'})
            else:
                inquireSaleAndRentProperty.objects.filter(id=inquire_id).update(status=2)
                CustomerNotifications.objects.create(customer_id =user_inquire,message="Your Inquire for"+ str(inquire_obj.sale_rent.id)+ "is dissproved",notification_type="inquire")
                CustomerNotifications.objects.create(customer_id =property_user,message="Your Inquire for"+ str(inquire_obj.sale_rent.id)+ "is dissproved",notification_type="inquire")
                
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Inquire is disapproved successfully'})
        
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  
        
class approveDisapproveInquireBussiness(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            inquire_id = request.data.get('inquire_id')

            inquire_obj = inquireBusinessSaleProperty.objects.filter(id=inquire_id).first()

            if not inquire_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Inquire Id is required'},status=status.HTTP_400_BAD_REQUEST)
            status_action = request.data.get('status_action')
            if not status_action:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Action is required'},status=status.HTTP_400_BAD_REQUEST)
            user_inquire = Customer.objects.filter(id=inquire_obj.customerId.id).first()
            property_user = Customer.objects.filter(id=inquire_obj.sale_rent.customerId.id).first() 
            if int(status_action) == 1:
                inquireBusinessSaleProperty.objects.filter(id=inquire_id).update(status=1)
                CustomerNotifications.objects.create(customer_id =user_inquire,message="Your Inquire for"+ str(inquire_obj.company_name)+ "is apporved",notification_type="inquire")
                CustomerNotifications.objects.create(customer_id =property_user,message="Your Inquire for"+ str(inquire_obj.company_name)+ "is dissproved",notification_type="inquire")
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Inquire is approved successfully'})
            else:
                inquireBusinessSaleProperty.objects.filter(id=inquire_id).update(status=2)
                CustomerNotifications.objects.create(customer_id =user_inquire,message="Your Inquire for"+ str(inquire_obj.company_name)+ "is dissproved",notification_type="inquire")
                CustomerNotifications.objects.create(customer_id =property_user,message="Your Inquire for"+ str(inquire_obj.company_name)+ "is dissproved",notification_type="inquire")
                
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Inquire is disapproved successfully'})
        
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  
        
class approveDisapproveInquireProperty(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            inquire_id = request.data.get('inquire_id')

            inquire_obj = inquirePropertyProject.objects.filter(id=inquire_id).first()

            if not inquire_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Inquire Id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not inquire_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No inquire object found'},status=status.HTTP_400_BAD_REQUEST)
            status_action = request.data.get('status_action')
            if not status_action:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Action is required'},status=status.HTTP_400_BAD_REQUEST)
            user_inquire = Customer.objects.filter(id=inquire_obj.customerId.id).first()
            print('user_inquire',user_inquire)
            property_user = Customer.objects.filter(id=inquire_obj.property_project.customerId.id).first() 
            if int(status_action) == 1:
                inquirePropertyProject.objects.filter(id=inquire_id).update(status=1)
                CustomerNotifications.objects.create(customer_id =user_inquire,message="Your Inquire for"+ str(inquire_obj.property_project.property_name)+ "is apporved",notification_type="inquire")
                CustomerNotifications.objects.create(customer_id =property_user,message="Your Inquire for"+ str(inquire_obj.property_project.property_name)+ "is apporved",notification_type="inquire")
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Inquire is approved successfully'})
            else:
                inquirePropertyProject.objects.filter(id=inquire_id).update(status=2)
                CustomerNotifications.objects.create(customer_id =user_inquire,message="Your Inquire for"+ str(inquire_obj.property_project.property_name)+ "is dissproved",notification_type="inquire")
                CustomerNotifications.objects.create(customer_id =property_user,message="Your Inquire for"+ str(inquire_obj.property_project.property_name)+ "is dissproved",notification_type="inquire")
                
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Inquire is disapproved successfully'})
        
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  
        
class approveDisapproveInquireSale(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            inquire_id = request.data.get('inquire_id')

            inquire_obj = inquireSaleProperty.objects.filter(id=inquire_id).first()

            if not inquire_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Inquire Id is required'},status=status.HTTP_400_BAD_REQUEST)
            status_action = request.data.get('status_action')
            if not status_action:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Action is required'},status=status.HTTP_400_BAD_REQUEST)
            user_inquire = Customer.objects.filter(id=inquire_obj.customerId.id).first()
            if int(status_action) == 1:
                inquireSaleProperty.objects.filter(id=inquire_id).update(status=1)
                CustomerNotifications.objects.create(customer_id =user_inquire,message="Your Inquire for"+ str(inquire_obj.sale.title)+ "is apporved",notification_type="inquire")
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Inquire is approved successfully'})
            else:
                inquireSaleProperty.objects.filter(id=inquire_id).update(status=2)
                CustomerNotifications.objects.create(customer_id =user_inquire,message="Your Inquire for"+ str(inquire_obj.sale.title)+ "is dissproved",notification_type="inquire")
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Inquire is disapproved successfully'})
        
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  
        

class adminDashboard(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            property_project_count = PropertyProject.objects.filter(status=1).count()
            rent_property_count = RentProperty.objects.filter(status=1).count()
            sale_property_count = SaleProperty.objects.filter(status=1).count()
            house_wanted_rent_count = HouseWantedForRent.objects.filter(status=1).count()
            bussiness_for_sale_count = BussinessForSale.objects.filter(status=1).count()
            investment_my_company_count = InvestmentMyCompany.objects.filter(status=1).count()
            customer_count =  Customer.objects.all().count()
            count_data = {
                'property_project_count':property_project_count,
                'rent_property_count':rent_property_count,
                'sale_property_count':sale_property_count,
                'house_wanted_rent_count':house_wanted_rent_count,
                'bussiness_for_sale_count':bussiness_for_sale_count,
                'investment_my_company_count':investment_my_company_count,
                'customer_count':customer_count,
            }
            customer_obj = Customer.objects.order_by('-created_at')[:5]
            customer_data = []
            for customer in customer_obj:
                all_data = {
                    'id':customer.id,
                    'first_name':customer.firstName,
                    'last_name':customer.lastName,
                    'email':customer.email,
                    'phone_number':customer.phoneNumber,
                    'image':customer.profileImage,
                }
                customer_data.append(all_data)

            try:
                property_project = PropertyProject.objects.filter(status=1).latest('start_date')
            except PropertyProject.DoesNotExist:
                property_project = None

            try:
                rent_property = RentProperty.objects.filter(status=1).latest('created_at')
            except RentProperty.DoesNotExist:
                rent_property = None

            try:
                sale_property = SaleProperty.objects.filter(status=1).latest('created_at')
            except SaleProperty.DoesNotExist:
                sale_property = None

            
            try:
                bussines_sale = BussinessForSale.objects.filter(status=1).latest('start_date')
            except BussinessForSale.DoesNotExist:
                bussines_sale = None

            try:
                investment_my_project = InvestmentMyProject.objects.filter(status=1).latest('start_date')
            except InvestmentMyProject.DoesNotExist:
                investment_my_project = None

            
            try:
                investment_my_company = InvestmentMyCompany.objects.filter(status=1).latest('start_date')
            except InvestmentMyCompany.DoesNotExist:
                investment_my_company = None

            recentData = []
            if property_project:
                recentData.append({
                    'id': property_project.id,
                    'image': property_project.image_data,
                    'property_name': property_project.property_name,
                    'rent_to_landlord': property_project.rent_to_landlord,
                    'return_on_investment': property_project.return_on_investment,
                    'location':property_project.location,
                    'type':'property_project',
                })

            if rent_property:
                recentData.append({
                    'id': rent_property.id,
                    'title': rent_property.title,
                    'main_category':rent_property.category,
                    'subcategory':rent_property.subCategory,
                    'main_category':rent_property.category,
                    'image': rent_property.image_data,
                    'price': rent_property.monthly_rent,
                    'type':'rent_property',
                })

            if sale_property:
                recentData.append({

                    'id':sale_property.id,
                    'title':sale_property.title,
                    'main_category':sale_property.main_category,
                    'subcategory':sale_property.subCategory,
                    'image_data':sale_property.image_data,
                    'type':'sale_property',

                })

            if bussines_sale:
                recentData.append({
                    'id': bussines_sale.id,
                    'title': bussines_sale.company_name,
                    'image': bussines_sale.image_data,
                    'cost': bussines_sale.cost,
                    'type':'bussiness_for_sale',

                })

            if investment_my_project:
                recentData.append({
                    'id': investment_my_project.id,
                    'title': investment_my_project.property_name,
                    'image': investment_my_project.image_data,
                    'price': investment_my_project.minimum_investment,
                    'type':'investment_my_project',

                })

            if investment_my_company:
                recentData.append({
                    'id': investment_my_company.id,
                    'title': investment_my_company.property_name,
                    'image': investment_my_company.image_data,
                    'the_valuation': investment_my_company.the_valuation,
                    'shares_for_sale':investment_my_company.shares_for_sale,
                    'price_per_share':investment_my_company.price_per_share,
                    'type':'investment_my_company',

                })
            
            total_count = (
                property_project_count +
                rent_property_count +
                sale_property_count +
                house_wanted_rent_count +
                bussiness_for_sale_count +
                investment_my_company_count
            )

            if total_count == 0:

                property_project_percentage = 0
                rent_property_percentage = 0
                sale_property_percentage = 0
                house_wanted_rent_percentage = 0
                bussiness_for_sale_percentage = 0
                investment_my_company_percentage = 0
                
            else:
            
                property_project_percentage = (property_project_count / total_count) * 100
                rent_property_percentage = (rent_property_count / total_count) * 100
                sale_property_percentage = (sale_property_count / total_count) * 100
                house_wanted_rent_percentage = (house_wanted_rent_count / total_count) * 100
                bussiness_for_sale_percentage = (bussiness_for_sale_count / total_count) * 100
                investment_my_company_percentage = (investment_my_company_count / total_count) * 100
            
            all_property_chart = {
                'property_project_percentage': round(property_project_percentage),
                'rent_property_percentage': round(rent_property_percentage),
                'sale_property_percentage': round(sale_property_percentage),
                'house_wanted_rent_percentage': round(house_wanted_rent_percentage),
                'bussiness_for_sale_percentage': round(bussiness_for_sale_percentage),
                'investment_my_company_percentage': round(investment_my_company_percentage),
            }
    
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','count_data':count_data,'customer_data':customer_data,'recent_properties':recentData,'all_property_chart':all_property_chart})
        except Exception as e:
            return Response({'message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class customerSubscriptionList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            sub_obj = CustomersSubscriptions.objects.filter(is_active = True)
            all_Data = []
            for sub in sub_obj:
                all_data = {
                    'id':sub.id,
                    'customer_name' : sub.customer.firstName + sub.customer.lastName,
                    'plan_name':sub.plan.planName,
                    'plan_duration':sub.plan.planDurationDays,
                    'plan_price':sub.plan.price,
                    'plan_start_date':sub.sub_start_date,
                    'plan_end_date':sub.sub_expiry_date
                }
                all_Data.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'succcess','data':all_Data})

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


class customerSubscriptionDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            sub_id = self.request.query_params.get('sub_id')
            if not sub_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Subscription Id is required'},status=status.HTTP_400_BAD_REQUEST)
            sub_obj = CustomersSubscriptions.objects.filter(id=sub_id,is_active=True).first()
            all_data = {
                'id':sub_obj.id,
                'customer_name' : sub_obj.customer.firstName + sub_obj.customer.lastName,
                'plan_name':sub_obj.plan.planName,
                'plan_duration':sub_obj.plan.planDurationDays,
                'plan_price':sub_obj.plan.price,
                'plan_description':sub_obj.plan.description,
                'digital_rental_contract':sub_obj.plan.digital_rental_contract,
                'notification_stakeholders':sub_obj.plan.notifications_stakeholders,
                'visibilty_among_ads':sub_obj.plan.visibility_among_ads,
                'visibilty_at_top':sub_obj.plan.visibility_at_top,
                'information_of_local_area':sub_obj.plan.information_of_local_area,
                'plan_start_date':sub_obj.sub_start_date,
                'plan_end_date':sub_obj.sub_expiry_date

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



class getPermissionList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            perm_obj = Permissions.objects.filter(end_date__isnull = True)
            all_Data = []
            for permis in perm_obj:
                all_data = {
                    'id':permis.id,
                    'name':permis.name,
                    'code_name':permis.code_name,
                    'type':permis.type,
                }
                all_Data.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'succcess','data':all_Data})

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


class createRole(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            role_name = request.data.get('role_name')
            permission = request.data.get('permission')
            if not role_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'role_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not permission:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'permission is required'},status=status.HTTP_400_BAD_REQUEST)
            
            Roles.objects.create(role_name=role_name,permission=permission)
           
            return Response({'status_code':status.HTTP_200_OK,'status_message':'succcess'})

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


class editRole(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.query_params
            role_id = data.get('id')
            if not role_id:
                return Response({'message':'role id is required'},status=status.HTTP_400_BAD_REQUEST)
            role_obj = Roles.objects.filter(id=role_id).first()
            if not role_obj:
                return Response({'message':'No role found'},status=status.HTTP_400_BAD_REQUEST)
            alldata = {  
                'id':role_obj.id,
                'role_name':role_obj.role_name,
                'permission':role_obj.permission,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success','data':alldata})
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  


    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            role_id = request.data.get('id')
            role_name = request.data.get('role_name')
            permission = request.data.get('permission')
            if not role_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'role_name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not permission:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'permission is required'},status=status.HTTP_400_BAD_REQUEST)
            
            role_obj = Roles.objects.filter(id=role_id).first()
            role_obj.role_name=role_name
            role_obj.permission=permission
            role_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'succcess'})

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

class roleListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data_obj = Roles.objects.filter(end_date__isnull = 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 =  Roles.objects.filter(end_date__isnull = True).count()
            paginator = Paginator(data_obj, page_per_data)
            try:
                data_obj = paginator.page(page)
            except PageNotAnInteger:
                data_obj = paginator.page(1)
            except EmptyPage:
                data_obj = paginator.page(paginator.num_pages)
            allData = []
            for role in data_obj:
                alldata = {  'id':role.id,
                            'role_name':role.role_name,
                        }
                allData.append(alldata)
            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(data_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)
        

from django.db import IntegrityError

class addSubAdmin(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, algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data

            firstName = data.get('firstName')
            lastName = data.get('lastName')
            email = data.get('email')
            phoneNumber = data.get('phoneNumber')
            role = data.get('role')
            password = data.get('password')

            # Required fields check
            required_fields = {
                'firstName': firstName,
                'lastName': lastName,
                'email': email,
                'phoneNumber': phoneNumber,
                'password': password,
                'role': role
            }
            for field, value in required_fields.items():
                if not value:
                    return Response({
                        'status_code': status.HTTP_400_BAD_REQUEST,
                        'status_message': f'{field} is required'
                    }, status=status.HTTP_400_BAD_REQUEST)

            # Duplicate check for both username & email
            if User.objects.filter(username=email).exists() or User.objects.filter(email=email).exists():
                return Response({
                    'status_code': status.HTTP_409_CONFLICT,
                    'status_message': 'The email is already registered'
                }, status=status.HTTP_409_CONFLICT)

            roleObj = Roles.objects.filter(id=role).first()

            # Create user safely
            try:
                user_data = User.objects.create_user(username=email, email=email, password=password)
            except IntegrityError:
                return Response({
                    'status_code': status.HTTP_409_CONFLICT,
                    'status_message': 'The email is already registered'
                }, status=status.HTTP_409_CONFLICT)

            # Create Sub Admin
            SuperAdmin.objects.create(
                user=user_data,
                email=email,
                firstName=firstName,
                lastName=lastName,
                phoneNumber=phoneNumber,
                role=roleObj
            )

            return Response({
                'status_code': status.HTTP_200_OK,
                'status_message': 'success'
            })

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

        


class editSubAdmin(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.query_params
            sub_id = data.get('id')
            if not sub_id:
                return Response({'message':'sub id is required'},status=status.HTTP_400_BAD_REQUEST)
            sub_obj = SuperAdmin.objects.filter(id=sub_id).first()
            print('sub_obj',sub_obj)
            if not sub_obj:
                return Response({'message':'No sub admin found'},status=status.HTTP_400_BAD_REQUEST)
            alldata = {  
                'id':sub_obj.id,
                'firstName':sub_obj.firstName,
                'lastName':sub_obj.lastName,
                'email':sub_obj.email,
                'phoneNumber':sub_obj.phoneNumber,
                'role':sub_obj.role.id,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success','data':alldata})
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)  
    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            sub_id = data.get('id')
            firstName = data.get('firstName')
            lastName = data.get('lastName')
            phoneNumber = data.get('phoneNumber')
            password = data.get('password')
            role = data.get('role')
            if not sub_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            if not firstName:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'firstName is required'},status=status.HTTP_400_BAD_REQUEST)
            if not lastName:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'lastName is required'},status=status.HTTP_400_BAD_REQUEST)
            if not role:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'role is required'},status=status.HTTP_400_BAD_REQUEST)
            roleObj = Roles.objects.filter(id=role).first()
            subAdmin = SuperAdmin.objects.filter(id=sub_id).first()
            subAdmin.firstName=firstName
            subAdmin.lastName=lastName
            subAdmin.phoneNumber=phoneNumber
            subAdmin.role=roleObj
            subAdmin.save()
            if password:
                user_data = User.objects.filter(id=subAdmin.user.id).first()
                user_data.set_password(password)
                user_data.save()
                subject = 'Password Updated'
                # html_message = render_to_string('forget-password-email.html', {'link': complete_link})
                plain_message = 'Password has been updated for your acount'
                from_email = 'testsingh28@gmail.com'
                to = subAdmin.email
                mail.send_mail(subject, plain_message, from_email, [to])
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success'})
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
class subAdminListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data_obj = SuperAdmin.objects.filter(end_date__isnull = True).order_by('-id').exclude(id='1')
            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 =  SuperAdmin.objects.filter(end_date__isnull = True).exclude(id='1').count()
            paginator = Paginator(data_obj, page_per_data)
            try:
                data_obj = paginator.page(page)
            except PageNotAnInteger:
                data_obj = paginator.page(1)
            except EmptyPage:
                data_obj = paginator.page(paginator.num_pages)
            allData = []
            for sub in data_obj:
                alldata = {  'id':sub.id,
                            'firstName':sub.firstName,
                            'lastName':sub.lastName,
                            'role': sub.role.role_name if sub.role and sub.role.role_name else None

                        }
                allData.append(alldata)
            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(data_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 getCompletedDealList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            payment_obj = Payment.objects.all()
            allData = []
            for payment in payment_obj:
                all_data = {
                    'id':payment.id,
                    'mode':payment.mode,
                    'payment_status':payment.payment_status,
                    'Customer':payment.Customer.firstName,
                    'recipet_status':payment.recipet_status
                }
                allData.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success','data':allData})
        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 CompletedDealDetail(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.query_params
            payment_id = data.get('id')
            payment_obj = Payment.objects.filter(id=payment_id).first()
            all_data = {
                'id':payment_obj.id,
                'mode':payment_obj.mode,
                'payment_status':payment_obj.payment_status,
                'Customer':payment_obj.Customer.firstName,
                'recipet_status':payment_obj.recipet_status,
                'contract':payment_obj.contract.id,
                'payment_recipet':payment_obj.payment_recipet,

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


class ReportSection(APIView):
    def get(self,request):
        try:
            property_project_count = PropertyProject.objects.filter(status=1).count()
            rent_property_count = RentProperty.objects.filter(status=1).count()
            sale_property_count = SaleProperty.objects.filter(status=1).count()
            house_wanted_rent_count = HouseWantedForRent.objects.filter(status=1).count()
            bussiness_for_sale_count = BussinessForSale.objects.filter(status=1).count()
            investment_my_company_count = InvestmentMyCompany.objects.filter(status=1).count()
            customer_count =  Customer.objects.all().count()
            count_data = {
                'property_project_count':property_project_count,
                'rent_property_count':rent_property_count,
                'sale_property_count':sale_property_count,
                'house_wanted_rent_count':house_wanted_rent_count,
                'bussiness_for_sale_count':bussiness_for_sale_count,
                'investment_my_company_count':investment_my_company_count,
                'customer_count':customer_count,
            }
            property_project = [PropertyProject.objects.filter(start_date__month=i).count() for i in range(1,13)]
            rent_property = [RentProperty.objects.filter(created_at__month=i).count() for i in range(1,13)]
            sale_property = [SaleProperty.objects.filter(created_at__month=i).count() for i in range(1,13)]
            house_wanted_rent = [HouseWantedForRent.objects.filter(start_date__month=i).count() for i in range(1,13)]
            bussiness_for_sale = [BussinessForSale.objects.filter(start_date__month=i).count() for i in range(1,13)]
            investment_my_company = [InvestmentMyCompany.objects.filter(start_date__month=i).count() for i in range(1,13)]
            investment_my_project = [InvestmentMyProject.objects.filter(start_date__month=i).count() for i in range(1,13)]
            totalCustomers = [Customer.objects.filter(created_at__month=i).count() for i in range(1,13)]
            activeCustomers = [Customer.objects.filter(created_at__month=i,is_active=True).count() for i in range(1,13)]
            inactiveCustomers = [Customer.objects.filter(created_at__month=i,is_active=False).count() for i in range(1,13)]
            month_by_data = {
                'total_customers':totalCustomers,
                'active_customers':activeCustomers,
                'inactive_customers':inactiveCustomers,
                'property_project':property_project,
                'rent_property':rent_property,
                'sale_property':sale_property,
                'house_wanted_rent':house_wanted_rent,
                'bussiness_for_sale':bussiness_for_sale,
                'investment_my_company':investment_my_company,
                'investment_my_project':investment_my_project,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','count_data':count_data,'month_by_data':month_by_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 DoItByReeipoTeamRequestList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            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,payment_status=True).count()
            paginator = Paginator(allrequests_obj, page_per_data)
            try:
                allrequests_obj = paginator.page(page)
            except PageNotAnInteger:
                allrequests_obj = paginator.page(1)
            except EmptyPage:
                allrequests_obj = paginator.page(paginator.num_pages)
            
            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 DoItByReeipoTeamDetail(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            allData = []
            reeipo_form_id=request.GET.get('reeipo_form_id')
            allrequests_obj = DoItByReeipoRequests.objects.filter(id=reeipo_form_id,end_date__isnull=True,payment_status=True)
            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 IsContactedStatus(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data=request.data
            request_id = data.get('id')
            if not request_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'id is required'},status=status.HTTP_400_BAD_REQUEST)
            do_it_by_reeipo = DoItByReeipoRequests.objects.filter(id=request_id,end_date__isnull=True).first()
            if not do_it_by_reeipo:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'no request found'},status=status.HTTP_400_BAD_REQUEST)
            do_it_by_reeipo.is_contacted = True
            do_it_by_reeipo.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 LoginAsUser(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,algorithms=["HS256"])
            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':'admin'
                    }
            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 SetCommission(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            all_data = {}
            commision_percentage = CommissionPercentage.objects.filter(end_date__isnull=True).first()
            if commision_percentage:
                all_data = {
                    'id':commision_percentage.id,
                    'commision_value':commision_percentage.Commision_percentage
                }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success','data':all_data})
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        
    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data=request.data
            commision_value = data.get('commision_value')
            if not commision_value:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'commision_value is required'},status=status.HTTP_400_BAD_REQUEST)
            commision_percentage = CommissionPercentage.objects.filter(end_date__isnull=True).first()
            if commision_percentage:
                commision_percentage.Commision_percentage = commision_value
                commision_percentage.save()
            else:
                commision_percentage = CommissionPercentage.objects.create(Commision_percentage = commision_value)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'success'})
        except Exception as e:
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        

class AgencyList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            customer_obj = Customer.objects.filter(loginUserType="agency").order_by('-id')
            customer_count = Customer.objects.filter(loginUserType="agency").count()
            search_post =  self.request.query_params.get('search')
            if search_post:
                customer_obj = Customer.objects.filter(Q(firstName__icontains=search_post)|Q(lastName__icontains=search_post)|Q(email__icontains=search_post)|Q(phone_number__icontains=search_post),loginUserType="agency")
            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)
            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)
            paginator = Paginator(customer_obj, page_per_data)
            try:
                customer_obj = paginator.page(page)
            except PageNotAnInteger:
                customer_obj = paginator.page(1)
            except EmptyPage:
                customer_obj = paginator.page(paginator.num_pages)
            allData = []
            for customer in customer_obj:
                alldata = {
                    'id':customer.id,
                    'first_name':customer.firstName,
                    'last_name':customer.lastName,
                    'email':customer.email,
                    'phone_number':customer.phoneNumber,
                    'created_at':customer.created_at,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Agency fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(customer_obj),'total':customer_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 AgencyDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            userid = self.request.query_params.get('userid')
            if not userid:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Agency Id is required'},status=status.HTTP_400_BAD_REQUEST)
            user_obj = Customer.objects.filter(id = userid,loginUserType="agency").first()
            sub_obj = AgencySubscriptions.objects.filter(customer=userid).first()
            if sub_obj:
                plan_name = sub_obj.plan.planName
                plan_start_date = sub_obj.sub_start_date
                plan_expiry_date = sub_obj.sub_expiry_date
                plan_is_active = sub_obj.is_active
                plan_validity = sub_obj.plan.planDurationDays
                plan_price = sub_obj.plan.price
            else:
                plan_name = "N/A"
                plan_start_date = "N/A"
                plan_expiry_date = "N/A"
                plan_is_active = "N/A"
                plan_validity = "N/A"
                plan_price = "N/A"

            if not user_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No Agency found'},status=status.HTTP_400_BAD_REQUEST)
            alldata = {
                'user_type':user_obj.userType,
                'first_name':user_obj.firstName,
                'last_name':user_obj.lastName,
                'email':user_obj.email,
                'dob':user_obj.dob,
                'profile_image':user_obj.profileImage,
                'gender':user_obj.gender,
                'address':user_obj.address,
                'nationality':user_obj.nationality,
                'bio':user_obj.bio,
                'image_video':user_obj.image_video,
                'past_experience':user_obj.pastExperience,
                'past_field':user_obj.pastField,
                'subscription_name':plan_name,
                'plan_start_date':plan_start_date,
                'plan_expiry_date':plan_expiry_date,
                'plan_is_active':plan_is_active,
                'plan_validity':plan_validity,
                'plan_price':plan_price
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Agency details fetched successfully','data':alldata})
        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 changeAgencyStatus(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            userid = self.request.query_params.get('userid')
            if not userid:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Agency Id is required'},status=status.HTTP_400_BAD_REQUEST)
            status_data = self.request.query_params.get('status')
            if not status_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Status is required'},status=status.HTTP_400_BAD_REQUEST)        
            status_obj = Customer.objects.get(user_id = userid,loginUserType="agency")
            status_obj.is_active = status_data
            status_obj.save()
            if status_obj.is_active == "1":
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Agency activated successfully'})
            else:
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Agency deactivated successfully'})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
  

class lawyerList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            customer_obj = Customer.objects.filter(loginUserType="lawyer").order_by('-id')
            customer_count = Customer.objects.filter(loginUserType="lawyer").count()
            search_post =  self.request.query_params.get('search')
            if search_post:
                customer_obj = Customer.objects.filter(Q(firstName__icontains=search_post)|Q(lastName__icontains=search_post)|Q(email__icontains=search_post)|Q(phone_number__icontains=search_post),loginUserType="agency")
            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)
            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)
            paginator = Paginator(customer_obj, page_per_data)
            try:
                customer_obj = paginator.page(page)
            except PageNotAnInteger:
                customer_obj = paginator.page(1)
            except EmptyPage:
                customer_obj = paginator.page(paginator.num_pages)
            allData = []
            for customer in customer_obj:
                alldata = {
                    'id':customer.id,
                    'first_name':customer.firstName,
                    'last_name':customer.lastName,
                    'email':customer.email,
                    'phone_number':customer.phoneNumber,
                    'created_at':customer.created_at,
                }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Lawyer fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(customer_obj),'total':customer_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 lawyerDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            userid = self.request.query_params.get('userid')
            if not userid:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Lawyer Id is required'},status=status.HTTP_400_BAD_REQUEST)
            user_obj = Customer.objects.filter(id = userid,loginUserType="lawyer").first()
            sub_obj = AgencySubscriptions.objects.filter(customer=userid).first()
            if sub_obj:
                plan_name = sub_obj.plan.planName
                plan_start_date = sub_obj.sub_start_date
                plan_expiry_date = sub_obj.sub_expiry_date
                plan_is_active = sub_obj.is_active
                plan_validity = sub_obj.plan.planDurationDays
                plan_price = sub_obj.plan.price
            else:
                plan_name = "N/A"
                plan_start_date = "N/A"
                plan_expiry_date = "N/A"
                plan_is_active = "N/A"
                plan_validity = "N/A"
                plan_price = "N/A"
                
            if not user_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No Agency found'},status=status.HTTP_400_BAD_REQUEST)
            alldata = {
                'user_type':user_obj.userType,
                'first_name':user_obj.firstName,
                'last_name':user_obj.lastName,
                'email':user_obj.email,
                'dob':user_obj.dob,
                'profile_image':user_obj.profileImage,
                'gender':user_obj.gender,
                'address':user_obj.address,
                'nationality':user_obj.nationality,
                'bio':user_obj.bio,
                'image_video':user_obj.image_video,
                'past_experience':user_obj.pastExperience,
                'past_field':user_obj.pastField,
                'subscription_name':plan_name,
                'plan_start_date':plan_start_date,
                'plan_expiry_date':plan_expiry_date,
                'plan_is_active':plan_is_active,
                'plan_validity':plan_validity,
                'plan_price':plan_price
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Agency details fetched successfully','data':alldata})
        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 changeLawyerStatus(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            userid = self.request.query_params.get('userid')
            if not userid:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Lawyer Id is required'},status=status.HTTP_400_BAD_REQUEST)
            status_data = self.request.query_params.get('status')
            if not status_data:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Status is required'},status=status.HTTP_400_BAD_REQUEST)        
            status_obj        = Customer.objects.get(user_id = userid,loginUserType="lawyer")
            status_obj.is_active = status_data
            status_obj.save()
            if status_obj.is_active == "1":
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Lawyer activated successfully'})
            else:
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Lawyer deactivated successfully'})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
  

class requestedLawyerContracts(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            contract_obj = LawyerContractDeals.objects.all()
            all_Data = []
            for contract in contract_obj:
                all_data = {
                    'id': contract.id,
                    'inquiry_id': contract.inquiry.id,
                    'property_project_customer_name':contract.inquiry.property_project.customerId.firstName+' '+contract.inquiry.property_project.customerId.lastName,
                    'property_project_customer_email':contract.inquiry.property_project.customerId.email,
                    'property_project_customer_phonenumber':contract.inquiry.property_project.customerId.phoneNumber,
                    'customer_email':contract.inquiry.email,
                    'customer_phone_number':contract.inquiry.telephone,
                    'company_name':contract.inquiry.company_name,
                }
                all_Data.append(all_data)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Agency details fetched successfully','data':all_Data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
  



class getCurrencyListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            currency_obj =  CurrencyHandler.objects.filter(end_date__isnull = True)
            all_Data = []
            for currency in currency_obj:
                all_data = {
                    'id':currency.id,
                    'symbol':currency.symbol,
                    'name':currency.name,
                    'converted_price':currency.converted_price,
                }
                all_Data.append(all_data)
            
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_Data})


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

class addCurrency(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            symbol = request.data.get('symbol')
            if not symbol:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'symbol is required'},status=status.HTTP_400_BAD_REQUEST)

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

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

            CurrencyHandler.objects.create(symbol = symbol,name=name,converted_price = converted_price)

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

        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 editCurrency(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            currency_id =  request.GET.get('currency_id')
            if not currency_id:
                return Response({'message':'No inquire found'},status = status.HTTP_400_BAD_REQUEST)

            currency_obj =  CurrencyHandler.objects.filter(id=currency_id,end_date__isnull = True).first()
            all_data = {
                'id':currency_obj.id,
                'symbol':currency_obj.symbol,
                'name':currency_obj.name,
                'converted_price':currency_obj.converted_price,
            }


            return Response({'status_code':status.HTTP_200_OK,'status_message':'success','data':all_data}) 

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

    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,algorithms=["HS256"])
            user_id = decoded['user_id']

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



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

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

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

            currency_obj = CurrencyHandler.objects.filter(id = currency_id).update(symbol = symbol,name=name,converted_price = converted_price)

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

        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 deleteCurrency(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,algorithms=["HS256"])
            user_id = decoded['user_id']

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

            currency_obj =  CurrencyHandler.objects.get(id = currency_id)
            currency_obj.delete()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})


        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 createCommunityChatAdmin(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,algorithms=["HS256"])
                user_id = decoded['user_id']
                channel_name =  request.data.get('channel_name')
                if not channel_name:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'channel_name is required'},status=status.HTTP_400_BAD_REQUEST)
                check_channel = CommunityChannels.objects.filter(channel_name = channel_name).first()
                if check_channel: 
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'This community name has already been created.'},status=status.HTTP_400_BAD_REQUEST)
                else:	
                    CommunityChannels.objects.create(channel_name = channel_name)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})

            
            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 communityChatListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            check_channel = CommunityChannels.objects.all()
            all_Data = []
            for check in check_channel:
                all_data = {
                    'id':check.id,
                    'channel_name':check.channel_name,
                    'twilio_channel_sid':check.twilio_channel_sid,
                    'created_at':check.created_at
                }
                all_Data.append(all_data)

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

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



class editCommunityChat(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            channel_id = request.GET.get('channel_id')
            if not channel_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'channel_id is required'},status=status.HTTP_400_BAD_REQUEST)

            check = CommunityChannels.objects.filter(id = channel_id).first()
            all_data = {
                'id':check.id,
                'channel_name':check.channel_name,
                'twilio_channel_sid':check.twilio_channel_sid,
                'created_at':check.created_at
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})

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


    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            channel_id = request.data.get('channel_id')
            if not channel_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'channel_id is required'},status=status.HTTP_400_BAD_REQUEST)

            channel_name =  request.data.get('channel_name')
            if not channel_name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'channel_name is required'},status=status.HTTP_400_BAD_REQUEST)
            check_channel = CommunityChannels.objects.filter(id = channel_id).first()
            if not check_channel: 
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No community channel found'},status=status.HTTP_400_BAD_REQUEST)
            check_channel.channel_name = channel_name
            check_channel.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})

        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 deleteCommunityChat(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            channel_id = request.data.get('channel_id')
            if not channel_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'channel_id is required'},status=status.HTTP_400_BAD_REQUEST)

            check_channel = CommunityChannels.objects.filter(id = channel_id).first()
            check_channel.delete()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 createCategoriesContent(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            image = request.data.get('image')
            if not image:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'image is required'},status=status.HTTP_400_BAD_REQUEST)
            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            description = request.data.get('description')
            if not description:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            CategoriesContent.objects.create(image = image,title =title,description = description)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 editCategoriesContent(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            cat_id = request.GET.get('cat_id')
            if not cat_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'cat_id is required'},status=status.HTTP_400_BAD_REQUEST)

            content_obj = CategoriesContent.objects.filter(id = cat_id).first()
            if not content_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'content_obj not found'},status=status.HTTP_400_BAD_REQUEST)

            all_data = {
                'id':content_obj.id,
                'image': content_obj.image,
                'title': content_obj.title,
                'description': content_obj.description,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            cat_id = request.data.get('cat_id')
            if not cat_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'cat_id is required'},status=status.HTTP_400_BAD_REQUEST)
            category_obj = CategoriesContent.objects.filter(id = cat_id).first()
            if not category_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No category obj found.'},status=status.HTTP_400_BAD_REQUEST)

            image = request.data.get('image')
            if not image:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'image is required'},status=status.HTTP_400_BAD_REQUEST)
            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            description = request.data.get('description')
            if not description:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            category_obj.image = image
            category_obj.title = title
            category_obj.description = description
            category_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 categoriesListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            cat_id = request.GET.get('cat_id')
            if cat_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'cat_id is required'},status=status.HTTP_400_BAD_REQUEST)

            content_obj = CategoriesContent.objects.filter(end_date__isnull = True)
            if not content_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'content_obj not found'},status=status.HTTP_400_BAD_REQUEST)
            all_Data = []
            for cont in content_obj:
                all_data = {
                    'id':cont.id,
                    'image': cont.image,
                    'title': cont.title,
                    'description': cont.description,
                }
                all_Data.append(all_data)

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



class deleteCategories(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_id = request.data.get('content_id')
            if not content_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'content_id is required'},status=status.HTTP_400_BAD_REQUEST)
            category_obj = CategoriesContent.objects.filter(id = content_id).first()
            if not category_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No category obj found.'},status=status.HTTP_400_BAD_REQUEST)
            category_obj.end_date = datetime.now()
            category_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 createServiceContent(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,algorithms=["HS256"])
            user_id = decoded['user_id']

            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            description = request.data.get('description')
            if not description:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            ServicesContent.objects.create(title =title,description = description)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 editServiceContent(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            cat_id = request.GET.get('cat_id')
            if not cat_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'cat_id is required'},status=status.HTTP_400_BAD_REQUEST)

            content_obj = ServicesContent.objects.filter(id = cat_id).first()
            if not content_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'content_obj not found'},status=status.HTTP_400_BAD_REQUEST)

            all_data = {
                'id':content_obj.id,
                'title': content_obj.title,
                'description': content_obj.description,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            cat_id = request.data.get('cat_id')
            if not cat_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'cat_id is required'},status=status.HTTP_400_BAD_REQUEST)
            category_obj = ServicesContent.objects.filter(id = cat_id).first()
            if not category_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No category obj found.'},status=status.HTTP_400_BAD_REQUEST)


            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            description = request.data.get('description')
            if not description:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'description is required'},status=status.HTTP_400_BAD_REQUEST)
            category_obj.title = title
            category_obj.description = description
            category_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 serviceListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            cat_id = request.GET.get('cat_id')
            if cat_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'cat_id is required'},status=status.HTTP_400_BAD_REQUEST)

            content_obj = ServicesContent.objects.filter(end_date__isnull = True)
            if not content_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'content_obj not found'},status=status.HTTP_400_BAD_REQUEST)
            all_Data = []
            for cont in content_obj:
                all_data = {
                    'id':cont.id,
                    'title': cont.title,
                    'description': cont.description,
                }
                all_Data.append(all_data)

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



class deleteService(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            content_id = request.data.get('content_id')
            if not content_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'content_id is required'},status=status.HTTP_400_BAD_REQUEST)
            category_obj = ServicesContent.objects.filter(id = content_id).first()
            if not category_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No service obj found.'},status=status.HTTP_400_BAD_REQUEST)
            category_obj.end_date = datetime.now()
            category_obj.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 getTestimonialListing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            test_data = []
            test_obj = Testimonials.objects.filter(end_date__isnull = True )
            for test in test_obj:
                all_data = {
                    'id':test.id,
                    # 'customer_id':test.customer.id,
                    # 'customer_name':test.customer.firstName,
                    'title':test.title,
                    'description':test.description,
                    'ratings':test.ratings,
                    'name':test.name,
                    'designation':test.designation,
                }
                test_data.append(all_data)
            
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':test_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 getTestimonialDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            test_id = request.GET.get('test_id')
            if not test_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'test_id is required'},status=status.HTTP_400_BAD_REQUEST)
            test_obj = Testimonials.objects.filter(end_date__isnull = True ).first()
            all_data = {
                'id':test_obj.id,
                # 'customer_id':test_obj.customer.id,
                # 'customer_name':test_obj.customer.firstName,
                'title':test_obj.title,
                'description':test_obj.description,
                'ratings':test_obj.ratings,
                'name':test_obj.name,
                'designation':test_obj.designation,
            }

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

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


class deleteTestimonial(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,algorithms=["HS256"])
            user_id = decoded['user_id']

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

            test_obj = Testimonials.objects.filter(id=test_id ).first()
            test_obj.delete()

            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 companyInformation(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            check_obj  =  CompanyContactInformation.objects.all().first()
            if not check_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No data found'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'company_email':check_obj.company_email,
                'company_phone_number':check_obj.company_phone_number,
                'company_location':check_obj.company_location,
                   'company_latitude':check_obj.company_latitude,
                'company_longitude':check_obj.company_longitude,
                'company_facebook':check_obj.company_facebook,
                'company_instagram':check_obj.company_instagram,
                'company_twitter':check_obj.company_twitter,
                'company_youtube':check_obj.company_youtube,
    
            }

            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','all_data':all_data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
   
    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,algorithms=["HS256"])
            user_id = decoded['user_id']
   
            company_email = request.data.get('company_email')
            if not company_email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'company_email is required'},status=status.HTTP_400_BAD_REQUEST)
                
            company_phone_number = request.data.get('company_phone_number')
            if not company_phone_number:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'company_phone_number is required'},status=status.HTTP_400_BAD_REQUEST)
                
            company_location = request.data.get('company_location')
            if not company_location:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'company_location is required'},status=status.HTTP_400_BAD_REQUEST)
                
            company_latitude = request.data.get('company_latitude')
            if not company_latitude:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'company_latitude is required'},status=status.HTTP_400_BAD_REQUEST)
                
            company_longitude = request.data.get('company_longitude')
            if not company_longitude:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'company_longitude is required'},status=status.HTTP_400_BAD_REQUEST)
            
            company_facebook = request.data.get('company_facebook')
            if not company_facebook:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'company_facebook is required'},status=status.HTTP_400_BAD_REQUEST)

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

            company_twitter = request.data.get('company_twitter')
            if not company_twitter:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'company_twitter is required'},status=status.HTTP_400_BAD_REQUEST)
            
            company_youtube = request.data.get('company_youtube')
            if not company_youtube:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'company_youtube is required'},status=status.HTTP_400_BAD_REQUEST)
            
   
            check_obj  =  CompanyContactInformation.objects.all().first()
            if not check_obj:
                CompanyContactInformation.objects.create(company_email=company_email,company_phone_number=company_phone_number,company_location=company_location,company_latitude=company_latitude,company_longitude=company_longitude,company_facebook=company_facebook,company_instagram=company_instagram,
                company_twitter=company_twitter,company_youtube=company_youtube)
            else:
                CompanyContactInformation.objects.filter(id = check_obj.id).update(company_email=company_email,company_phone_number=company_phone_number,company_location=company_location,company_latitude=company_latitude,company_longitude=company_longitude,company_facebook=company_facebook,company_instagram=company_instagram,
                company_twitter=company_twitter,company_youtube=company_youtube)

            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 addHowItWork(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,algorithms=["HS256"])
            user_id = decoded['user_id']

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

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

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


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


            HowItWorks.objects.create(step_number = step_number,icon = icon, title = title, description = description)


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

        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 editHowItWork(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            work_id = request.data.get('work_id')
            if not work_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'work_id is required'},status=status.HTTP_400_BAD_REQUEST)
            
            work_obj  = HowItWorks.object.filter(id = work_id).first()
            if not work_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'work_obj is required'},status=status.HTTP_400_BAD_REQUEST)

            all_data = {
                'id':work_obj.id,
                'step_number':work_obj.step_number,
                'icon':work_obj.icon,
                'title':work_obj.title,
                'description':work_obj.description,
            }

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


    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,algorithms=["HS256"])
            user_id = decoded['user_id']

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

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

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

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


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


            HowItWorks.objects.filter(id =work_id ).update(step_number = step_number,icon = icon, title = title, description = description)


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

        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 howItworkList(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            how_obj =  HowItWorks.objects.filter(end_date__isnull = True)
            all_Data = []
            for how in how_obj:
                all_data = {
                    'id':how.id,
                    'step_number':how.step_number,
                    'icon':how.icon,
                    'title':how.title,
                    'description':how.description,
                }
                all_Data.append(all_data)
    
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','all_data':all_Data})


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



class howItworkDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            work_id =  request.GET.get('work_id')
            if not work_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'work_id is required'},status=status.HTTP_400_BAD_REQUEST)
            
            work_obj = HowItWorks.objects.filter(id = work_id).first()
            if not work_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'work_obj is required'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'id':work_obj.id,
                'step_number':work_obj.step_number,
                'icon':work_obj.icon,
                'title':work_obj.title,
                'description':work_obj.description,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','all_data':all_data})
   
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class deleteHowItwork(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            work_id =  request.data.get('work_id')
            if not work_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'work_id is required'},status=status.HTTP_400_BAD_REQUEST)
            work_obj = HowItWorks.objects.filter(id = work_id).first()
            if not work_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'work_obj is required'},status=status.HTTP_400_BAD_REQUEST)
            work_obj.delete()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
   
        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 agencyFaqlisting(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data_obj = AgencyFaq.objects.filter(end_date__isnull = True).order_by('-id')
            allData = []
            for faq in data_obj:
                alldata = {  'id':faq.id,
                            'title':faq.title,
                            'content':faq.content,
                        }
                allData.append(alldata)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq fetched successfully','data':allData})
        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 agencyAddFaq(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq title is required'},status=status.HTTP_400_BAD_REQUEST)
            content = request.data.get('content')
            if not content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq content is required'},status=status.HTTP_400_BAD_REQUEST)
            AgencyFaq.objects.create(title=title,content=content)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq added successfully'})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class agencyEditFaq(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            faq_id = request.GET.get('faq_id')
            if not faq_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq Id is required'},status=status.HTTP_400_BAD_REQUEST)
            faq_obj =  AgencyFaq.objects.filter(id=faq_id).first()
            if not faq_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'faq_obj is required'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'id':faq_obj.id,
                'title':faq_obj.title,
                'content':faq_obj.content,
            }

            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq fetcged successfully','all_data':all_data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            faq_id = request.data.get('faq_id')
            if not faq_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq Id is required'},status=status.HTTP_400_BAD_REQUEST)
            title = request.data.get('title')
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq title is required'},status=status.HTTP_400_BAD_REQUEST)
            content = request.data.get('content')
            if not content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq content is required'},status=status.HTTP_400_BAD_REQUEST)
            AgencyFaq.objects.filter(id=faq_id).update(title=title,content=content)
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq updated successfully'})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class agencyDeleteFaq(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            faq_id = request.data.get('faq_id')
            if not faq_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Faq Id is required'},status=status.HTTP_400_BAD_REQUEST)
            AgencyFaq.objects.filter(id=faq_id).update(end_date=datetime.now())
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Faq deleted successfully'})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

def termsAndConditionsview(request):
    content_obj = ContentPagesAdmin.objects.filter(page_type_name='Terms_And_Conditions').first()
    context = {}
    if content_obj:
        context = {
            'page_title':content_obj.page_title,
            'page_title_nw':content_obj.page_title_nw,

            'page_content':content_obj.page_content,
            'page_content_nw':content_obj.page_content_nw,

            'created_at':content_obj.created_at
        }
    return render(request, 'terms_and_conditions.html',context)
    



def privacypolicyview(request):
    content_obj = ContentPagesAdmin.objects.filter(page_type_name='Privacy_Policy').first()
    context = {}
    if content_obj:
        context = {
            'page_title':content_obj.page_title,
            'page_title_nw':content_obj.page_title_nw,

            'page_content':content_obj.page_content,
            'page_content_nw':content_obj.page_content_nw,

            'created_at':content_obj.created_at
        }
    return render(request, 'privacy_policy.html',context)



class addFacilities(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,algorithms=["HS256"])
            # user_id = decoded['user_id']
            name =  request.data.get('name')
            if not name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            icon =  request.data.get('icon')
            if not icon:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'icon is required'},status=status.HTTP_400_BAD_REQUEST)
                 
            Facilities.objects.create(name =name,icon=icon)   
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Addded successfully'})

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


class editFacilities(APIView):
    def get(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,algorithms=["HS256"])
            # user_id = decoded['user_id']
            facility_id = request.GET.get('facility_id')
            if not facility_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'facility_id is required'},status=status.HTTP_400_BAD_REQUEST)
            fac_obj = Facilities.objects.filter(id = facility_id).first()
            if not fac_obj:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No facility found'},status=status.HTTP_400_BAD_REQUEST)
            all_data = {
                'id':fac_obj.id,
                'name':fac_obj.name,
                'icon':fac_obj.icon,
                
            }   
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Addded successfully','all_data':all_data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    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,algorithms=["HS256"])
            # user_id = decoded['user_id']
            facility_id = request.data.get('facility_id')
            name =  request.data.get('name')
            if not name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            icon =  request.data.get('icon')
            if not icon:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'icon is required'},status=status.HTTP_400_BAD_REQUEST)
                 
            Facilities.objects.filter(id = facility_id).update(name =name,icon=icon)   
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Updated successfully'})

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


class getFacilities(APIView):
    def get(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,algorithms=["HS256"])
            # user_id = decoded['user_id']
            fac_obj = Facilities.objects.all().order_by('-id')
            all_Data = []
            for fac in fac_obj:
                all_data = {
                    'id':fac.id,
                    'name':fac.name,
                    'icon':fac.icon,
                    
                } 
                all_Data.append(all_data)  
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Addded successfully','all_data':all_Data})
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    
    
class deleteFacilities(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,algorithms=["HS256"])
            # user_id = decoded['user_id']
            facility_id = request.data.get('facility_id')
            fac_obj = Facilities.objects.filter(id = facility_id).first()
            fac_obj.delete()   
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Deleted successfully'})

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


class createFeatureAddPricing(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,algorithms=["HS256"])
                user_id = decoded['user_id']
                name =  request.data.get('name')
                price =  request.data.get('price')
                days =  request.data.get('days')
                benfits =  request.data.get('benfits')
                if not name:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
                if not price:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
                if not days:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'days is required'},status=status.HTTP_400_BAD_REQUEST)
                if not benfits:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'benfits is required'},status=status.HTTP_400_BAD_REQUEST)
                check_feature = FeatureAddPricing.objects.filter(name = name,price=price,days=days,benfits=benfits).first()
                if check_feature: 
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'This Feature name has already been created.'},status=status.HTTP_400_BAD_REQUEST)
                else:	
                    FeatureAddPricing.objects.create(name = name,price=price,days=days,benfits=benfits)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})

            
            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 ListFeatureAddPricing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            list_channel = FeatureAddPricing.objects.all()
            all_Data = []
            for channel in list_channel:
                all_data = {
                    'id':channel.id,
                    'name':channel.name,
                    'price':channel.price,
                    'days':channel.days,
                    'benfits':channel.benfits
                }
                all_Data.append(all_data)

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

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



class EditFeatureAddPricing(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            feature_id = request.GET.get('feature_id')
            if not feature_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'feature_id is required'},status=status.HTTP_400_BAD_REQUEST)

            check_feature = FeatureAddPricing.objects.filter(id = feature_id).first()
            all_data = {
                'id':check_feature.id,
                'name':check_feature.name,
                'price':check_feature.price,
                'days':check_feature.days,
                'benfits':check_feature.benfits
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})

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


    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            feature_id = request.data.get('feature_id')
            if not feature_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'feature_id is required'},status=status.HTTP_400_BAD_REQUEST)

            name =  request.data.get('name')
            price =  request.data.get('price')
            days =  request.data.get('days')
            benfits =  request.data.get('benfits')
            if not name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not price:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not days:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'days is required'},status=status.HTTP_400_BAD_REQUEST)
            if not benfits:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'benfits is required'},status=status.HTTP_400_BAD_REQUEST)
            check_feature = FeatureAddPricing.objects.filter(id = feature_id).first()
            if not check_feature: 
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No Pricing feature found'},status=status.HTTP_400_BAD_REQUEST)
            check_feature.name = name
            check_feature.price = price
            check_feature.days = days
            check_feature.benfits = benfits
            check_feature.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})

        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 deleteFeatureAddPricing(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            feature_id = request.data.get('feature_id')
            if not feature_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'feature_id is required'},status=status.HTTP_400_BAD_REQUEST)

            check_feature = FeatureAddPricing.objects.filter(id = feature_id).first()
            check_feature.delete()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 createBenefits(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,algorithms=["HS256"])
                user_id = decoded['user_id']
                name =  request.data.get('name')
                price =  request.data.get('price')
                days =  request.data.get('days')
                benfits =  request.data.get('benfits')
                title =  request.data.get('title')
                content =  request.data.get('content')
                if not name:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
                if not price:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
                if not days:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'days is required'},status=status.HTTP_400_BAD_REQUEST)
                if not benfits:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'benfits is required'},status=status.HTTP_400_BAD_REQUEST)
                if not title:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
                if not content:
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'content is required'},status=status.HTTP_400_BAD_REQUEST)
                check_benefit = Benefits.objects.filter(name = name,price=price,days=days,benfits=benfits,title=title,content=content).first()
                if check_benefit: 
                    return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'This Benefit name has already been created.'},status=status.HTTP_400_BAD_REQUEST)
                else:	
                    Benefits.objects.create(name = name,price=price,days=days,benfits=benfits,title=title,content=content)
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})

            
            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 ListBenefits(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            list_benefit = Benefits.objects.all()
            all_Data = []
            for benefit in list_benefit:
                all_data = {
                    'id':benefit.id,
                    'name':benefit.name,
                    'price':benefit.price,
                    'days':benefit.days,
                    'benfits':benefit.benfits,
                    'content':benefit.content,
                    'title':benefit.title
                }
                all_Data.append(all_data)

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

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



class EditBenefits(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            benefit_id = request.GET.get('benefit_id')
            if not benefit_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'benefit_id is required'},status=status.HTTP_400_BAD_REQUEST)

            check_benefit = Benefits.objects.filter(id = benefit_id).first()
            all_data = {
                'id':check_benefit.id,
                'name':check_benefit.name,
                'price':check_benefit.price,
                'days':check_benefit.days,
                'benfits':check_benefit.benfits,
                'title':check_benefit.title,
                'content':check_benefit.content
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})

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


    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,algorithms=["HS256"])
            user_id = decoded['user_id']
            benefit_id = request.data.get('benefit_id')
            if not benefit_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'benefit_id is required'},status=status.HTTP_400_BAD_REQUEST)

            name =  request.data.get('name')
            price =  request.data.get('price')
            days =  request.data.get('days')
            benfits =  request.data.get('benfits')
            title =  request.data.get('title')
            content =  request.data.get('content')
            if not name:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not price:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
            if not days:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'days is required'},status=status.HTTP_400_BAD_REQUEST)
            if not benfits:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'benfits is required'},status=status.HTTP_400_BAD_REQUEST)
            if not title:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'title is required'},status=status.HTTP_400_BAD_REQUEST)
            if not content:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'content is required'},status=status.HTTP_400_BAD_REQUEST)
            check_benefit = Benefits.objects.filter(id = benefit_id).first()
            if not check_benefit: 
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'No Benefits found'},status=status.HTTP_400_BAD_REQUEST)
            check_benefit.name = name
            check_benefit.price = price
            check_benefit.days = days
            check_benefit.benfits = benfits
            check_benefit.title = title
            check_benefit.content = content
            check_benefit.save()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})

        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 deleteBenefits(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            benefit_id = request.data.get('benefit_id')
            if not benefit_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'benefit_id is required'},status=status.HTTP_400_BAD_REQUEST)

            check_benefit = Benefits.objects.filter(id = benefit_id).first()
            check_benefit.delete()
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success'})
        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 ListCompanySeeking(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            property_obj = CompanySeekingEquity.objects.all()
            property_obj_count = CompanySeekingEquity.objects.all().count()
            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)
            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)
            paginator = Paginator(property_obj, page_per_data)
            try:
                property_obj = paginator.page(page)
            except PageNotAnInteger:
                property_obj = paginator.page(1)
            except EmptyPage:
                property_obj = paginator.page(paginator.num_pages)
            allData=[]
            for cs in property_obj:
                if cs.status == 0:
                    status_info = "Pending"
                elif cs.status == 1:
                    status_info = "Approved"
                else:
                    status_info = "Disapproved"
                allData.append({
                    'id': cs.id,
                    'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                    'customer_id' : cs.customerId.id,
                    'customer_phone_number' : cs.customerId.phoneNumber,
                    'customer_images' : cs.customerId.profileImage,
                    'company_name': cs.company_name,
                    'short_title': cs.short_title,
                    'description': cs.description,
                    'about_the_owner': cs.about_the_owner,
                    'image_data': ast.literal_eval(cs.property_image),
                    'videos': cs.property_video,
                    'videos_thumbnail': cs.videos_thumbnail,
                    'company_logo': cs.company_logo,
                    'maximum_drawing': cs.maximum_drawing,
                    'minimum_drawing': cs.minimum_drawing,
                    'share_for_sale': cs.share_for_sale,
                    'price_per_share': cs.price_per_share,
                    'number_of_share': cs.number_of_share,
                    'self_report': cs.self_report,
                    'nominal_share_price': cs.nominal_share_price,
                    'e_post': cs.e_post,
                    'issue_account_number': cs.issue_account_number,
                    'establish_year': cs.establish_year,
                    'premises_from': cs.premises_from,
                    'background_for_sale': cs.background_for_sale,
                    'company_website': cs.company_website,
                    'number_of_employee': cs.number_of_employee,
                    'company_email': cs.company_email,
                    'company_telephone': cs.company_telephone,
                    'youtube': cs.youtube,
                    'share_before_share': cs.share_before_share,
                    'name_of_shareholder': cs.name_of_shareholder,
                    'beskrivelse': cs.beskrivelse,
                    'upload_team_data': cs.upload_team_data,
                    'upload_team_name': cs.upload_team_name,
                    'upload_team_size': cs.upload_team_size,

                    'upload_board_data': cs.upload_board_data,
                    'upload_board_name': cs.upload_board_name,
                    'upload_board_size': cs.upload_board_size,

                    'upload_partner_data': cs.upload_partner_data,
                    'upload_partner_name': cs.upload_partner_name,
                    'upload_partner_size': cs.upload_partner_size,
                    'location': cs.location,
                    'country': cs.country,
                    'state': cs.state,
                    'city': cs.city,
                    'zip_code': cs.zip_code,
                    'landmark': cs.landmark,
                    'share_holder_image': cs.share_holder_image,
                    'enter_shares': cs.enter_shares,
                    'status': cs.status,
                    'agency': cs.agency.id if cs.agency else None,
                    'subscription_type': cs.subscription_type,
                    'latitude': cs.latitude,
                    'longitude': cs.longitude,
                    'start_date': cs.start_date,
                    'end_date': cs.end_date,
                    'status_info':status_info,
                   
                })
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Rent property fetched successfully','data':allData,'page':page if page else 1, 'page_count':paginator.num_pages, 'per_page':len(property_obj),'total':property_obj_count},status=status.HTTP_200_OK,)
        except Exception as e:
            print(e)
            return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)



class DetailCompanySeeking(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            seeking_id = request.GET.get('seeking_id')
            if not seeking_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'seeking_id is required'},status=status.HTTP_400_BAD_REQUEST)

            cs = CompanySeekingEquity.objects.filter(id=seeking_id).first()
            
            all_data = {
                'id': cs.id,
                'customer_name': cs.customerId.firstName + ' ' + cs.customerId.lastName,
                'customer_id' : cs.customerId.id,
                'customer_phone_number' : cs.customerId.phoneNumber,
                'customer_images' : cs.customerId.profileImage,
                'company_name': cs.company_name,
                'short_title': cs.short_title,
                'description': cs.description,
                'about_the_owner': cs.about_the_owner,
                'image_data': ast.literal_eval(cs.property_image),
                'videos': cs.property_video,
                'videos_thumbnail': cs.videos_thumbnail,
                'company_logo': cs.company_logo,
                'maximum_drawing': cs.maximum_drawing,
                'minimum_drawing': cs.minimum_drawing,
                'share_for_sale': cs.share_for_sale,
                'price_per_share': cs.price_per_share,
                'number_of_share': cs.number_of_share,
                'self_report': cs.self_report,
                'nominal_share_price': cs.nominal_share_price,
                'e_post': cs.e_post,
                'issue_account_number': cs.issue_account_number,
                'establish_year': cs.establish_year,
                'premises_from': cs.premises_from,
                'background_for_sale': cs.background_for_sale,
                'company_website': cs.company_website,
                'number_of_employee': cs.number_of_employee,
                'company_email': cs.company_email,
                'company_telephone': cs.company_telephone,
                'youtube': cs.youtube,
                'share_before_share': cs.share_before_share,
                'name_of_shareholder': cs.name_of_shareholder,
                'beskrivelse': cs.beskrivelse,
                'upload_team_data': cs.upload_team_data,
                'upload_team_name': cs.upload_team_name,
                'upload_team_size': cs.upload_team_size,

                'upload_board_data': cs.upload_board_data,
                'upload_board_name': cs.upload_board_name,
                'upload_board_size': cs.upload_board_size,

                'upload_partner_data': cs.upload_partner_data,
                'upload_partner_name': cs.upload_partner_name,
                'upload_partner_size': cs.upload_partner_size,
                'location': cs.location,
                'country': cs.country,
                'state': cs.state,
                'city': cs.city,
                'zip_code': cs.zip_code,
                'landmark': cs.landmark,
                'share_holder_image': cs.share_holder_image,
                'enter_shares': cs.enter_shares,
                'status': cs.status,
                'agency': cs.agency.id if cs.agency else None,
                'subscription_type': cs.subscription_type,
                'latitude': cs.latitude,
                'longitude': cs.longitude,
                'start_date': cs.start_date,
                'end_date': cs.end_date,
            }
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Success','data':all_data})

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

class getProperDeveloperDetails(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            property_id=request.GET.get('property_id')
            if not property_id:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'property_id is required'},status=status.HTTP_400_BAD_REQUEST)

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

class DoItByReeipoPrice(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            get_latest_price=SetdoitbyReeipoPrice.objects.filter().last()
            if get_latest_price:
                price = get_latest_price.price
            else :
                price = 0
            return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched successfully','price':price})
        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:
            price = request.data.get('price')
            if not price:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'price is required'},status=status.HTTP_400_BAD_REQUEST)
            get_latest_price=SetdoitbyReeipoPrice.objects.filter().last()
            if get_latest_price:
                get_latest_price.price =  price
                get_latest_price.save()
            else:
                SetdoitbyReeipoPrice.objects.create(price=price)
            return Response({"status_code":status.HTTP_200_OK,"status_message":"new price created successfully",'price':price},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):
        
            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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            
            print('uid',uid)
            customerObj=Customer.objects.filter(id=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
    

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

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


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

            property_project = PropertyProject.objects.create(
                customerId=customerObj,
                spend_too_much_time=spend_too_much_time,
                most_useless_skill=most_useless_skill,
                fun_act=fun_act,
                biography=biography,
                short_title=short_title,
                property_overview=property_overview,
                property_description=property_description,
                image_data=image_data,
                videos_thumbnail=videos_thumbnail,
                videos=videos,
                property_document=property_document,
                category=category,
                property_name=property_name,
                property_dimension=property_dimension,
                country=country,
                state=state,
                city=city,
                postal_code=postal_code,
                landmark=landmark,
                house_number=house_number,
                location=location,
                latitude=latitude,
                longitude=longitude,
                facility=facility,
                benefits=benefits,
                return_on_investment=return_on_investment,
                gross_income=gross_income,
                price=price,
                cashflow_pcm=cashflow_pcm,
                total_termination_fee=total_termination_fee,
                rent_to_landlord=rent_to_landlord,
                bill_utilities=bill_utilities,
                purchase_price=purchase_price,
                potential_cashflow_pcm=potential_cashflow_pcm,
                investment_finder_fee=investment_finder_fee,
                investment_return_on_investment_fee=investment_return_on_investment_fee,
                rental=rental,
                finder_fee=finder_fee,
                the_vision=the_vision,
                cost_to_consider=cost_to_consider,
                capital_required=capital_required,
                cashflow_forecast=cashflow_forecast,
                start_date=datetime.now(),
                is_draft=is_draft,
                subscription_type=subscription_tyre,
                agency=agency_obj,
                status =  1,
                added_by='by_reeipo'
            )
            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=property_project.id

                get_form.save()
            CustomerNotifications.objects.create(customer_id =customerObj,message="A new Property Project has been uploaded by the DO IT BY REEIPO TEAM",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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            spend_too_much_time = data.get('spend_too_much_time')
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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 addPropertyRent(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            rent_id = request.data.get('rent_id')
            customerObj=Customer.objects.filter(id=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
            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_reeipo')
            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()
            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()
            CustomerNotifications.objects.create(customer_id =customerObj,message="A new Rent Property has been uploaded by the DO IT BY REEIPO TEAM",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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=uid).first()
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            rent_id = request.data.get('rent_id')
            if plan_obj:
                subscription_tyre =  plan_obj.plan.tyre_type
            else:
                subscription_tyre =  0

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

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

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




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

   
            rentprop.rental_period = rental_period
            rentprop.avaiable_from_date = avaiable_from_date
            rentprop.monthly_rent = monthly_rent
            rentprop.monthly_rent_includes = monthly_rent_includes
            rentprop.security = security
            rentprop.security_amount = security_amount
            rentprop.heading = heading
            rentprop.description = description
            rentprop.display_information = display_information
            rentprop.name_of_ad = name_of_ad
            rentprop.visibilty = visibilty
            rentprop.location = location
            rentprop.latitude = latitude
            rentprop.longitude = longitude
            rentprop.subscription_type = subscription_tyre
            rentprop.is_draft = is_draft
   
            rentprop.property_overview = property_overview
            rentprop.type_property = type_property
            rentprop.description_home = description_home
            rentprop.spend_time = spend_time
            rentprop.useless_skill = useless_skill
            rentprop.fun_act = fun_act
            rentprop.biography = biography
            rentprop.primary_room = primary_room
            rentprop.housing_type = housing_type
            rentprop.key_info_bedroom = key_info_bedroom
            rentprop.story = story
            rentprop.status = 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 addSaleProperty(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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
            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_reeipo')
            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()
            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()
            CustomerNotifications.objects.create(customer_id =customerObj,message="A new Sale Property has been uploaded by the DO IT BY REEIPO TEAM",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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=uid).first()
            plan_obj = CustomersSubscriptions.objects.filter(customer = customerObj.id,is_active = True).first()
            sale_id = request.data.get('sale_id')
            if not sale_id:return Response({'status_code':status.HTTP_400_BAD_REQUEST,'message':'Sale id is required'},status=status.HTTP_400_BAD_REQUEST)
            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')
            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 bussinessForSale(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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
            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:            CustomerNotifications.objects.create(customer_id =customerObj.id,message="A new Bussiness For Sale has been uploaded by the DO IT BY REEIPO TEAM",notification_type="bussiness_sale")

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

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

            
            bussine_sale = BussinessForSale.objects.create(
                    customerId=customerObj,
                    short_title=short_title,
                    image_data=image_data,
                    videos=videos,
                    videos_thumbnail=videos_thumbnail,
                    company_name=company_name,
                    description=description,
                    total_turnover=total_turnover,
                    rent=rent,
                    established_year=established_year,
                    premises=premises,
                    years_of_work=years_of_work,
                    operation_concept=operation_concept,
                    operation_opening_hours=operation_opening_hours,
                    turnover_last_year=turnover_last_year,
                    salary_percentage=salary_percentage,
                    other_operating_cost=other_operating_cost,
                    cost=cost,
                    reason_for_sale=reason_for_sale,
                    website_link=website_link,
                    number_of_employes=number_of_employes,
                    area=area,
                    term_of_lease=term_of_lease,
                    document=document,
                    details=details,
                    service=service,
                    operations=operations,
                    market_initatives=market_initatives,
                    advantage_and_oppurtunity=advantage_and_oppurtunity,
                    valuation=valuation,
                    owner_name=owner_name,
                    phone=phone,
                    telephone=telephone,
                    email=email,
                    company=company,
                    public_order=public_order,
                    avaiable_attachment=avaiable_attachment,
                    location=location,
                    latitude=latitude,
                    longitude=longitude,
                    start_date=datetime.now(),
                    subscription_type=subscription_tyre,
                    turnover=turnover,
                    country=country,
                    state=state,
                    city=city,
                    postal_code=postal_code,
                    landmark=landmark,
                    floor=floor,
                    shareholder_name=shareholder_name,
                    shareholder_share=shareholder_share,
                    shareholder_description=shareholder_description,
                    status = 1,
                added_by='by_reeipo'
                    # 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()
            CustomerNotifications.objects.create(customer_id =customerObj,message="A new Bussiness For Sale has been uploaded by the DO IT BY REEIPO TEAM",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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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)

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


            businessSale.short_title = short_title
            businessSale.image_data = image_data
            businessSale.videos = videos
            businessSale.videos_thumbnail = videos_thumbnail
            businessSale.company_name = company_name
            businessSale.description = description
            businessSale.total_turnover = total_turnover
            businessSale.rent = rent
            businessSale.established_year = established_year
            businessSale.premises = premises
            businessSale.years_of_work = years_of_work
            businessSale.operation_concept = operation_concept
            businessSale.operation_opening_hours = operation_opening_hours
            businessSale.turnover_last_year = turnover_last_year
            businessSale.salary_percentage = salary_percentage
            businessSale.other_operating_cost = other_operating_cost
            businessSale.cost = cost
            businessSale.reason_for_sale = reason_for_sale
            businessSale.website_link = website_link
            businessSale.number_of_employes = number_of_employes
            businessSale.area = area
            businessSale.rent = rent
            businessSale.term_of_lease = term_of_lease
            businessSale.document = document
            businessSale.details = details
            businessSale.service = service
            businessSale.operations = operations
            businessSale.market_initatives = market_initatives
            businessSale.advantage_and_oppurtunity = advantage_and_oppurtunity
            businessSale.valuation = valuation
            businessSale.owner_name = owner_name
            businessSale.phone = phone
            businessSale.telephone = telephone
            businessSale.email = email
            businessSale.company = company
            businessSale.public_order = public_order
            businessSale.avaiable_attachment = avaiable_attachment
            businessSale.location = location
            businessSale.latitude = latitude
            businessSale.longitude = longitude
            businessSale.latitude = latitude
            businessSale.longitude = longitude
            businessSale.start_date = datetime.now()			
            businessSale.subscription_type = subscription_tyre
            businessSale.status = 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:
            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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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
            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_reeipo'
            )

            
            
            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()
            
            CustomerNotifications.objects.create(customer_id =customerObj,message="A new Company Seeking For Equity has been uploaded by the DO IT BY REEIPO TEAM",notification_type="seeking_equity")


            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:
            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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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()
            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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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_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_reeipo'
            )

            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()
            CustomerNotifications.objects.create(customer_id =customerObj,message="A new Property Developer has been uploaded by the DO IT BY REEIPO TEAM",notification_type="property_developer")


            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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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')
            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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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
            
            
   
            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=1,
                added_by='by_reeipo'
            )

            house_rent.save()
            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()
            CustomerNotifications.objects.create(customer_id =customerObj,message="A new House wanted for rent property has been uploaded by the DO IT BY REEIPO TEAM",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 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,algorithms=["HS256"])
            user_id = decoded['user_id']
            data = request.data
            uid=data.get('customer_id')
            customerObj=Customer.objects.filter(id=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':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)



from django.db.models import Sum

class AdminTotalEarnings(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            total_earnings = SuperAdmin.objects.aggregate(total=Sum('earnings'))['total'] or 0
            return Response(
                {"total_earnings": float(total_earnings)},
                status=status.HTTP_200_OK
            )
        except Exception as e:
            return Response(
                {"error": str(e)},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )

class SetCommisionAPI(APIView):
    def get(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,algorithms=["HS256"])
            user_id = decoded['user_id']
            commission = SetCommision.objects.last()  # get latest commission
            if commission:
                return Response(
                    {"commission": commission.commision, "created_at": commission.created_at},
                    status=status.HTTP_200_OK
                )
            return Response(
                {"commission": None, "message": "No commission set yet."},
                status=status.HTTP_200_OK
            )
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    def post(self, request):
        try:
            commision_value = request.data.get("commision")
            if commision_value is None:
                return Response(
                    {"error": "Commission value is required."},
                    status=status.HTTP_400_BAD_REQUEST
                )

            commission = SetCommision.objects.create(commision=commision_value)
            return Response(
                {"message": "Commission set successfully.", "commission": commission.commision},
                status=status.HTTP_201_CREATED
            )
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)




class Subscriptions(APIView):
    def get(self, request):
        token = get_authorization_header(request)
        if not token or token == b"null" or token.strip() == b"":
            raise exceptions.AuthenticationFailed(
                'Authorization Header or Token is missing on Request Headers'
            )

        decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
        user_id = decoded['user_id']

        param = request.query_params.get("subscription_type")
        page = request.query_params.get("page", 1)
        page_size = request.query_params.get("page_size", 10)

        data = []

        if param == "customer_subscription":
            qs = CustomersFeatureAdsHistory.objects.select_related("customer", "plan")
            for sub in qs:
                data.append({
                    "customer_id": sub.customer.id if sub.customer else None,
                    "customer_name": f"{sub.customer.firstName} {sub.customer.lastName}".strip() if sub.customer else "",
                    "email": sub.customer.email if sub.customer else "",
                    "plan": sub.plan.name if sub.plan else "",
                    "is_active": sub.is_active,
                    "property_type": sub.property_type,
                    "property_id": sub.property_id,
                    "payment_date": sub.payment_date,
                    "start_date": sub.start_date,
                    "end_date": sub.end_date,
                })

        elif param == "agency_subscription":
            qs = AgencySubscriptions.objects.select_related("customer", "plan")
            for sub in qs:
                data.append({
                    "customer_id": sub.customer.id if sub.customer else None,
                    "customer_name": f"{sub.customer.firstName} {sub.customer.lastName}".strip() if sub.customer else "",
                    "email": sub.customer.email if sub.customer else "",
                    "plan": sub.plan.planName if sub.plan else "",
                    "is_active": sub.is_active,
                    "sub_start_date": sub.sub_start_date,
                    "sub_expiry_date": sub.sub_expiry_date,
                    "start_date": sub.start_date,
                    "end_date": sub.end_date,
                })

        elif param == "lawyer_subscription":
            qs = LawyerSubscriptions.objects.select_related("customer", "plan")
            for sub in qs:
                data.append({
                    "customer_id": sub.customer.id if sub.customer else None,
                    "customer_name": f"{sub.customer.firstName} {sub.customer.lastName}".strip() if sub.customer else "",
                    "email": sub.customer.email if sub.customer else "",
                    "plan": sub.plan.planName if sub.plan else "",
                    "is_active": sub.is_active,
                    "sub_start_date": sub.sub_start_date,
                    "sub_expiry_date": sub.sub_expiry_date,
                    "start_date": sub.start_date,
                    "end_date": sub.end_date,
                })

        elif param == "do_it_reeipo":
            qs = DoItByReeipoRequests.objects.select_related("customer")
            for req in qs:
                data.append({
                    "customer_id": req.customer.id if req.customer else None,
                    "customer_name": f"{req.customer.firstName} {req.customer.lastName}".strip() if req.customer else "",
                    "email": req.customer.email if req.customer else "",
                    "property_type": req.property_type,
                    "property_name": req.property_name,
                    "property_id": req.property_id,
                    "is_published": req.is_published,
                    "payment_status": req.payment_status,
                    "start_date": req.start_date,
                    "end_date": req.end_date,
                    "do_it_by_type": req.do_it_by_type,
                    "status": req.status,
                })

        else:
            return Response(
                {
                    "error": "Invalid param",
                    "allowed": [
                        "customer_subscription",
                        "agency_subscription",
                        "lawyer_subscription",
                        "do_it_reeipo",
                    ],
                },
                status=400,
            )

        # ---- Pagination logic ----
        paginator = Paginator(data, page_size)
        try:
            page_obj = paginator.page(page)
        except PageNotAnInteger:
            page_obj = paginator.page(1)
        except EmptyPage:
            page_obj = paginator.page(paginator.num_pages)

        response_data = {
            "status_code": status.HTTP_200_OK,
            "status_message": "Subscriptions fetched successfully",
            "count": paginator.count,
            "total_pages": paginator.num_pages,
            "current_page": page_obj.number,
            "page_size": int(page_size),
            "data": list(page_obj)
        }

        return Response(response_data, status=status.HTTP_200_OK)


"""-----------------------------------------------"""
from panel_api.models import HelpAndSupportQuery
class AdminHelpSupportView(APIView):
    def get(self, request):
        try:
            token = get_authorization_header(request)
            if not token or token == b"null":
                raise exceptions.AuthenticationFailed('Authorization Header or Token is missing')

            decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256'])
            user_id = decoded.get('user_id')
            admin_obj = SuperAdmin.objects.filter(user_id=user_id).first()
            
            if not admin_obj:
                return Response({
                    'status_code': status.HTTP_403_FORBIDDEN,
                    'status_message': 'You are not authorized to access this'
                }, status=status.HTTP_403_FORBIDDEN)

            queries = HelpAndSupportQuery.objects.all().order_by('-raised_at')
            query_list = []
            for query in queries:
                query_list.append({
                    'id': query.id,
                    'full_name': query.full_name,
                    'email': query.email,
                    'phone': query.phone,
                    'interset_in': query.interset_in,
                    'query': query.query,
                    'status': query.status,
                    'raised_at': query.raised_at,
                    'resolved_at': query.resolved_at,
                    'rejected_reason': query.rejected_reason
                })

            notifications = AdminNotifications.objects.filter(
                notification_type="Query Raised"
            ).order_by('-start_date')

            notification_list = [
                {
                    'id': notif.id,
                    'message': notif.message,
                    'notification_type': notif.notification_type,
                    'is_read': notif.is_read,
                    'start_date': notif.start_date,
                    'end_date': notif.end_date
                } for notif in notifications
            ]
            
            return Response({
                'status_code': status.HTTP_200_OK,
                'status_message': 'Success',
                'queries': query_list,
                'notifications': notification_list
            }, status=status.HTTP_200_OK)
        
        except Exception as e:
            return Response({
                'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR,
                'status_message': str(e)
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    
    def post(self, request):
        try:
            token = get_authorization_header(request)
            if not token or token == b"null":
                raise exceptions.AuthenticationFailed('Authorization Header or Token is missing')

            decoded = jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256'])
            user_id = decoded.get('user_id')
            admin_obj = SuperAdmin.objects.filter(user_id=user_id).first()

            if not admin_obj:
                return Response({
                    'status_code': status.HTTP_403_FORBIDDEN,
                    'status_message': 'You are not authorized to access this'
                }, status=status.HTTP_403_FORBIDDEN)

            query_id = request.data.get("query_id")
            new_status = request.data.get("status")
            rejected_reason = request.data.get("rejected_reason", "")

            if not query_id or not new_status:
                return Response({
                    "status_code": status.HTTP_400_BAD_REQUEST,
                    "status_message": "query_id and status are required"
                }, status=status.HTTP_400_BAD_REQUEST)

            if new_status not in ["resolved", "rejected"]:
                return Response({
                    "status_code": status.HTTP_400_BAD_REQUEST,
                    "status_message": "Invalid status. Must be resolved or rejected"
                }, status=status.HTTP_400_BAD_REQUEST)

            query_obj = HelpAndSupportQuery.objects.filter(id=query_id).first()
            if not query_obj:
                return Response({
                    "status_code": status.HTTP_404_NOT_FOUND,
                    "status_message": "Query not found"
                }, status=status.HTTP_404_NOT_FOUND)

            query_obj.status = new_status
            if new_status == "rejected":
                query_obj.rejected_reason = rejected_reason
            query_obj.resolved_at = timezone.now()
            query_obj.save()

            AdminNotifications.objects.create(
                message=f"Query {query_obj.id} has been {new_status} by {admin_obj.user.username}.",
                notification_type="Query Update",
                is_read=False,
                start_date=timezone.now(),
                end_date=None
            )

            return Response({
                "status_code": status.HTTP_200_OK,
                "status_message": f"Query {new_status} successfully",
                "query_id": query_obj.id,
                "new_status": query_obj.status,
                "resolved_at": query_obj.resolved_at
            }, status=status.HTTP_200_OK)

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