from django.http import request
from django.shortcuts import redirect, render
from django.views import View
from django.contrib.auth.models import User
# from templates.menu import *
from django.core.exceptions import ObjectDoesNotExist
from django.http import JsonResponse, HttpResponse
from django.contrib.auth.mixins import LoginRequiredMixin
from .forms import addUserForm
from django.contrib.auth.models import Group
from django.core.paginator import Paginator
from .models import *
# from django.views.decorators.csrf import csrf_exempt
from settings.views import get_company_data
import json
# import datetime
from datetime import datetime
from nazox.settings import MAP_API_KEY

class adduserForm(View):
    def get(self, request):
        user = User.objects.filter(id=request.user.id).values('groups__id', 'groups__name')
        greeting = {}
        greeting['form'] = addUserForm
        greeting['title'] ="Add User"
        if user[0]['groups__name'] == 'Operational Head':
            status_ids = [2, 3] 
            g_data = Group.objects.filter(id__in=status_ids).values('id','name').order_by('name')

        else:
            g_data = Group.objects.all()
        
        greeting['gdata'] = g_data
        greeting['company_data'] = get_company_data()

        return render(request, 'menu/create.html', greeting)

    def post(self, request):
        if request.method == "POST":
            user_id = User.objects.filter(id=request.user.id).values('id')
            firstname = request.POST.get('first_name')
            lastname = request.POST.get('last_name')
            email = request.POST.get('email')
            username = request.POST.get('username')
            password = request.POST.get('password1')
            password1 = request.POST.get('password2')
            userrole = request.POST.get('user_group')
            group = Group.objects.get(id = userrole)
            user_date_from = request.POST.get('user_date_from')
            user_date_to = request.POST.get('user_date_to')
            status = request.POST.get('status')
        

            if (email != '' and username != '' and password != '' and password1 != ''):
                if User.objects.filter(username=username).exists():
                    data = {}
                    data['error_message'] = 'Username Is Already Exists'

                    return HttpResponse(data)
                elif User.objects.filter(email=email).exists():
                    data = {}
                    data['error_message'] = 'Email Is Already Exists'

                    return HttpResponse(data)
                elif (password == password1):
                    user = User.objects.create_user(
                        first_name=firstname,
                        last_name=lastname,
                        username=username, email=email, password=password)
                    user = User.objects.get(username=username)
                    user.groups.add(group)
                    user.is_active = status
                    if group.name == "Admin":
                        user.is_superuser = True
                    user.save()
                    if user_date_from or user_date_to:
                        if user_date_from and user_date_to == "":
                            user_add = UserInfo.objects.create(created_by=user_id[0]['id'],from_date=user_date_from,to_date=None,user=user,password=password)
                        elif user_date_to  and user_date_from == ""  :
                            user_add = UserInfo.objects.create(created_by=user_id[0]['id'],from_date=None,to_date=user_date_to,user=user,password=password)
                        else:
                            user_add = UserInfo.objects.create(created_by=user_id[0]['id'],from_date=user_date_from,to_date=user_date_to,user=user,password=password)
                    else:
                        user_add = UserInfo.objects.create(created_by=user_id[0]['id'],user=user,password=password)

                    user_add.save()
                    data = {
                        'success_message': "Successfully registered"}

                    return redirect('users')
                else:
                    data = {}
                    data['error_message'] = 'password and confirm password is not match'

                    return HttpResponse(data)

            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data)

        else:
            return redirect('menu/create.html')


class UsersView(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:
            # current_group_id = current_grp[0]['id'] for specific user login
            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=current_group_id).values('user')for specific user login
            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:
                if sort_order == 'asc':
                    users = User.objects.all().values(
                        'id', 'username', 'groups__name', 'first_name', 'last_name', 'email'
                    ).order_by(order_by, '-id')
                else:
                    users = User.objects.all().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)
        
        context = {"users": users,"page_obj":page_obj,"title":"Users","company_data":get_company_data(),"order_by": order_by,"sort_order": sort_order,}

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

class get_location(LoginRequiredMixin,View):
    def get(self, request, userid):
        location_data = []
        user_location = UserLocationLog.objects.filter(user=userid).order_by('id')[:25]

        for location in user_location:
            location_ = {}
            location_["id"] = location.id
            location_["latitude"] = location.latitude
            location_["longitude"] = location.longitude
            location_data.append(location_)
        
        
        data = {"user_locations": json.dumps(location_data),"MAP_API_KEY":MAP_API_KEY}
        return render(request, 'menu/user_map.html',data)

class get_usermap(LoginRequiredMixin,View):
    def get(self, request, userid):
        location_data = []
        user_location = UserLocationLog.objects.filter(user=userid).order_by('id')[:25]

        for location in user_location:
            location_ = {}
            location_["id"] = location.id
            location_["latitude"] = location.latitude
            location_["longitude"] = location.longitude
            location_data.append(location_)
        

        locations_json = json.dumps(location_data)
        
        data = {"user_locations": locations_json}
        return JsonResponse(data)


