from dashboard.models import *
from django.shortcuts import redirect, render
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import View
from django.contrib import messages
from django.db.models import Q
from nazox.settings import DRIVE_IMAGE_PATH
from datetime import datetime
from django.core.paginator import Paginator
from settings.views import get_company_data


# Create your views here.
class Userlocation(LoginRequiredMixin,View):
    def get(self, request):
        img_list = []
        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]
        

        images = UserLocation.objects.select_related('user').values(
            'id', 'user__first_name', 'user__last_name', 'user__username', 'user__groups__name',
            'state_id__name', 'district_id__name', 'subdistrict_id__name', 'city_id__name', 'area_id__name', 'subarea_id__name'
        ).order_by(order_by, '-id') if sort_order == 'asc' else UserLocation.objects.select_related('user').values(
            'id', 'user__first_name', 'user__last_name', 'user__username', 'user__groups__name',
            'state_id__name', 'district_id__name', 'subdistrict_id__name', 'city_id__name', 'area_id__name', 'subarea_id__name'
        ).order_by(f'-{order_by}', '-id')


        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)

        context = {
            "images": img_list,
            "DRIVE_IMAGE_PATH": DRIVE_IMAGE_PATH,
            "title": "User Location",
            "page_obj": page_obj,
            "paginator": paginator,
            "company_data": get_company_data(),
            "order_by": order_by,
            "sort_order": sort_order,
        }

        return render(request, 'menu/master/user_location/userlocationlist.html', context)


class AddUserlocation(LoginRequiredMixin,View):
    def get(self, request):
        users = User.objects.filter(is_superuser=False).values('first_name', 'last_name', 'id', 'groups__name').order_by('first_name')
        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')
        # subares = SubAreaMaster.objects.all().values('id','name').order_by('name')
        
        context = {"users":users,"countries":countries, "states":states, "title":"Add User Location","company_data":get_company_data()} 

        return render(request, 'menu/master/user_location/adduser_location.html', context)
    
    def post(self, request):
        if request.method == "POST":
            user = request.POST.get('username')
            user_id = User.objects.get(pk=user)
            
            state_id = request.POST.get('user_state')
            state = StateMaster.objects.get(id=state_id)


            district_id = request.POST.get('user_district')
            if district_id:
                district = DistrictMaster.objects.get(id=district_id)  
            else:
                district = None

            subdistrict_id = request.POST.get('user_subdistrict')
            if subdistrict_id:
                subdistrict = SubDistrictMaster.objects.get(id=subdistrict_id)
            else:
                subdistrict = None

            city_id = request.POST.get('user_city')
            if city_id:
                city = CityMaster.objects.get(id=city_id)
            else:
                city = None

            area_id = request.POST.get('user_area')
            if area_id:
                area = AreaMaster.objects.get(id=area_id)  
            else:
                area = None
            subarea_id = request.POST.get('user_subarea')
            if subarea_id:
                subarea = SubAreaMaster.objects.get(id=subarea_id)  

            else:
                subarea = None           
            if (user != '' and state != ''):

                UserLocation.objects.create(user= user_id,country_id = 1, state_id=state, district_id = district,subdistrict_id = subdistrict, city_id = city, area_id =area, subarea_id = subarea)

                return redirect('userlocation')
            else:
                # data = {}
                messages.error(request, "Some field is empty" )
                # return HttpResponse(data)
        else:
            return redirect('menu/master/user_location/adduser_location.html')  


