import requests
from django.shortcuts import redirect, render
from django.contrib import messages
from django.conf import settings
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.contrib.auth.decorators import login_required
from urllib.parse import urlencode
import json
from authentication.models import User,Role
from customer.models import Customer
from myobconnect.models import MyobModel
from django.contrib.auth.hashers import make_password
from django.core import serializers
from myobconnect.views import refresh_token
from django.utils import timezone
from user.models import UserInfo
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q
from django.db.models import CharField, Value
from django.db.models.functions import Concat
from PIL import Image
import io
import os
from django.core.files import File 
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
import random
from django.contrib.auth.hashers import make_password
import string
import base64
from django.core.files.base import ContentFile
from django.shortcuts import get_object_or_404
from django.http import JsonResponse
@login_required
def errorTest(request):
    dd('here')


@login_required
def edit_user(request,id):
    if '1' not in request.user.get_role:
        if id != request.user.id:
            messages.error(request, 'You Dont Have Permission To Edit.')
            return redirect(request.META.get('HTTP_REFERER', '/'))
    user = User.objects.get(id=id)
    userinfo = UserInfo.objects.get(user=user)
    roles = Role.objects.all()
    user_role_ids = user.role.values_list('id', flat=True)
    context = {
        'user': user, 
        'userinfo': userinfo,
        'roles':roles,
        'user_role_ids':user_role_ids}
    if request.method == 'POST':
        form = request.POST
        email = request.POST.get('email')
        job_chat = request.POST.get('job_chat')
        username = email
        selected_roles = request.POST.getlist('role')
        password = request.POST.get('password')
        confirm_password = request.POST.get('confirm_password')
        context['selected_roles'] = selected_roles
        if job_chat:
            user.job_chat=job_chat
        is_active= request.POST.get('is_active')
        if is_active is None:
           is_active = False
        else:
            is_active = True
        replacement_id = request.POST.get('replacement_id')
        if not is_active:
            if not replacement_id:
                messages.error(request, "Replacement technician is required")
                return redirect(request.META.get('HTTP_REFERER'))
        
            user.replacement_technician_id = replacement_id
        else:
            user.replacement_technician = None  
        user.is_active=is_active
        user.save()
        if password !='':
            if password != confirm_password:
                messages.error(request, 'Password Do Not Match.')
                context['form'] = form
                return render(request, 'pages/user/edit.html', context)
        if not email:
            messages.error(request, 'Please Enter Email.')
            context['form'] = form
            return render(request, 'pages/user/edit.html', context)
        if User.objects.filter(email=email).exclude(id=user.id).exists():
            messages.error(request, 'Email Address Already Exist.')
            context['form'] = form
            return render(request, 'pages/user/edit.html', context)
        else:
            user.is_active=is_active
            user.username = username
            user.email = email
            if '1' in request.user.get_role:
                user.role.set(selected_roles)
            user.save()
            if password !='':
                if password:
                    user.set_password(password)
                user.save()
            userinfo.is_active=is_active
            userinfo.first_name = request.POST.get('first_name')
            userinfo.last_name = request.POST.get('last_name')
            userinfo.designation = request.POST.get('designation')
            userinfo.street = request.POST.get('street')
            userinfo.city = request.POST.get('city')
            userinfo.state = request.POST.get('state')
            userinfo.post_code = request.POST.get('post_code')
            userinfo.country = request.POST.get('country')
            userinfo.phone1 = request.POST.get('phone1')
            userinfo.email = email
            userinfo.updated_by = request.user
            # signature_data = request.POST.get('signature_data')
            # if signature_data:
            #     format, imgstr = signature_data.split(';base64,') 
            #     ext = format.split('/')[-1]  
            #     data = ContentFile(base64.b64decode(imgstr), name=f'signature.{ext}')
            #     user.signature.save(data.name, data)
            signature_image_data = request.POST.get('signature')
            if signature_image_data:
                image_binary = base64.b64decode(signature_image_data)
                image = Image.open(io.BytesIO(image_binary))
                temp_image_path = "temp_signature.png"
                image.save(temp_image_path)
                user.signature.save(f'{user.id}signature.png', File(open(temp_image_path, 'rb')))
                os.remove(temp_image_path)
            userinfo.save()
            if  "3" in selected_roles or 3 in selected_roles :
                send_credentials = request.POST.get('send_credentials')
                if send_credentials == '1' or send_credentials == 1:
                    subject = f'EXCITECH Australia - Your Account Credentials'
                    username= user.email   #user.email
                    template_data = {'password': password,'username':username}
                    message = render_to_string('pages/user/user_email_temp.html', template_data)
                    # message += "Please find attached Quote."
                    from_email = settings.FROM_EMAIL
                    recipient_email =user.email 
                    email = EmailMessage(subject, message, from_email, [recipient_email])
                    email.content_subtype = 'html'
                    email.send()
                    done=1
                    if done:
                        user.is_sent_creadentials= 1
                        user.reset_password=1
                        user.save()
            messages.success(request, 'User Updated Successfully.')
            if '1' not in request.user.get_role:
                return redirect(request.META.get('HTTP_REFERER', '/'))
            else:
                return redirect('user:list')
            
    return render(request, 'pages/user/edit.html',{'user': user, 'userinfo': userinfo,'roles':roles,'user_role_ids':user_role_ids})    
            