class update_user(View):

    def get(self, request, userid):

        user = {}
        userx = User.objects.filter(id=request.user.id).values('groups__id', 'groups__name')

        users = User.objects.filter(id=userid).values('id','username', 'groups__id', 'groups__name','first_name','last_name','email','password','is_active')
        
        unserinfo = UserInfo.objects.filter(user=userid).values('from_date','to_date')
        password = UserInfo.objects.filter(user=userid).values("password")
        if password:
            password=password[0]["password"]
        else:
            password = None

        
        if userx[0]['groups__name'] == 'Operational Head':
            status_ids = [2, 3] 
            g_data = Group.objects.filter(id__in=status_ids).values('id','name').order_by('name')

        else:
            g_data = Group.objects.all()

        user['id'] = users[0]['id']
        user['username'] = users[0]['username']
        user['groups__id'] = users[0]['groups__id']
        user['groups__name'] = users[0]['groups__name']
        user['first_name'] = users[0]['first_name']
        user['last_name'] = users[0]['last_name']
        user['email'] = users[0]['email']
        user['password']=password
        if unserinfo :
            if unserinfo[0]['from_date'] != None:
                user['from_date'] = unserinfo[0]['from_date']
            else:
                # Handle the case when the list is empty
                user['from_date'] = None
            if unserinfo[0]['to_date'] != "":
                user['to_date'] = unserinfo[0]['to_date']
            else:
                user['to_date'] = None
    
        if users[0]['is_active'] == True:
            user['status'] = True
        else:
             user['status'] = False


        context = {"users": user, "userid":userid, "gdata":g_data, "groups_name" : users[0]['groups__name'], "title":"Edit User","company_data":get_company_data()}
        return render(request, 'menu/create.html', context)
    
    
    
    # @csrf_exempt
    def post(self, request, userid):
        if request.method == "POST":
            firstname = request.POST.get('first_name')
            lastname = request.POST.get('last_name')
            email = request.POST.get('email')
            username = request.POST.get('username')
            password = request.POST.get('password1')
            password1 = request.POST.get('password2')
            crt_password = UserInfo.objects.filter(user=userid).values("password")
            userrole = request.POST.get('user_group')
            status = request.POST.get('status')
            user_date_from = request.POST.get('user_date_from')
            user_date_to = request.POST.get('user_date_to')
            group = Group.objects.get(id = userrole)
            current_user = User.objects.get(id=userid)
            login_user = User.objects.filter(id=request.user.id).values("id")
            current_grp = User.objects.filter(username=username).values('groups__id')
            current_user.groups.remove(current_grp[0]['groups__id'])

            current_user.save()
            if (email != '' and username != ''):
                if User.objects.filter(username=username).exists():
                    
                    if password != '' and password1 != '':

                        try:
                            user = User.objects.get(id=userid)
                            user.first_name = firstname
                            user.last_name = lastname
                            user.username = username
                            user.email = email
                            user.is_active = status
                            if password == password1:
                                if password != crt_password[0]['password']:
                                    user.set_password(password)
                            if group.name == "Admin":
                                user.is_superuser = True
                                # user.set_password(password)
                            else:
                                user.is_superuser = False
                                # user.set_password(password)
                            user.save()

                            try:
                                userx = UserInfo.objects.get(user=current_user)
                            except UserInfo.DoesNotExist:
                                # Handle the case when UserInfo object doesn't exist
                                userx = UserInfo.objects.create(user=current_user)

                            if user_date_from:
                                userx.from_date = datetime.strptime(user_date_from, '%Y-%m-%d').date()
                            else:
                                userx.from_date = None
                            
                            if user_date_to:
                                userx.to_date = datetime.strptime(user_date_to, '%Y-%m-%d').date()
                            else:
                                userx.to_date = None
                            if password == password1:
                                if password != crt_password[0]['password']:
                                    userx.password = password
                            userx.updated_by = login_user[0]['id']
                            userx.save()
    
                        except User.DoesNotExist:
                            print("User not found.")
                    else:
                        User.objects.filter(id=userid).update(
                            first_name=firstname,
                            last_name=lastname,username=username,email=email,is_active = status)
                        try:
                            userx = UserInfo.objects.get(user=user)
                        except UserInfo.DoesNotExist:
                            # Handle the case when UserInfo object doesn't exist
                            userx = UserInfo.objects.create(user=user)
                        
                        UserInfo.objects.filter(user=user).update(
                            from_date = user_date_from,
                            to_date = user_date_to,password=password)                        

                    user = User.objects.get(username=username)
                    user.groups.add(group)
                    
                    data = {
                        'success_message': "Successfully registered"}

                    return redirect('dashboard')
                else:
                    data = {}
                    data['error_message'] = 'password and confirm password is not match'

                    return HttpResponse(data)

            else:
                data = {}
                data['error_message'] = 'Some field is empty'
                return HttpResponse(data)

        else:
            return redirect('menu/create.html')
    # except user.DoesNotExist:
    #     return redirect('users')
    # book_form = UserUpadte(request.POST or None, instance=user)
    # if book_form.is_valid():
    #     book_form.save()
    #     return redirect('users')
    # context = {'upload_form': book_form}
    # return render(request, 'menu/edituser.html', context)



class delete_user(LoginRequiredMixin,View):
    def get(self,request,userid):
        subarea = User.objects.filter(id=userid)
        subarea.delete()   
        return redirect('users')
    
class addcurrntlocation(LoginRequiredMixin,View):
    def post(self, request):
        user = User.objects.get(id=request.user.id)
        user_crt_latitude = request.POST.get("user_crt_latitude")
        user_crt_longitude = request.POST.get("user_crt_longitude")
        
        UserLocationLog.objects.create(user=user,latitude=user_crt_latitude,longitude=user_crt_longitude)
        
        
        # Return a JSON response with a success message
        data = {'success': True, 'message': 'Status updated successfully.'}
        return JsonResponse(data)