from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import View
from .models import *
from django.contrib import messages
from django.http import HttpResponse, JsonResponse
from django.shortcuts import redirect, render
from django.core.files.storage import FileSystemStorage
from django.urls import reverse
from django.core.paginator import Paginator
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload
from django.conf import settings
import subprocess
import shlex
import os
from django.contrib.auth.models import User
from django.contrib.auth.models import Group
from users.models import *
from dashboard.models import *
from django.db.models import Q
from django.db import IntegrityError
from django.db.models import ProtectedError
import datetime
from nazox.settings import DRIVE_IMAGE_PATH,MAP_API_KEY,MEDIA_ROOT

# Create your views here.


def get_company_data():
    context = {}
    company_name = Setting.objects.filter(name="update_within_company_name").values_list('value',flat=True).first()
    company_logo = Setting.objects.filter(name="update_within_company_logo").values_list('value',flat=True).first()
    company_number = Setting.objects.filter(name="update_within_company_number").values_list('value',flat=True).first()
    company_email = Setting.objects.filter(name="update_within_company_email").values_list('value',flat=True).first()
    company_image = Setting.objects.filter(name="update_within_company_image").values_list('value',flat=True).first()
    context['company_name'] = company_name
    context['company_logo'] = company_logo
    context['company_number'] = company_number
    context['company_email'] = company_email
    context['company_image'] = company_image
    return context


def get_company_data2(request):
    # context = {}
    company_name = Setting.objects.filter(name="update_within_company_name").values_list('value',flat=True).first()
    company_logo = Setting.objects.filter(name="update_within_company_logo").values_list('value',flat=True).first()
    company_number = Setting.objects.filter(name="update_within_company_number").values_list('value',flat=True).first()
    company_email = Setting.objects.filter(name="update_within_company_email").values_list('value',flat=True).first()
    company_image = Setting.objects.filter(name="update_within_company_image").values_list('value',flat=True).first()

     # Example code:
    company_data = {
        'company_name': company_name,
        'company_image': company_image,
        'company_logo': company_logo,
        'company_number':company_number,
        'company_email':company_email
    }
    
    return JsonResponse(company_data)


class SettingView(LoginRequiredMixin,View):

    def get(self, request):
        company_data = get_company_data()
        range = Setting.objects.filter(name="update_within_range").values("value")
        if range[0] == "":
            range =None
        range_status = Setting.objects.filter(name="update_within_range_status").values("value")
        if range_status[0]['value'] =="":
            range_status=None
        update_within_company_name = Setting.objects.filter(name="update_within_company_name").values("value")
        if update_within_company_name =="":
            update_within_company_name =None
        update_within_company_logo = Setting.objects.filter(name="update_within_company_logo").values("value")
    
        # if update_within_company_logo :
            # logo = update_within_company_logo[0]['logo'].split("/")[1]
        update_within_company_email = Setting.objects.filter(name="update_within_company_email").values("value")
        if update_within_company_email == "":
            update_within_company_email =None
        update_within_company_number = Setting.objects.filter(name="update_within_company_number").values("value")
        update_within_company_image = Setting.objects.filter(name="update_within_company_image").values("value")
        if update_within_company_number == "":
            update_within_company_number =None
        
        update_siteinput = Setting.objects.filter(name="update_siteinput").values("value")
        
        context = {"range":range[0],"range_status":range_status[0]['value'],"update_within_company_name":update_within_company_name[0],"update_within_company_logo":update_within_company_logo[0],"update_within_company_email":update_within_company_email[0],"update_within_company_number":update_within_company_number[0], 
        "update_siteinput":update_siteinput[0]['value'],                           
        "update_within_company_image":update_within_company_image[0],"title":"Settings",
        "company_data":company_data}
        return render(request, 'menu/settings/setting.html', context)
    
    # @csrf_exempt
    def post(self, request):
        if request.method == "POST":

            range_status = request.POST.get('range_status',None)
            range = request.POST.get('range')
            company_name = request.POST.get('company_name',None)
            company_logo = request.FILES.get('company_logo',None)
            company_email = request.POST.get('company_email',None)
            company_number = request.POST.get('company_phone_no',None)
            company_image = request.FILES.get('company_image',None)
            siteupdate = request.POST.get('editor')

            
            if range_status:
                Setting.objects.filter(name="update_within_range_status").update(value=range_status)
            if range:
                Setting.objects.filter(name="update_within_range").update(value=range)
            if company_name:
                Setting.objects.filter(name="update_within_company_name").update(value=company_name)
            if company_email:
                Setting.objects.filter(name="update_within_company_email").update(value=company_email)
            if company_number:
                Setting.objects.filter(name="update_within_company_number").update(value=company_number)
           
            Setting.objects.filter(name="update_siteinput").update(value=siteupdate)
            if company_logo:
                
                file_data = Setting.objects.filter(name="update_within_company_logo")
                db_file_name = file_data.values('value').first()
    
                fs = FileSystemStorage()

                if db_file_name['value'] not in ['',None]:
                    fs.delete(db_file_name['value'])    
                    
                filename = fs.save(company_logo.name, company_logo)

                Setting.objects.filter(name="update_within_company_logo").update(value=filename)
            
            if company_image:
                
                file_data = Setting.objects.filter(name="update_within_company_image")
                db_file_name = file_data.values('value').first()
    
                fs = FileSystemStorage()

                if db_file_name['value'] not in ['',None]:
                    fs.delete(db_file_name['value'])    
                    
                filename = fs.save(company_image.name, company_image)

                Setting.objects.filter(name="update_within_company_image").update(value=filename)
            return redirect('settings')
        else:
            return redirect('menu/settings/setting.html.html')
    
