from django.shortcuts import redirect, render
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponse
from .models import *
from django.contrib import messages
from django.shortcuts import get_object_or_404
from django.core.paginator import Paginator
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from settings.views import get_company_data
from django.db.models import ProtectedError

class StatesView(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]
        states = StateMaster.objects.all().order_by(order_by)

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

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

        count = len(states)
        paginator = Paginator(states, 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": "States",
            "company_data": get_company_data(),
            "order_by": order_by,
            "sort_order": sort_order,
        }

        return render(request, 'menu/master/state/showstate.html', context)



class CreateState(LoginRequiredMixin,View):
    def get(self, request):
       
        context = {'title':"Add State","company_data":get_company_data()}

        return render(request, 'menu/master/state/createstate.html', context)

    def post(self, request):
        if request.method == "POST":
            country = CountryMaster.objects.get(id=1)
            state = request.POST.get('user_state')
            value = state.lower()

            if (state != '' and state != ''):

                if StateMaster.objects.filter(value=value).exists():
                    messages.error(request, "State Name Is Already Exists" )
                    return redirect(request.META['HTTP_REFERER'])

                else:

                    # state_obj = StateMaster.objects.get(id=state)
                    StateMaster.objects.create(name=state,value=value,country=country)
                    # data = {'success_message': "Successfully Added"}
                   
                    return redirect('states')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                messages.error(request, "Some field is empty" )
                return redirect(request.META['HTTP_REFERER'])
        else:
            return redirect('menu/master/state/createstate.html')



class UpdateState(LoginRequiredMixin,View):

    def get(self, request, id):

        states = StateMaster.objects.filter(id=id).values('name','id')

        context = {"id":id, "states":states[0], "title":"Edit State","company_data":get_company_data()}
        return render(request, 'menu/master/state/createstate.html', context)
    
    # @csrf_exempt
    def post(self, request, id):
        if request.method == "POST":

            state = request.POST.get('user_state')
            value = state.lower()

            if (state != ''):

                if StateMaster.objects.filter(value=value).exists():


                    data = {}
                    data['error_message'] = 'State Name Is Already Exists'
                    messages.error(request, "State Name Is Already Exists" )
                  
                    return redirect(request.META['HTTP_REFERER'])
                
                else:
                    StateMaster.objects.filter(id=id).update(name=state,value=value)
                    return redirect('states')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data['error_message'])
        else:
            return redirect('menu/master/state/createstate.html')
        