class UpdateUserlocation(LoginRequiredMixin,View):
    def get(self, request,userid):

        location = {}
        user_location = UserLocation.objects.filter(id=userid).values('id','user','state_id', 'district_id','subdistrict_id', 'city_id', 'area_id', 'subarea_id','user__groups__name')
 
        
        
        location['user'] = user_location[0]['user']
        location['state_id'] = user_location[0]['state_id']
        location['district_id'] = user_location[0]['district_id']
        location['subdistrict_id'] = user_location[0]['subdistrict_id']
        location['city_id'] = user_location[0]['city_id']
        location['area_id'] = user_location[0]['area_id']
        location['subarea_id'] = user_location[0]['subarea_id']
       
        


        users = User.objects.all().values('first_name','last_name','username','id','groups__name').order_by('first_name')
        states = StateMaster.objects.filter(country_id = 1).values('id','name').order_by('name')
        districts = list(DistrictMaster.objects.filter(state_id = user_location[0]['state_id']).values('id','name'))

        if user_location[0]['district_id'] != '':
            subdistricts = list(SubDistrictMaster.objects.filter(district_id = user_location[0]['district_id']).values('id','name').order_by('name'))
        else:
            subdistricts = ''

        if user_location[0]['subdistrict_id'] != '':
            cities = list(CityMaster.objects.filter(subdistrict_id = user_location[0]['subdistrict_id']).values('id','name').order_by('name'))
        else:
            cities = ''
        if user_location[0]['city_id'] != '':
            areas = AreaMaster.objects.filter(city_id = user_location[0]['city_id']).values('id','name').order_by('name')

        else:   
            areas = ''
        if user_location[0]['area_id'] != '':
            subares = SubAreaMaster.objects.filter(area_id = user_location[0]['area_id']).values('id','name').order_by('name')
        else:
            subares=''

        

        
        context = {"users":users,"states":states,"districts": districts,"subdistricts": subdistricts, "cities":cities,"areas":areas, "subareas":subares,"user_location":location, "title":"Edit User Location","id":id,"company_data":get_company_data()} 

        return render(request,'menu/master/user_location/adduser_location.html', context)
    
    def post(self, request,userid):


        if request.method == "POST":
            user = request.POST.get('username')
            user_id = User.objects.get(pk=user)
            state = request.POST.get('user_state')
            district = request.POST.get('user_district')
            if district == '':
                district = None
            subdistrict = request.POST.get('user_subdistrict')
            if subdistrict == '':
                subdistrict = None
            city = request.POST.get('user_city')
            if city == '':
                city = None
            area = request.POST.get('user_area')
            if area == '':
                area = None
            subarea = request.POST.get('user_subarea')
            if subarea == '':
                subarea = None
           

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

                UserLocation.objects.filter(id=userid).update(user= user_id,country_id = 1, state_id=state, district_id = district,subdistrict_id = subdistrict, city_id = city, area_id =area, subarea_id = subarea)

                return redirect('userlocation')
            else:
                # data = {}
                messages.error(request, "Some field is empty" )
                # return HttpResponse(data)
        else:
            return redirect('menu/master/user_location/adduser_location.html')  
   

class DeleteUserlocation(LoginRequiredMixin,View):
    def get(self,request,userid):
        subarea = UserLocation.objects.filter(id=userid)
        subarea.delete()   
        return redirect('userlocation')
    