class database_backup(LoginRequiredMixin,View):
   def get(self, request):
        pages = request.GET.get('page_count', 10)  # Default page count if not specified
        order_by = request.GET.get('order_by', 'id')  # Default sort field if not specified
        sort_order = request.GET.get('sort_order', 'asc')  # Default sort order if not specified

        page_list = [10, 20, 50, 100, 500]
        databases = DatabaseBackup.objects.all().order_by(order_by, '-id')

        if sort_order == 'desc':
            databases = databases.reverse()

        if int(pages) in page_list:
            page_passed = pages
        else:
            page_passed = 10

        # count = len(databases)
        paginator = Paginator(databases, page_passed)
        page_number = request.GET.get('page', 1)
        page_obj = paginator.get_page(page_number)

        # Calculate the starting serial number for the current page
        serial_number = (page_obj.number - 1) * page_obj.paginator.per_page + 1

        # Add serial numbers to each state in the current page
        for state in page_obj:
            state.serial_number = serial_number
            serial_number += 1

        context = {
            "page_obj": page_obj,
            "title": "Databases",
            "company_data": get_company_data(),
            "order_by": order_by,
            "sort_order": sort_order,
        }

        return render(request, 'menu/database/database.html', context)
   
class ViewLocation(LoginRequiredMixin, View):
    def get(self, request):
        current_grp = User.objects.filter(id=request.user.id).values('id', 'groups__id')
        pages = request.GET.get('page_count', 0)
        order_by = request.GET.get('order_by', 'id')  # Default sort field if not specified
        sort_order = request.GET.get('sort_order', 'asc')  # Default sort order if not specified
        page_list = [10, 20, 50, 100, 500]

        if current_grp[0]['groups__id'] != 1:
            group = Group.objects.get(id=current_grp[0]['groups__id'])
            users = group.user_set.values_list('id', flat=True)
            users = UserInfo.objects.filter(created_by__in=users)
            user_ids = users.values_list('user', flat=True)

            if sort_order == 'asc':
                users = User.objects.filter(id__in=user_ids).values(
                    'id', 'username', 'groups__name', 'first_name', 'last_name', 'email'
                ).order_by(order_by, 'id')
            else:
                users = User.objects.filter(id__in=user_ids).values(
                    'id', 'username', 'groups__name', 'first_name', 'last_name', 'email'
                ).order_by(f'-{order_by}', '-id')
        else:
            valid_sort_fields = ['id', 'username', 'groups__name', 'first_name', 'last_name', 'email']

            if order_by in valid_sort_fields:
                filter_query = Q(groups__name='Ground Team') | Q(id=2)
                if sort_order == 'asc':
                    users = User.objects.filter(filter_query).values(
                        'id', 'username', 'groups__name', 'first_name', 'last_name', 'email'
                    ).order_by(order_by, 'id')
                else:
                    users = User.objects.filter(filter_query).values(
                        'id', 'username', 'groups__name', 'first_name', 'last_name', 'email'
                    ).order_by(f'-{order_by}', '-id')

        if int(pages) in page_list:
            page_passed = pages
        else:
            page_passed = 10

        paginator = Paginator(users, page_passed)
        page_number = request.GET.get('page', 1)
        page_obj = paginator.get_page(page_number)
        start_index = page_obj.start_index() - 1  # Correct 1-based to 0-based index

        context = {
            "users": users,
            "page_obj": page_obj,
            "title": "Users Location",
            "company_data": get_company_data(),
            "order_by": order_by,
            "sort_order": sort_order,
            "start_index": start_index  # Add start index to context
        }

        return render(request, 'menu/locations/location.html', context)