class DeleteState(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            state = StateMaster.objects.get(id=id)
            state.delete()
            messages.success(request, "State deleted successfully.")
        except StateMaster.DoesNotExist:
            messages.error(request, "State 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 state because it is referenced by the following {', '.join(protected_models)}: {', '.join(map(str, protected_ids))}."
            )
        return redirect('states')
        


class DistrictsView(LoginRequiredMixin, View):
    def get(self, request):
        pages = request.GET.get('page_count',0)
        page_list = [10,20,50,100,500]
        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
        

        if sort_order == 'asc':
               
            districts = DistrictMaster.objects.all().values('id','state__name','name','value','code').order_by(order_by, 'id')
        else:
            districts = DistrictMaster.objects.all().values('id','state__name','name','value','code').order_by(f'-{order_by}', '-id')
   

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


        count = len(districts)
        paginator = Paginator(districts, 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 = (int(page_number) - 1) * int(page_passed)

        # Add serial numbers to each state in the current page
        for index, district in enumerate(page_obj):
            district['serial_number'] = serial_number + index + 1
            district['count'] = count
    

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

        return render(request, 'menu/master/district/showdistrict.html', context)

class CreateDistrict(LoginRequiredMixin,View):
    def get(self, request):
        countries = CountryMaster.objects.all().values('id','name').order_by('name')
        states = StateMaster.objects.all().values('id','name').order_by('name')
        context = {"countries": countries,"states":states,'title':"Add District","company_data":get_company_data()}

        return render(request, 'menu/master/district/createdistrict.html', context)

    def post(self, request):
        if request.method == "POST":
            state = request.POST.get('user_state')
            district = request.POST.get('district')
            value = district.lower()

            if (state != '' and district != ''):

                if DistrictMaster.objects.filter(value=value).exists():
                    messages.error(request, "District Name Is Already Exists" )
                    return redirect(request.META['HTTP_REFERER'])

                else:

                    # state_obj = StateMaster.objects.get(id=state)
                    DistrictMaster.objects.create(state_id=state,name=district,value=value)
                    # data = {'success_message': "Successfully Added"}
                    messages.success(request, "Successfully Added" )
                    return redirect('districts')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                messages.error(request, "Some field is empty" )
                return redirect(request.META['HTTP_REFERER'])
        else:
            return redirect('menu/master/district/createdistrict.html')



class UpdateDistrict(LoginRequiredMixin,View):

    def get(self, request, id):

        district ={}

        districts = DistrictMaster.objects.filter(id=id).values('state_id','state__name','name','value','code')
        states = StateMaster.objects.all().values('name','id')

        district['state_id'] = districts[0]['state_id']
        district['state__name'] = districts[0]['state__name']
        district['name'] = districts[0]['name']
        district['value'] = districts[0]['value']
        district['code'] = districts[0]['code']

        context = {"districts": district, "id":id, "states":states, "title":"Edit District","company_data":get_company_data()}
        return render(request, 'menu/master/district/createdistrict.html', context)
    
    # @csrf_exempt
    def post(self, request, id):
        if request.method == "POST":

            state = request.POST.get('user_state')
            district = request.POST.get('district')
            value = district.lower()

            if (state != '' and district != ''):

                if DistrictMaster.objects.filter(value=value).exists():


                    data = {}
                    data['error_message'] = 'District Name Is Already Exists'
                    messages.error(request, "District Name Is Already Exists" )
                  
                    return redirect(request.META['HTTP_REFERER'])
                
                else:
                    DistrictMaster.objects.filter(id=id).update(state_id = state,name=district,value=value)
                    return redirect('districts')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data['error_message'])
        else:
            return redirect('menu/master/district/createdistrict.html')
        
class DeleteDistrict(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            district = DistrictMaster.objects.get(id=id)
            district.delete()
            messages.success(request, "District deleted successfully.")
        except DistrictMaster.DoesNotExist:
            messages.error(request, "District 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 district because it is referenced by the following {', '.join(protected_models)}: {', '.join(map(str, protected_ids))}."
            )
        return redirect('districts')
        


class SubDistrictsView(LoginRequiredMixin, View):
    def get(self, request):
        pages = request.GET.get('page_count',0)
        page_list = [10,20,50,100,500]
        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
        

        if sort_order == 'asc':
               
           subdistricts = SubDistrictMaster.objects.all().values('id','district__name','district__state__name','name','value','code').order_by(order_by, 'id')
        else:
            subdistricts = SubDistrictMaster.objects.all().values('id','district__name','district__state__name','name','value','code').order_by(f'-{order_by}', '-id')
    

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


        count = len(subdistricts)
        paginator = Paginator(subdistricts, 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 = (int(page_number) - 1) * int(page_passed)

        # Add serial numbers to each state in the current page
        for index, subdistrict in enumerate(page_obj):
            subdistrict['serial_number'] = serial_number + index + 1
            subdistrict['count'] = count
        

        context = {"subdistricts": subdistricts,"page_obj":page_obj,"title":"Sub Districts","company_data":get_company_data()}

        return render(request, 'menu/master/subdistrict/showsubdistrict.html', context)
    

    

class CreateSubDistrict(LoginRequiredMixin, View):
    def get(self, request):
        states = StateMaster.objects.all().values('id','name').order_by('name')
        districts =  DistrictMaster.objects.all().values('id','name').order_by('name')
        subdistricts =  SubDistrictMaster.objects.all().values('id','name').order_by('name')
        
        context = {"states":states,"districts": districts,"subdistricts":subdistricts, "title":"Add Sub District","company_data":get_company_data()} 

        return render(request, 'menu/master/subdistrict/createsubdistrict.html', context)

    def post(self, request):
        if request.method == "POST":
            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            subdistrict = request.POST.get('subdistrict')
            value = subdistrict.lower()
            code = request.POST.get('code')

            if (state != '' and district != '' and code != '' and subdistrict !=''):

                if SubDistrictMaster.objects.filter(value=value).exists():
                    data = {}
                    data['error_message'] = 'Sub District Name Is Already Exists'
                    messages.error(request, "Sub District Name Is Already Exists" )
                  
                    return redirect(request.META['HTTP_REFERER'])
                
                else:
                    d_id = DistrictMaster.objects.filter(id=district).values('id')
                    SubDistrictMaster.objects.create(district_id=d_id[0]["id"],name=subdistrict,code=code,value=value)
                    data = {'success_message': "Successfully Added"}
                    messages.success(request, "Successfully Added" )
                    return redirect("subdistricts")
                    # return redirect('districts')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                # return HttpResponse(data['error_message'])
                messages.error(request, "Some field is empty" )
                return redirect(request.META['HTTP_REFERER'])
        else:
            return redirect('menu/master/subdistrict/createsubdistrict.html')


class UpdateSubDistrict(LoginRequiredMixin,View):

    def get(self, request, id):
        subdistricts={}
        states = StateMaster.objects.all().values('id','name').order_by('name')
        districts = DistrictMaster.objects.all().values('id','name').order_by('name')
        subdistrict = SubDistrictMaster.objects.filter(id=id).values('district_id','district__name','district__state__name','district__state__id','name','value','code')

        subdistricts['district_id'] = subdistrict[0]['district_id']
        subdistricts['district__name'] = subdistrict[0]['district__name']
        subdistricts['district__state__name'] = subdistrict[0]['district__state__name']
        subdistricts['district__state__id'] = subdistrict[0]['district__state__id']
        subdistricts['name'] = subdistrict[0]['name']
        subdistricts['value'] = subdistrict[0]['value']
        subdistricts['code'] = subdistrict[0]['code']
        
        context = {"states":states, "districts":districts,"id":id, "subdistricts": subdistricts, 'title':"Edit City","company_data":get_company_data()}
        return render(request, 'menu/master/subdistrict/createsubdistrict.html', context)
    

    def post(self, request, id):
        if request.method == "POST":

            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            subdistrict = request.POST.get('subdistrict')
            value = subdistrict.lower()


            if (state != '' and district != ''and subdistrict!= ''):

                if SubDistrictMaster.objects.filter(value=value).exists():
                    data = {}
                    SubDistrictMaster.objects.filter(id=id).update(name=subdistrict)
                    # data['error_message'] = 'City Name Is Already Exists'
                    return redirect('subdistricts')

                    # return HttpResponse(data)
                else:

                    SubDistrictMaster.objects.filter(id=id).update(name=subdistrict,value=value)
                    data = {'success_message': "Successfully Updated"}

                    return redirect('subdistricts')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data)
        else:
            return redirect('menu/master/city/createcity.html')



class DeleteSubDistrict(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            subdistrict = SubDistrictMaster.objects.get(id=id)
            subdistrict.delete()
            messages.success(request, "Subdistrict deleted successfully.")
        except SubDistrictMaster.DoesNotExist:
            messages.error(request, "Subdistrict 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 subdistrict because it is referenced by the following {', '.join(protected_models)}: {', '.join(map(str, protected_ids))}."
            )
        return redirect('subdistricts')   

class CitiesView(LoginRequiredMixin, View):
    def get(self, request):
        pages = request.GET.get('page_count',0)
        page_list = [10,20,50,100,500]
        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
        

        if sort_order == 'asc':
               
           cities = CityMaster.objects.all().values('id','subdistrict__name','subdistrict__district__name','subdistrict__district__state__name','name','value','code').order_by(order_by, 'id')
        else:
           cities = CityMaster.objects.all().values('id','subdistrict__name','subdistrict__district__name','subdistrict__district__state__name','name','value','code').order_by(f'-{order_by}', '-id')
        

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


        count = len(cities)
        paginator = Paginator(cities, 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 = (int(page_number) - 1) * int(page_passed)

        # Add serial numbers to each state in the current page
        for index, city in enumerate(page_obj):
            city['serial_number'] = serial_number + index + 1
            city['count'] = count
        

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

        return render(request, 'menu/master/city/showcity.html', context)

class CreateCity(LoginRequiredMixin,View):
    def get(self, request):
        states = StateMaster.objects.all().values('id','name').order_by('name')
        districts =  DistrictMaster.objects.all().values('id','name').order_by('name')
        subdistricts =  SubDistrictMaster.objects.all().values('id','name').order_by('name')
        
        context = {"states":states,"districts": districts,"subdistricts":subdistricts, "title":"Add City","company_data":get_company_data()} 

        return render(request, 'menu/master/city/createcity.html', context)
    
    def post(self, request):
        if request.method == "POST":
            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            subdistrict = request.POST.get('user_subdistrict')
            city = request.POST.get('city')
            value = city.lower()
            code = request.POST.get('code')

            if (state != '' and district != '' and code != '' and city !=''):

                if CityMaster.objects.filter(value=value).exists():
                    data = {}
                    data['error_message'] = 'City Name Is Already Exists'
                    messages.error(request, "City Name Is Already Exists" )
                  
                    return redirect(request.META['HTTP_REFERER'])
                
                else:
                    sd_id = SubDistrictMaster.objects.get(id=subdistrict)
                    CityMaster.objects.create(subdistrict=sd_id,name=city,code=code,value=value)
                    data = {'success_message': "Successfully Added"}
                    messages.success(request, "Successfully Added" )
                    return redirect("cities")
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                # return HttpResponse(data['error_message'])
                messages.error(request, "Some field is empty" )
                return redirect(request.META['HTTP_REFERER'])
        else:
            return redirect('menu/master/city/createcity.html')
        
class UpdateCity(LoginRequiredMixin,View):

    def get(self, request, id):
        city={}
        states = StateMaster.objects.all().values('id','name').order_by('name')
        districts = DistrictMaster.objects.all().values('id','name').order_by('name')
        subdistricts = SubDistrictMaster.objects.all().values('id','name').order_by('name')
        cities = CityMaster.objects.filter(id=id).values('subdistrict_id','subdistrict__name','subdistrict__district__name','subdistrict__district__id','subdistrict__district__state__name','subdistrict__district__state__id','name','value','code')
        
        city['subdistrict_id'] = cities[0]['subdistrict_id']
        city['subdistrict__name'] = cities[0]['subdistrict_id']
        city['district_id'] = cities[0]['subdistrict__district__id']
        city['district__name'] = cities[0]['subdistrict__district__name']
        city['district__state__name'] = cities[0]['subdistrict__district__state__name']
        city['district__state__id'] = cities[0]['subdistrict__district__state__id']
        city['name'] = cities[0]['name']
        city['value'] = cities[0]['value']
        city['code'] = cities[0]['code']
        
        context = {"states":states, "districts":districts,"subdistricts":subdistricts,"id":id, "city": city, 'title':"Edit City","company_data":get_company_data()}
        return render(request, 'menu/master/city/createcity.html', context)
    
    def post(self, request, id):
        if request.method == "POST":

            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            subdistrict = request.POST.get('user_subdistrict')
            city = request.POST.get('city')
            value = city.lower()

            if (state != '' and district != ''and city!= '' and subdistrict!=''):

                if CityMaster.objects.filter(value=value).exists():
                    data = {}
                    CityMaster.objects.filter(id=id).update(name=city,value=value,subdistrict=subdistrict)
                    # data['error_message'] = 'City Name Is Already Exists'
                    return redirect('cities')

                    # return HttpResponse(data)
                else:

                    CityMaster.objects.filter(id=id).update(name=city,value=value,subdistrict=subdistrict)
                    data = {'success_message': "Successfully Updated"}

                    return redirect('cities')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data)
        else:
            return redirect('menu/master/city/createcity.html')

class DeleteCity(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            city = CityMaster.objects.get(id=id)
            city.delete()
            messages.success(request, "City deleted successfully.")
        except CityMaster.DoesNotExist:
            messages.error(request, "City 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 city because it is referenced by the following {', '.join(protected_models)}: {', '.join(map(str, protected_ids))}."
            )
        return redirect('cities')


class AreasView(LoginRequiredMixin, View):
    def get(self, request):
        pages = request.GET.get('page_count',0)
        page_list = [10,20,50,100,500]
        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
        

        if sort_order == 'asc':
               
           areas = AreaMaster.objects.all().values('id','city__id','city__name','city__subdistrict__name',  'city__subdistrict__district__name','city__subdistrict__district__state__name','name','pincode').order_by(order_by, 'id')
        else:
            areas = AreaMaster.objects.all().values('id','city__id','city__name','city__subdistrict__name',  'city__subdistrict__district__name','city__subdistrict__district__state__name','name','pincode').order_by(f'-{order_by}', '-id')
        
        if int(pages) in page_list:
            page_passed = pages
        else:
            page_passed = 10


        count = len(areas)
        paginator = Paginator(areas, 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 = (int(page_number) - 1) * int(page_passed)

        # Add serial numbers to each state in the current page
        for index, area in enumerate(page_obj):
            area['serial_number'] = serial_number + index + 1
            area['count'] = count
 
        context = {"areas": areas,"page_obj":page_obj,"title":"Areas","company_data":get_company_data(), "order_by": order_by,"sort_order": sort_order}

        return render(request, 'menu/master/area/showarea.html', context)

class CreateArea(LoginRequiredMixin,View):
    def get(self, request):
        states = StateMaster.objects.all().values('id','name').order_by('name')
        districts =  DistrictMaster.objects.all().values('id','name').order_by('name')
        subdistricts =  SubDistrictMaster.objects.all().values('id','name').order_by('name')
        cities =  CityMaster.objects.all().values('id','name').order_by('name')
       
        context = {"states":states,"districts": districts,"subdistricts":subdistricts, "cities":cities, "title":"Add Area","company_data":get_company_data()} 

        return render(request, 'menu/master/area/createarea.html', context)
    
    def post(self, request):
        if request.method == "POST":
            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            city = request.POST.get('user_city')
            area = request.POST.get('area')
            value = area.lower()
            pincode = request.POST.get('pincode')

            if (state != '' and district != '' and area != ''):

                if AreaMaster.objects.filter(value=value).exists():
                    # data = {}
                    messages.error(request, "Area Name Is Already Exists" )
                    return redirect(request.META['HTTP_REFERER'])

                else:
                    AreaMaster.objects.create(city_id=city,name=area,pincode=pincode,value=value)
                    data = {'success_message': "Successfully Added"}
                    messages.success(request, "Successfully Added" )
                    # data = {'success_message': "Successfully Added"}

                    return redirect('areas')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data)
        else:
            return redirect('menu/master/area/createarea.html')    


class UpdateArea(View):

    def get(self, request, id):

        area={}
        states = StateMaster.objects.all().values('id','name').order_by('name')
        districts = DistrictMaster.objects.all().values('id','name').order_by('name')
        subdistricts = SubDistrictMaster.objects.all().values('id','name').order_by('name')
        cities = CityMaster.objects.all().values('id','name').order_by('name')
        areas = AreaMaster.objects.filter(id=id).values('id','city__id','city__name','city__subdistrict__id',  'city__subdistrict__district__name','city__subdistrict__district__id','city__subdistrict__district__state__id','name','pincode','value')



        area['city_id'] = areas[0]['city__id']
        area['city__name'] = areas[0]['city__name']
        area['city__subdistrict__id'] = areas[0]['city__subdistrict__id']
        area['city__district__id'] = areas[0]['city__subdistrict__district__id']
        area['city__district__state__id'] = areas[0]['city__subdistrict__district__state__id']
        area['name'] = areas[0]['name']
        area['value'] = areas[0]['value']
        area['pincode'] = areas[0]['pincode']
        context = {"states":states, "districts":districts,"subdistricts":subdistricts, "cities":cities, "area": area,"id":id, 'title':"Edit Area","company_data":get_company_data()}
        
        return render(request, 'menu/master/area/createarea.html', context)
    
    def post(self, request, id):
        if request.method == "POST":

            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            city = request.POST.get('user_city')
            area = request.POST.get('area')
            value = area.lower()
            pincode = request.POST.get('pincode')

            if (state != '' and district != ''and city!= '' and area != ''):

                if AreaMaster.objects.filter(value=value).exists():
                    AreaMaster.objects.filter(id=id).update(name=area,pincode=pincode)
                    
                    return redirect('areas')
                else:
                
                    AreaMaster.objects.filter(id=id).update(city_id=city,name=area, pincode=pincode,value=value)
                    data = {'success_message': "Successfully Updated"}

                    return redirect('areas')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data)
        else:
            return redirect('menu/master/area/createarea.html')

class DeleteArea(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            area = AreaMaster.objects.get(id=id)
            area.delete()
            messages.success(request, "Area deleted successfully.")
        except AreaMaster.DoesNotExist:
            messages.error(request, "Area 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 area because it is referenced by the following {', '.join(protected_models)}: {', '.join(map(str, protected_ids))}."
            )
        return redirect('areas')
    

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

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

        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
        

        if sort_order == 'asc':
               
           subareas = SubAreaMaster.objects.all().values('id','area_id','area__name','area__city__name', 'area__city__subdistrict__name',  'area__city__subdistrict__district__name','area__city__subdistrict__district__state__name','name').order_by(order_by, 'id')
        else:
            subareas = SubAreaMaster.objects.all().values('id','area_id','area__name','area__city__name', 'area__city__subdistrict__name',  'area__city__subdistrict__district__name','area__city__subdistrict__district__state__name','name').order_by(f'-{order_by}', '-id')

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


        count = len(subareas)
        paginator = Paginator(subareas, 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 = (int(page_number) - 1) * int(page_passed)

        # Add serial numbers to each state in the current page
        for index, subarea in enumerate(page_obj):
            subarea['serial_number'] = serial_number + index + 1
            subarea['count'] = count
        
        context = {"subareas": subareas,"page_obj":page_obj,"title":"Sub Areas","company_data":get_company_data(),"order_by": order_by,"sort_order": sort_order,}

        return render(request, 'menu/master/subarea/showsubarea.html', context)
class CreateSubArea(LoginRequiredMixin,View):
    def get(self, request):
        states = StateMaster.objects.all().values('id','name').order_by('name')
        districts =  DistrictMaster.objects.all().values('id','name').order_by('name')
        subdistricts =  SubDistrictMaster.objects.all().values('id','name').order_by('name')
        cities =  CityMaster.objects.all().values('id','name').order_by('name')
        areas =  AreaMaster.objects.all().values('id','name').order_by('name')
        context = {"states":states,"districts": districts,"subdistricts":subdistricts, "cities":cities,"areas":areas ,"title":"Add Sub Area","company_data":get_company_data()} 

        return render(request, 'menu/master/subarea/createsubarea.html', context)
    
    def post(self, request):
        if request.method == "POST":
            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            city = request.POST.get('user_city')
            area = request.POST.get('user_area')
            subarea = request.POST.get('subarea')
            ground_rep_name = request.POST.get('ground_rep_name')
            ground_rep_number = request.POST.get('ground_rep_number')
            drone_rep_name = request.POST.get('drone_rep_name')
            drone_rep_number = request.POST.get('drone_rep_number')

            value = subarea.lower()

            if (state != '' and district != '' and city != '' and area != '' and subarea != ''):

                if SubAreaMaster.objects.filter(value=value,area=area).exists():
                    # data = {}
                    messages.error(request, "SubArea Name Is Already Exists" )
                    return redirect(request.META['HTTP_REFERER'])
                else:
                    SubAreaMaster.objects.create(area_id=area,name=subarea,value=value,ground_rep_name=ground_rep_name,ground_rep_number=ground_rep_number,drone_rep_name=drone_rep_name,drone_rep_number=drone_rep_number)
                    data = {'success_message': "Successfully Added"}
                    messages.success(request, "Successfully Added" )

                    return redirect('subareas')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data)
        else:
            return redirect('menu/master/subarea/createsubarea.html')    

class UpdateSubArea(LoginRequiredMixin,View):

    def get(self, request, id):
        subarea = {}
        countries = CountryMaster.objects.all().values('name','id').order_by('name')
        states = StateMaster.objects.all().values('id','name').order_by('name')
        districts = DistrictMaster.objects.all().values('id','name').order_by('name')
        subdistricts = SubDistrictMaster.objects.all().values('id','name').order_by('name')
        cities = CityMaster.objects.all().values('id','name').order_by('name')
        areas = AreaMaster.objects.all().values('id','name').order_by('name')
        subareas = SubAreaMaster.objects.filter(id=id).values('area_id', 'area__name','area__city__id','area__city__subdistrict__id','area__city__subdistrict__district__id','area__city__subdistrict__district__state__id','name','value','ground_rep_name','ground_rep_number','drone_rep_name','drone_rep_number')
        
        
        subarea['area_id'] = subareas[0]['area_id']
        subarea['area__name'] = subareas[0]['area__name']
        subarea['area__city__id'] = subareas[0]['area__city__id']
        subarea['area__city__subdistrict__id'] = subareas[0]['area__city__subdistrict__id']
        subarea['area__city__district__id'] = subareas[0]['area__city__subdistrict__district__id']
        subarea['area__city__district__state__id'] = subareas[0]['area__city__subdistrict__district__state__id']
        subarea['name'] = subareas[0]['name']
        subarea['value'] = subareas[0]['value']
        subarea['ground_rep_name'] = subareas[0]['ground_rep_name']
        subarea['ground_rep_number'] = subareas[0]['ground_rep_number']
        subarea['drone_rep_name'] = subareas[0]['drone_rep_name']
        subarea['drone_rep_number'] = subareas[0]['drone_rep_number']
        context = {"countries":countries, "states":states, "districts":districts,"subdistricts":subdistricts, "cities":cities, "areas": areas,'subarea':subarea,"id":id ,'title':"Edit Sub Area","company_data":get_company_data()}

        return render(request, 'menu/master/subarea/createsubarea.html', context)
    
    def post(self, request, id):
        if request.method == "POST":
            
            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            city = request.POST.get('user_city')
            area = request.POST.get('user_area')
            subarea = request.POST.get('subarea')
            ground_rep_name = request.POST.get('ground_rep_name')
            ground_rep_number = request.POST.get('ground_rep_number')
            drone_rep_name = request.POST.get('drone_rep_name')
            drone_rep_number = request.POST.get('drone_rep_number')
            value = subarea.lower()

            if (state != '' and district != ''and city!= '' and area != ''and subarea != ''):

                if SubAreaMaster.objects.filter(value=value).exists():
                    SubAreaMaster.objects.filter(id=id).update(area_id=area,name=subarea,value=value,ground_rep_name=ground_rep_name,ground_rep_number=ground_rep_number,drone_rep_name=drone_rep_name,drone_rep_number=drone_rep_number)

                    return redirect('subareas')
                else:
                    SubAreaMaster.objects.filter(id=id).update(area_id=area,name = subarea,value=value)
                    data = {'success_message': "Successfully Updated"}

                    return redirect('subareas')
            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data)
        else:
            return redirect('menu/master/subarea/createsubarea.html')

class DeleteSubArea(LoginRequiredMixin, View):
    def get(self, request, id):
        try:
            subarea = SubAreaMaster.objects.get(id=id)
            user_locations = UserLocation.objects.filter(subarea_id=id)
            if user_locations.exists():
                user_locations.delete()
                messages.success(request, "User locations associated with the subarea have been deleted.")
            subarea.delete()
            messages.success(request, "Subarea deleted successfully.")
        except SubAreaMaster.DoesNotExist:
            messages.error(request, "Subarea 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 subarea because it is referenced by the following {', '.join(protected_models)}: {', '.join(map(str, protected_ids))}."
            )
        return redirect('subareas')
    


def load_states(request):
    country_id = request.GET.get('country_id')
    states = StateMaster.objects.filter(country=country_id).order_by('name')
    return render(request, 'menu/master/dropdowns/state_dropdown_list_options.html', {'states': states})

def load_district(request):
    state_id = request.GET.get('state_id')
    district = DistrictMaster.objects.filter(state=state_id).order_by('name')
    return render(request, 'menu/master/dropdowns/district_dropdown_list_options.html', {'districts': district})

def load_subdistrict(request):
    district_id = request.GET.get('district_id')
    subdistrict = SubDistrictMaster.objects.filter(district=district_id).order_by('name')
    return render(request, 'menu/master/dropdowns/subdistrict_dropdown_list_options.html', {'subdistricts': subdistrict})

def load_cities(request):
    subdistrict_id = request.GET.get('subdistrict_id')
    cities = CityMaster.objects.filter(subdistrict=subdistrict_id).order_by('name')
    return render(request, 'menu/master/dropdowns/city_dropdown_list_options.html', {'cities': cities})


def load_area(request):
    city_id = request.GET.get('city_id')
    area = AreaMaster.objects.filter(city=city_id).order_by('name')
    return render(request, 'menu/master/dropdowns/area_dropdown_list_options.html', {'areas': area})


def load_subarea(request):
    area_id = request.GET.get('area_id')
    subarea = SubAreaMaster.objects.filter(area=area_id).order_by('name')
    return render(request, 'menu/master/dropdowns/subarea_dropdown_list_options.html', {'subareas': subarea})