def viewimagelist(request):

    user_locations= UserLocation.objects.filter(user=request.user.id)
   
    country_list = list(user_locations.values_list('country_id',flat=True).distinct())
    state_list = list(user_locations.values_list('state_id',flat=True).distinct())
    district_list = list(user_locations.values_list('district_id',flat=True).distinct())
    city_list = list(user_locations.values_list('city_id',flat=True).distinct())
    area_list = list(user_locations.values_list('area_id',flat=True).distinct())
    subarea_list = list(user_locations.values_list('subarea_id',flat=True).distinct())

    countries = CountryMaster.objects.all().values('name','id').order_by('name')
    states = StateMaster.objects.all().values('id','name').order_by('name')
    statuses = StatusMaster.objects.all().values('id','name').order_by('order_by')


    img_list = []
    count = 0
    search_for = None

    user_state = request.GET.get('user_state',None)
    user_district = request.GET.get('user_district',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 = request.GET.get('image_date',None)
    status = request.GET.get('status',None)

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

    query = Q()
    state_query = Q()
    district_query = Q()
    city_query = Q()
    area_query = Q()
    subarea_query = Q()

    images = []

    if user_state:
        query &= (Q(state_id=user_state))
       
    if user_district:
        query &= (Q(district_id=user_district))

    if user_city:
        query &= (Q(city_id=user_city))
    
    if user_area:
        query &= (Q(area_id=user_area))
    
    if subarea:
        query &= (Q(subarea_id=subarea))

    if round:
        query &= (Q(round=round))

    if status:
        query &= (Q(status_id=status))

    if image_date:
        query &= (Q(image_date=image_date))



    if not request.user.is_superuser:

        user_locations= UserLocation.objects.filter(user=request.user.id)

        if user_locations.first() is not None:
            
            country_list = list(user_locations.values_list('country_id',flat=True).distinct())
            state_list = list(user_locations.values_list('state_id',flat=True).distinct())
            district_list = list(user_locations.values_list('district_id',flat=True).distinct())
            city_list = list(user_locations.values_list('city_id',flat=True).distinct())
            area_list = list(user_locations.values_list('area_id',flat=True).distinct())
            subarea_list = list(user_locations.values_list('subarea_id',flat=True).distinct())


            if state_list != [] and state_list != ['']:
                query &= (Q(state_id__in=state_list))      
            elif user_state in state_list:
                query &= (Q(state_id=user_state))

            if district_list != [] and district_list != ['']:
                query &= (Q(district_id__in=district_list))
            elif user_district in district_list:
                query &= (Q(district_id=user_district))
           
            if city_list != [] and city_list != ['']:
                query &= (Q(city_id__in=city_list))
            elif user_city in city_list:
                query &= (Q(city_id=user_city))

            if area_list != [] and area_list != ['']:
                query &= (Q(area_id__in=area_list))
            elif user_area in area_list:
                query &= (Q(area_id=user_area))
             
            if subarea_list != [] and subarea_list != ['']:
                query &= (Q(subarea_id__in=subarea_list))
            elif subarea in subarea_list:
                query &= (Q(subarea_id=subarea))



            images = ImageMaster.objects.filter(query).values('id','state_id', 'district_id', 'city_id', 'area_id', 'subarea_id', 'image_date','latitude','longitude', 'altitude', 'round', 'status_id', 'drive_image_id').order_by('id')
            
    else:

        images = ImageMaster.objects.filter(query).values('id','state_id', 'district_id', 'city_id', 'area_id', 'subarea_id', 'image_date','latitude','longitude', 'altitude', 'round', 'status_id', 'drive_image_id').order_by('id')

    for img in images:
        image_data = {}
        image_data["id"]=img['id']
        state = StateMaster.objects.filter(id=img['state_id']).values('name')
        image_data["state"]= state[0]['name'] 
        district = DistrictMaster.objects.filter(id=img['district_id']).values('name')
        image_data["district"]= district[0]['name'] 
        city = CityMaster.objects.filter(id=img['city_id']).values('name')
        image_data["city"]= city[0]['name']
        area = AreaMaster.objects.filter(id=img['area_id']).values('name')
        image_data["area"]= area[0]['name']
        subarea = SubAreaMaster.objects.filter(id=img['subarea_id']).values('name')
        image_data["subarea"]= subarea[0]['name']
        status = StatusMaster.objects.filter(id = img['status_id']).values('order_by')

        image_data["status"]= status[0]['name']
        image_data["latitude"] = img['latitude']
        image_data["longitude"] = img['longitude']
        image_data["altitude"] = img['altitude']
        image_data["round"] = img['round']
        image_data["image_date"]= datetime.strptime(str(img['image_date']),'%Y-%m-%d').date()
        image_data["image_id"]=img['drive_image_id']

        img_list.append(image_data)

    count = len(images)

    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

    count = len(images)

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

    context = {"countries":countries, "states":states,"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()}

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