class ListingOptions(LoginRequiredMixin, View):
    def get(self, request):
        items = NewImageListOptions.objects.all()
        paginator = Paginator(items, 10)  # Show 10 items per page
        page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        start_index = page_obj.start_index() - 1 
        return render(request, 'menu/options/options.html', {'page_obj': page_obj,"start_index": start_index,"title": "Set Listing Options",
            "company_data": get_company_data(),})


class AddOptions(LoginRequiredMixin, View):

    def get(self, request):
        groups = Group.objects.all()
        paginator = Paginator(groups, 10)  # Show 10 items per page
        page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        return render(request, 'menu/options/addoptions.html', {'groups': groups,'page_obj': page_obj,"title": "Add Options",
            "company_data": get_company_data(),})


    def post(self, request):
        user = User.objects.filter(id=request.user.id).values('id').first()
        group = request.POST.get('group_name')
        items = request.POST.getlist('options')
        items_str = ','.join(items)

        try:
            existing_entry = NewImageListOptions.objects.get(group_name=group)
            existing_entry.listing_options = items_str
            existing_entry.updated_by = user['id']
            existing_entry.save()
            messages.success(request, "Options Added successfully.")
        except NewImageListOptions.DoesNotExist:
            try:
                NewImageListOptions.objects.create(listing_options=items_str, group_name=group, created_by=user['id'])
                messages.success(request, "Options added successfully.")
            except IntegrityError:
                messages.error(request, "Failed to add options. Duplicate entry found.")
                return redirect(request.META['HTTP_REFERER'])
            except Exception as e:
                messages.error(request, f"Failed to add options. Error: {str(e)}")
                return redirect(request.META['HTTP_REFERER'])

        return redirect('listing_options')
    

class EditOptions(LoginRequiredMixin, View):

    def get(self, request, id):
        try:
            option = NewImageListOptions.objects.get(id=id)
            groups = Group.objects.all()
            listing_options_list = option.listing_options.split(',')
            context = {
                "id": id,
                "option": option,
                "groups": groups,
                "listing_options_list": listing_options_list,
                "title": "Edit Group Options",
                "company_data": get_company_data()
            }
            return render(request, 'menu/options/addoptions.html', context)
        except NewImageListOptions.DoesNotExist:
            messages.error(request, "Options not found.")
            return redirect('listing_options')

    def post(self, request, id):
        try:
            option = NewImageListOptions.objects.get(id=id)
            user = User.objects.filter(id=request.user.id).values('id').first()
            items = request.POST.getlist('options')
            items_str = ','.join(items)
            option.listing_options = items_str
            option.updated_by = user['id']
            option.save()
            messages.success(request, "Options updated successfully.")
            return redirect('listing_options')
        except NewImageListOptions.DoesNotExist:
            messages.error(request, "Options not found.")
            return redirect('listing_options')
        except Exception as e:
            messages.error(request, f"Failed to update options. Error: {str(e)}")
            return redirect(request.META['HTTP_REFERER'])