def send_credentials(request,id):
    user=User.objects.filter(id=id).first()
    if not user:
        # return HttpResponse('User not found.')
        messages.error(request, 'User not found.')
        return redirect('customer:list')
    subject = f'EXCITECH Australia - Your New Credentials Are Here'
    username= user.email 
    print(username)
    new_password = ''.join(random.choices(string.ascii_letters + string.digits, k=12))
    user.set_password(new_password)
    user.is_sent_creadentials=1
    user.reset_password=1
    user.save()
    
    template_data = {'password': new_password,'username':username}
    message = render_to_string('pages/user/user_email_temp.html', template_data)

    from_email = settings.FROM_EMAIL
    recipient_email =username #user.email 

    email = EmailMessage(subject, message, from_email, [recipient_email])
   
    email.content_subtype = 'html'
    email.send()
    messages.success(request, 'New credentials sent to User email.')
    return redirect('user:list')   
    
@login_required
def list_user(request):
    
    user_name = request.GET.get('user_name')
    email = request.GET.get('email')
    phone = request.GET.get('phone')
    role = request.GET.get('role')
    # status = request.GET.get('status')

    excluded_role_ids = [4,5]  #
    users = User.objects.filter(deleted_at__isnull=True,is_superuser=0).exclude(role__id__in=excluded_role_ids)
   
    # Apply additional filters based on user input
    if user_name:
        user_name=user_name.replace(' ','')
        # users = users.filter(Q(userinfo__first_name__icontains=user_name) | Q(userinfo__last_name__icontains=user_name))
        users = User.objects.annotate(name=Concat('userinfo__first_name', 
          Value(''), 'userinfo__last_name', output_field=CharField())).filter(name__icontains=user_name,deleted_at__isnull=True).exclude(role__id__in=excluded_role_ids)
   
        # dd(users)
        # filter(
        #     Q(userinfo__first_name__icontains=user_name) or
        #     Q(userinfo__last_name__icontains=user_name)
        # )
  
    # if user_name:
    #     users = users.filter(company_name__icontains=user_name)
    if role:
        role=role.strip()
        users = users.filter(role=role)

    if email:
        email=email.strip()
        users = users.filter(email__icontains=email)

    if phone:
        phone=phone.strip()
        users = users.filter(userinfo__phone1__icontains=phone)
    # if status:
    #     users = users.filter(status=status)
    
    
    total_records = users.count()
    show_pagination = total_records > settings.PAGE_RECORDS

   
    if show_pagination:
        page = request.GET.get('page', 1)
        paginator = Paginator(users, settings.PAGE_RECORDS)  # Show 10 users per page
        try:
            users = paginator.page(page)
        except PageNotAnInteger:
            users = paginator.page(1)
        except EmptyPage:
            users = paginator.page(paginator.num_pages)
   
    return render(request,'pages/user/list.html', {'users': users })