class DeleteOptions(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            state = NewImageListOptions.objects.get(group_name=id)
            state.delete()
            messages.success(request, "Group Options deleted successfully.")
        except NewImageListOptions.DoesNotExist:
            messages.error(request, "'Group Options not found.")
        except ProtectedError as e:
            protected_instances = e.protected_objects
            protected_ids = [instance.id for instance in protected_instances]
            protected_models = [instance._meta.verbose_name for instance in protected_instances]
            messages.error(
                request,
                f"Cannot delete the 'Group Options because it is referenced by the following {', '.join(protected_models)}: {', '.join(map(str, protected_ids))}."
            )
        return redirect('listing_options')
def download_file(name):
    # Specify the path to your Google Drive API credentials JSON file
        credentials_path = settings.DRIVE_API

        creds = service_account.Credentials.from_service_account_file(credentials_path)
        service = build('drive', 'v3', credentials=creds)

        response = service.files().list(q=f"name='{name}'", fields="files(id)").execute()
        file_id = response['files'][0]['id']

        request = service.files().get_media(fileId=file_id)
        file_stream = open(name, 'wb')
        downloader = MediaIoBaseDownload(file_stream, request)

        done = False
        while not done:
            status, done = downloader.next_chunk()
   


# Import Database
def importMysql(request,name):
    try:
        # Specify your database configuration
        db_name = settings.DATABASES['default']['NAME']
        db_user = settings.DATABASES['default']['USER']
        db_password = settings.DATABASES['default']['PASSWORD']
        db_host = settings.DATABASES['default']['HOST']
        db_port = settings.DATABASES['default']['PORT']

        download_file(name)
        escaped_password = shlex.quote(db_password)
        # Construct the command to import the SQL file using the mysql command-line tool
        command = f"mysql -h {db_host} -u {db_user} -p{escaped_password} {db_name} < {name}"

        try:
            subprocess.run(command, shell=True, check=True)
            # messages.add_message(request, messages.SUCCESS, 'SQL file imported successfully.')
            messages.success(request, 'SQL file imported successfully')
            # messages.success(request, "SQL file imported successfully.")
        except subprocess.CalledProcessError as e:
            # messages.add_message(request, messages.error,f"Error: {e}")
            messages.error(request, f"Error: {e}")
            
        os.remove(name)
        # return HttpResponse("Data imported successfully.")
        return redirect('database_backup')

    
    except Exception as ex:
        os.remove(name)
        messages.error(request, f"Error: {ex}")
        return HttpResponse("An error occurred.", status=500)
            

class DeleteData(LoginRequiredMixin, View):
    def get(self, request):

        # Get the current year
        current_year =  datetime.datetime.now().year
        user = User.objects.get(id=request.user.id)
        user_locations= UserLocation.objects.filter(user=request.user.id)
        user_date= UserInfo.objects.filter(user=request.user.id).values('from_date','to_date')
        current_grp = User.objects.filter(id=request.user.id).values('groups__id','groups__name')
        order_by = request.GET.get('order_by', 'id')  # Default sort field if not specified
        try:
            existing_entry = NewImageListOptions.objects.get(group_name=current_grp[0]['groups__name'])
            listing_options_list = existing_entry.listing_options.split(',')
        except NewImageListOptions.DoesNotExist:
            listing_options_list = []

        sort_order = request.GET.get('sort_order', 'asc') 

        statuses = StatusMaster.objects.all().values('id','name').order_by('order_by')


        countries = CountryMaster.objects.all().values('name','id').order_by('name')
        states = StateMaster.objects.all().values('id','name').order_by('name')
        allsubareas = SubAreaMaster.objects.all().values('id','name').order_by('name')
        allareas = AreaMaster.objects.all().values('id','name').order_by('name')
        allcities = CityMaster.objects.all().values('id','name').order_by('name')
        allsubdistricts = SubDistrictMaster.objects.all().values('id','name').order_by('name')
        alldistricts = DistrictMaster.objects.all().values('id','name').order_by('name')

        img_list = []
        count = 0
        search_for = None

        districts=[]
        subdistricts=[]
        cities=[]
        areas=[]
        subareas=[]

        user_state = request.GET.get('user_state',None)
        user_district = request.GET.get('user_district',None)
        user_subdistrict = request.GET.get('user_subdistrict',None)
        user_city = request.GET.get('user_city',None)
        user_area = request.GET.get('user_area',None)
        subarea = request.GET.get('subarea',None)
        round = request.GET.get('round',None)
        image_date_from = request.GET.get('image_date_from',None)
        image_date_to = request.GET.get('image_date_to',None)
        status = request.GET.get('status',None)
        img_id = request.GET.get('image_id',None)

        if image_date_from or image_date_to:
            current_year = "2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050"

        
        
        if user_state:
            districts = DistrictMaster.objects.filter(state_id = user_state)
            if user_district:
                subdistricts = SubDistrictMaster.objects.filter(district_id = user_district)
                if user_subdistrict:
                    cities = CityMaster.objects.filter(subdistrict_id = user_subdistrict)
                    if user_city:
                        areas = AreaMaster.objects.filter(city_id=user_city)
                        if user_area:
                            subareas = SubAreaMaster.objects.filter(area_id=user_area)

                        

        country_list = []
        state_list = []
        district_list = []
        city_list = []
        area_list = []
        subarea_list = []

        query = ""
        extra_where = "" 
        state_query = Q()
        district_query = Q()
        subdistrict_query = Q()
        city_query = Q()
        area_query = Q()
        subarea_query = Q()

        images = []

        if user_state:
            query += " AND state_id_id = " + user_state

        
        if user_district:
            query += " AND district_id_id = " + user_district

        
        if user_subdistrict:
            query += " AND subdistrict_id_id = " + user_subdistrict
        

        if user_city:
            query += " AND city_id_id = " + user_city
                
        if user_area:
            query += " AND area_id_id = " + user_area
        
        if subarea:
            query += " AND subarea_id_id = " + subarea

        if round:
            if user_state:
                query += " AND round = " + round
                
                if status:
                    query +=" AND status_id =" + status
            
                if image_date_from:
                    image_date_from = datetime.datetime.strptime(str(image_date_from), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) >= '" + str(image_date_from) + "'"
                if image_date_to:
                    image_date_to = datetime.datetime.strptime(str(image_date_to), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) <= '" + str(image_date_to) + "'"

                if img_id:
                    query += " AND id = '" + img_id + "'"

            else:
                query += " AND round = " + round
            
                if status:
                    query +=" AND status_id =" + status
            
                if image_date_from:
                    image_date_from = datetime.datetime.strptime(str(image_date_from), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) >= '" + str(image_date_from) + "'"
                if image_date_to:
                    image_date_to = datetime.datetime.strptime(str(image_date_to), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) <= '" + str(image_date_to) + "'"

                if img_id:
                    query += " AND id = '" + img_id + "'"
    

        if status and not round:
            if user_state or subarea:
                query +=" AND status_id =" + status

                if img_id:
                    query += " AND id = '" + img_id + "'"
            else:
                query += " AND status_id = " + status

                if image_date_from:
                    image_date_from = datetime.datetime.strptime(str(image_date_from), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) >= '" + str(image_date_from) + "'"
                if image_date_to:
                    image_date_to = datetime.datetime.strptime(str(image_date_to), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) <= '" + str(image_date_to) + "'"

                if img_id:
                    query += " AND id = '" + img_id + "'"



        if image_date_from and not status and not round:
            if user_state or subarea:
                image_date_from = datetime.datetime.strptime(str(image_date_from), '%Y-%m-%d').date()
                query += " AND DATE(created_at) >= '" + str(image_date_from) + "'"
                if image_date_to:
                    image_date_to = datetime.datetime.strptime(str(image_date_to), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) <= '" + str(image_date_to) + "'"
                if img_id:
                    query += " AND id = '" + img_id + "'"

            else:
                image_date_from = datetime.datetime.strptime(str(image_date_from), '%Y-%m-%d').date()
                query += " AND (DATE(created_at) >= '" + str(image_date_from) + "')"
                if image_date_to:
                    image_date_to = datetime.datetime.strptime(str(image_date_to), '%Y-%m-%d').date()
                    query += " AND (DATE(created_at) <= '" + str(image_date_to) + "')"

                if img_id:
                    query += " AND id = '" + img_id + "'"
        
        if image_date_to and not status and not round:
            if user_state or subarea:
                image_date_to = datetime.datetime.strptime(str(image_date_to), '%Y-%m-%d').date()
                query += " AND (DATE(created_at) <= '" + str(image_date_to) + "')"
                if image_date_from:
                    image_date_from = datetime.datetime.strptime(str(image_date_from), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) >= '" + str(image_date_from) + "'"
                if img_id:
                    query += " AND id = '" + img_id + "'"

            else:
                image_date_to = datetime.datetime.strptime(str(image_date_to), '%Y-%m-%d').date()
                query += " AND (DATE(created_at) <= '" + str(image_date_to) + "')"
                if image_date_from:
                    image_date_from = datetime.datetime.strptime(str(image_date_from), '%Y-%m-%d').date()
                    query += " AND DATE(created_at) >= '" + str(image_date_from) + "'"

                if img_id:
                    query += " AND id = '" + img_id + "'"

        if img_id and not status and not round and not image_date_from and not image_date_to:

            if user_state:
                query +=" AND id =" + img_id
            else:
                query += " AND id = " + img_id

        if request.user.is_superuser:
            if user_date and user_date[0]['from_date'] or user_date[0]['to_date']:
                if user_date[0]['from_date'] and user_date[0]['to_date']:
                    if order_by == "district_id_id":
                        query = "SELECT dashboard_imagemaster.*, dashboard_districtmaster.name as district_name FROM dashboard_imagemaster LEFT JOIN dashboard_districtmaster on dashboard_districtmaster.id = dashboard_imagemaster.district_id_id WHERE  (DATE(created_at) <= '" + str(user_date[0]['to_date']) + "') AND (DATE(created_at) >= '" + str(user_date[0]['from_date']) + "')" + query + " ORDER BY district_name "+  sort_order 

                    elif order_by == "subdistrict_id_id":
                        query = "SELECT dashboard_imagemaster.*, dashboard_subdistrictmaster.name as subdistrict_name FROM dashboard_imagemaster LEFT JOIN dashboard_subdistrictmaster on dashboard_subdistrictmaster.id = dashboard_imagemaster.subdistrict_id_id WHERE  (DATE(created_at) <= '" + str(user_date[0]['to_date']) + "') AND (DATE(created_at) >= '" + str(user_date[0]['from_date']) + "')" + query + " ORDER BY subdistrict_name "+  sort_order 

                    elif order_by == "city_id_id":
                        query = "SELECT dashboard_imagemaster.*, dashboard_citymaster.name as city_name FROM dashboard_imagemaster LEFT JOIN dashboard_citymaster on dashboard_citymaster.id = dashboard_imagemaster.city_id_id WHERE  (DATE(created_at) <= '" + str(user_date[0]['to_date']) + "') AND (DATE(created_at) >= '" + str(user_date[0]['from_date']) + "')" + query + " ORDER BY city_name "+  sort_order 
                    
                    elif order_by == "area_id_id":
                        query = "SELECT dashboard_imagemaster.*, dashboard_areamaster.name as area_name FROM dashboard_imagemaster LEFT JOIN dashboard_areamaster on dashboard_areamaster.id = dashboard_imagemaster.area_id_id WHERE  (DATE(created_at) <= '" + str(user_date[0]['to_date']) + "') AND (DATE(created_at) >= '" + str(user_date[0]['from_date']) + "')" + query + " ORDER BY area_name "+  sort_order 
                    
                    elif order_by == "subarea_id_id":
                        query = "SELECT dashboard_imagemaster.*, dashboard_subareamaster.name as subarea_name FROM dashboard_imagemaster LEFT JOIN dashboard_subareamaster on dashboard_subareamaster.id = dashboard_imagemaster.subarea_id_id WHERE  (DATE(created_at) <= '" + str(user_date[0]['to_date']) + "') AND (DATE(created_at) >= '" + str(user_date[0]['from_date']) + "')" + query + " ORDER BY subarea_name "+  sort_order 
                    
                    elif order_by == "status":
                        query = "SELECT dashboard_imagemaster.*, dashboard_statusmaster.name as status_name FROM dashboard_imagemaster LEFT JOIN dashboard_statusmaster on dashboard_statusmaster.id = dashboard_imagemaster.status_id WHERE  (DATE(created_at) <= '" + str(user_date[0]['to_date']) + "') AND (DATE(created_at) >= '" + str(user_date[0]['from_date']) + "')" + query + " ORDER BY status_name "+  sort_order

                    else:
                        query = "SELECT * FROM dashboard_imagemaster WHERE (DATE(created_at) <= '" + str(user_date[0]['to_date']) + "') AND (DATE(created_at) >= '" + str(user_date[0]['from_date']) + "')" + query

                        data_sort_field = order_by.replace("text-center", "").strip()
                        order_by_clause = " ORDER BY " + data_sort_field + " " + sort_order

                        # Append the ORDER BY clause to the base query
                        query = query + order_by_clause
                elif user_date[0]['from_date'] or user_date[0]['to_date']:
                    if user_date[0]['from_date'] and user_date[0]['to_date'] == None:
                        if order_by == "district_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_districtmaster.name as district_name FROM dashboard_imagemaster LEFT JOIN dashboard_districtmaster on dashboard_districtmaster.id = dashboard_imagemaster.district_id_id WHERE  DATE(created_at) >= '" + str(user_date[0]['from_date']) + "'" + query + " ORDER BY district_name "+  sort_order 

                        elif order_by == "subdistrict_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_subdistrictmaster.name as subdistrict_name FROM dashboard_imagemaster LEFT JOIN dashboard_subdistrictmaster on dashboard_subdistrictmaster.id = dashboard_imagemaster.subdistrict_id_id WHERE  DATE(created_at) >= '" + str(user_date[0]['from_date']) + "'" + query + " ORDER BY subdistrict_name "+  sort_order 

                        elif order_by == "city_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_citymaster.name as city_name FROM dashboard_imagemaster LEFT JOIN dashboard_citymaster on dashboard_citymaster.id = dashboard_imagemaster.city_id_id WHERE  DATE(created_at) >= '" + str(user_date[0]['from_date']) + "'" + query + " ORDER BY city_name "+  sort_order 
                        
                        elif order_by == "area_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_areamaster.name as area_name FROM dashboard_imagemaster LEFT JOIN dashboard_areamaster on dashboard_areamaster.id = dashboard_imagemaster.area_id_id WHERE  DATE(created_at) >= '" + str(user_date[0]['from_date']) + "'" + query + " ORDER BY area_name "+  sort_order 
                        
                        elif order_by == "subarea_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_subareamaster.name as subarea_name FROM dashboard_imagemaster LEFT JOIN dashboard_subareamaster on dashboard_subareamaster.id = dashboard_imagemaster.subarea_id_id WHERE  DATE(created_at) >= '" + str(user_date[0]['from_date']) + "'" + query + " ORDER BY subarea_name "+  sort_order 
                        
                        elif order_by == "status":
                            query = "SELECT dashboard_imagemaster.*, dashboard_statusmaster.name as status_name FROM dashboard_imagemaster LEFT JOIN dashboard_statusmaster on dashboard_statusmaster.id = dashboard_imagemaster.status_id WHERE  DATE(created_at) >= '" + str(user_date[0]['from_date']) + "'" + query + " ORDER BY status_name "+  sort_order

                        else:
                            query = "SELECT * FROM dashboard_imagemaster WHERE DATE(created_at) >= '" + str(user_date[0]['from_date']) + "'" + query
                            data_sort_field = order_by.replace("text-center", "").strip()
                            order_by_clause = " ORDER BY " + data_sort_field + " " + sort_order

                            # Append the ORDER BY clause to the base query
                            query = query + order_by_clause
                    else:
                        if order_by == "district_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_districtmaster.name as district_name FROM dashboard_imagemaster LEFT JOIN dashboard_districtmaster on dashboard_districtmaster.id = dashboard_imagemaster.district_id_id WHERE  DATE(created_at) <= '" + str(user_date[0]['to_date']) + "'" + query + " ORDER BY district_name "+  sort_order 

                        elif order_by == "subdistrict_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_subdistrictmaster.name as subdistrict_name FROM dashboard_imagemaster LEFT JOIN dashboard_subdistrictmaster on dashboard_subdistrictmaster.id = dashboard_imagemaster.subdistrict_id_id WHERE  DATE(created_at) <= '" + str(user_date[0]['to_date']) + "'" + query + " ORDER BY subdistrict_name "+  sort_order 

                        elif order_by == "city_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_citymaster.name as city_name FROM dashboard_imagemaster LEFT JOIN dashboard_citymaster on dashboard_citymaster.id = dashboard_imagemaster.city_id_id WHERE  DATE(created_at) <= '" + str(user_date[0]['to_date']) + "'" + query + " ORDER BY city_name "+  sort_order 
                        
                        elif order_by == "area_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_areamaster.name as area_name FROM dashboard_imagemaster LEFT JOIN dashboard_areamaster on dashboard_areamaster.id = dashboard_imagemaster.area_id_id WHERE  DATE(created_at) <= '" + str(user_date[0]['to_date']) + "'" + query + " ORDER BY area_name "+  sort_order 
                        
                        elif order_by == "subarea_id_id":
                            query = "SELECT dashboard_imagemaster.*, dashboard_subareamaster.name as subarea_name FROM dashboard_imagemaster LEFT JOIN dashboard_subareamaster on dashboard_subareamaster.id = dashboard_imagemaster.subarea_id_id WHERE  DATE(created_at) <= '" + str(user_date[0]['to_date']) + "'" + query + " ORDER BY subarea_name "+  sort_order 
                        
                        elif order_by == "status":
                            query = "SELECT dashboard_imagemaster.*, dashboard_statusmaster.name as status_name FROM dashboard_imagemaster LEFT JOIN dashboard_statusmaster on dashboard_statusmaster.id = dashboard_imagemaster.status_id WHERE  DATE(created_at) <= '" + str(user_date[0]['to_date']) + "'" + query + " ORDER BY status_name "+  sort_order

                        else:
                            query = "SELECT * FROM dashboard_imagemaster WHERE DATE(created_at) <= '" + str(user_date[0]['to_date']) + "'" + query
                            
                            data_sort_field = order_by.replace("text-center", "").strip()
                            order_by_clause = " ORDER BY " + data_sort_field + " " + sort_order

                            # Append the ORDER BY clause to the base query
                            query = query + order_by_clause
            else:
                
                if order_by == "district_id_id":
                    query = "SELECT dashboard_imagemaster.*, dashboard_districtmaster.name as district_name FROM dashboard_imagemaster LEFT JOIN dashboard_districtmaster on dashboard_districtmaster.id = dashboard_imagemaster.district_id_id WHERE YEAR(created_at) IN (" + str(current_year) + ")"+ query + " ORDER BY district_name "+  sort_order 

                elif order_by == "subdistrict_id_id":
                    query = "SELECT dashboard_imagemaster.*, dashboard_subdistrictmaster.name as subdistrict_name FROM dashboard_imagemaster LEFT JOIN dashboard_subdistrictmaster on dashboard_subdistrictmaster.id = dashboard_imagemaster.subdistrict_id_id WHERE YEAR(created_at) IN (" + str(current_year) + ")"+ query + " ORDER BY subdistrict_name "+  sort_order 

                elif order_by == "city_id_id":
                    query = "SELECT dashboard_imagemaster.*, dashboard_citymaster.name as city_name FROM dashboard_imagemaster LEFT JOIN dashboard_citymaster on dashboard_citymaster.id = dashboard_imagemaster.city_id_id WHERE YEAR(created_at) IN (" + str(current_year) + ")"+ query + " ORDER BY city_name "+  sort_order 
                
                elif order_by == "area_id_id":
                    query = "SELECT dashboard_imagemaster.*, dashboard_areamaster.name as area_name FROM dashboard_imagemaster LEFT JOIN dashboard_areamaster on dashboard_areamaster.id = dashboard_imagemaster.area_id_id WHERE YEAR(created_at) IN (" + str(current_year) + ")"+ query + " ORDER BY area_name "+  sort_order 
                
                elif order_by == "subarea_id_id":
                    query = "SELECT dashboard_imagemaster.*, dashboard_subareamaster.name as subarea_name FROM dashboard_imagemaster LEFT JOIN dashboard_subareamaster on dashboard_subareamaster.id = dashboard_imagemaster.subarea_id_id WHERE YEAR(created_at) IN (" + str(current_year) + ")"+ query + " ORDER BY subarea_name "+  sort_order 
                
                elif order_by == "status":
                    query = "SELECT dashboard_imagemaster.*, dashboard_statusmaster.name as status_name FROM dashboard_imagemaster LEFT JOIN dashboard_statusmaster on dashboard_statusmaster.id = dashboard_imagemaster.status_id WHERE YEAR(created_at) IN (" + str(current_year) + ")"+ query + " ORDER BY status_name "+  sort_order

                else:
                    query = "SELECT * FROM dashboard_imagemaster WHERE YEAR(created_at) IN  (" + str(current_year) + ")"+ query
                    data_sort_field = order_by.replace("text-center", "").strip()
                    order_by_clause = " ORDER BY " + data_sort_field + " " + sort_order

                    # Append the ORDER BY clause to the base query
                    query = query + order_by_clause


            if query.strip():  # Check if query is not empty or only whitespace  
                images = ImageMaster.objects.raw(query)
            else:
                print("Empty query")
        

        pages = request.GET.get('page_count',0)
        page_list = [10,20,50,100,500]

        
        if int(pages) in page_list:
            page_passed = pages
        else:
            page_passed = 10

        paginator = Paginator(images, page_passed)
        page_number = request.GET.get('page', 1)
        page_obj = paginator.get_page(page_number)

        range_status = Setting.objects.filter(name = "update_within_range_status").values("value")
        if range_status[0]["value"] == '1':
            range = Setting.objects.filter(name = "update_within_range").values("value")
            setting_range = range[0]['value']
        else:
            setting_range = 0
    
        
        context = {"listing_options_list":listing_options_list,"user_area":user_area,"user_city":user_city, 
                   "user_subdistrict":user_subdistrict,"user_district":user_district,"countries":countries, "states":states,"districts":districts,"subdistricts":subdistricts,
                   "cities":cities,"areas":areas,"allsubareas":allsubareas,"allareas":allareas,"allcities":allcities,
                   "allsubdistricts":allsubdistricts,"alldistricts":alldistricts,"subareas":subareas, "statuses":statuses,"img_list":img_list,
                "DRIVE_IMAGE_PATH":DRIVE_IMAGE_PATH, "title":"Location Listing","page_obj": page_obj,"paginator": paginator,"count": count,"search_for":search_for, "user_state":user_state,"company_data":get_company_data(),"range":setting_range,"order_by": order_by,"sort_order": sort_order}

        return render(request, 'menu/master/images/deletedata.html', context)

    