@login_required
def create_user(request):
    # dd('here')
    context = {}
    if request.method == 'POST':
        form = request.POST
        # dd(form)
        email = request.POST.get('email')
        username = request.POST.get('email')
        role = request.POST.getlist('role')
        is_active= request.POST.get('is_active')
        password = request.POST.get('password')
        confirm_password = request.POST.get('confirm_password')
        if is_active is None:
           is_active = False
        else:
            is_active = True
        context['selected_roles'] = role  
        if password != confirm_password:
            messages.error(request, 'Password Do Not Match.')
            context['form'] = form
            return render(request, 'pages/user/create.html', context)
        if User.objects.filter(email=email).exists():
            messages.error(request, 'Email Address Already Exist .')
            context['form'] = form
            return render(request, 'pages/user/create.html', context)
        if not email:
            messages.error(request, 'Please Enter Email.')
            context['form'] = form
            return render(request, 'pages/user/create.html', context)
        user = User.objects.create(
            username=email,
            email=email,
            is_active=is_active,
            password=password
        )
        user.job_chat= request.POST.get('job_chat')
        user.role.set(role)
        user.set_password(password)
        user_data = {
        'is_active':is_active,
        'first_name': request.POST.get('first_name'),
        'last_name': request.POST.get('last_name'), 
        'street': request.POST.get('street'),
        'city': request.POST.get('city'),
        
        'state': request.POST.get('state'),
        'post_code': request.POST.get('post_code'),
        'country': request.POST.get('country'),
        'phone1': request.POST.get('phone1'),
        'email': email,  
        'designation' : request.POST.get('designation'),
    }
        userinfo = UserInfo(
            user=user,
            **user_data, 
        )
        # signature_data = request.POST.get('signature_data')
        # if signature_data:
        #     format, imgstr = signature_data.split(';base64,') 
        #     ext = format.split('/')[-1]  
        #     data = ContentFile(base64.b64decode(imgstr), name=f'signature.{ext}')
        #     user.signature.save(data.name, data)
        signature_image_data = request.POST.get('signature')
        if signature_image_data:
       
            image_binary = base64.b64decode(signature_image_data)
            image = Image.open(io.BytesIO(image_binary))
            temp_image_path = "temp_signature.png"
            image.save(temp_image_path)
            user.signature.save(f'{user.id}signature.png', File(open(temp_image_path, 'rb')))
            os.remove(temp_image_path)
        user.save()
        userinfo.created_by=request.user
        userinfo.save()
        

            # send credentials to primary_email
        if  "3" in role or 3 in role :
            send_credentials = request.POST.get('send_credentials')
            if send_credentials == '1' or send_credentials == 1:
                subject = f'EXCITECH Australia - Your Account Credentials'
                username= user.email   #user.email
                template_data = {'password': password,'username':username}
                message = render_to_string('pages/user/user_email_temp.html', template_data)
                # message += "Please find attached Quote."
                from_email = settings.FROM_EMAIL
                recipient_email =user.email 
                email = EmailMessage(subject, message, from_email, [recipient_email])
                email.content_subtype = 'html'
                email.send()
                done=1
                if done:
                    user.is_sent_creadentials= 1
                    user.reset_password=1
                    user.save()
        messages.success(request, 'User Added Successfully.')
        context['form'] = form
        return redirect('user:list')
    else:
        context['form'] = {}
        context['users']= User.objects.all()
        return render(request, 'pages/user/create.html', context)

@login_required
# def delete_user(request, id):
#     try:
#         user = User.objects.get(id=id)
#         user_info = UserInfo.objects.get(user=user)
        
#         # Perform the soft delete logic for both User and UserInfo
#         user_info.deleted_by=request.user
#         user_info.soft_delete()
#         user.soft_delete()
    
#         messages.success(request, 'User Deleted Successfully.')
#     except ObjectDoesNotExist:
#         messages.error(request, 'User Not Exist.')
    
#     return redirect('user:list')

def delete_user(request, id):
    if request.method == "POST":
        replacement_id = request.POST.get("replacement_id")

        if not replacement_id:
            return JsonResponse({
                "success": False,
                "message": "Replacement technician is required"
            }, status=400)

        user = get_object_or_404(User, id=id)
        replacement = get_object_or_404(User, id=replacement_id)

        # save replacement
        user.replacement_technician = replacement
        user.is_active = False
        user.deleted_at = timezone.now()
        user.save()

        # soft delete user info
        try:
            user_info = UserInfo.objects.get(user=user)
            user_info.deleted_by = request.user
            user_info.soft_delete()
        except UserInfo.DoesNotExist:
            pass

        messages.success(request, 'Technician replaced and deactivated successfully.')

        return JsonResponse({"success": True})

    return JsonResponse({"success": False}, status=405)

