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
import time
from authentication.models import User
from django.db.models import Prefetch
from leads.models import Lead,Leadnote,LeadAttachmentPhotos,LeadAttachmentFiles,ProductSpecificationPDFSent,ProductUserManualPDFSent
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 django.db.models import Q ,Case ,When ,F , DateTimeField
from django.utils.dateparse import parse_date
import string

import urllib.parse

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.views import View

from quotation.models import Invoice,Quotation
from django.db.models import CharField, Value
from django.db.models.functions import Concat
from authentication.models import ActivityLog
from authentication.decorators import is_admin, is_sales, is_technician, is_customer,is_superuser
from django.contrib.auth.decorators import user_passes_test
from django.shortcuts import get_object_or_404
import os
from django.http import HttpResponse
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.contrib.auth.hashers import make_password
from dotenv import load_dotenv, find_dotenv
from authentication.models import User,Role
import random
from .models import Lead,Lead_Quote
from django.urls import reverse
load_dotenv(find_dotenv())
myob_customer_freightaxcode = os.environ.get('MYOB_Customer_FreightTaxCode')
myob_customer_taxcode = os.environ.get('MYOB_Customer_TaxCode')
from django.utils.timezone import localdate,now
from django.db.models import Max,Min
from django.db.models import Subquery, OuterRef
import csv
from product.models import ProductCategory,Product,OtherImage,SerialNumber
from customer.models import Customer,Customer_Info
from datetime import datetime,timedelta,date
@method_decorator(csrf_exempt, name='dispatch')

def cron_addDemoNote(request):
    
    today = date.today()
    tomorrow = today + timedelta(days=1)
    day_after_tomorrow = today + timedelta(days=2)
    
    lead_items = Lead.objects.filter(
        Q(demo_date=today) |
        Q(demo_date=tomorrow) |
        Q(demo_date=day_after_tomorrow)
    )
    # dd(lead_items);
    
    if lead_items:
        for lead_item in lead_items:
            latest_group = Leadnote.objects.aggregate(Max('groupid'))['groupid__max'] or 0
            next_group = latest_group + 1
            # dd(next_group,lead_item)
            leadnote = Leadnote.objects.filter(
                lead=lead_item,
                is_it_lead_demo=True
            ).order_by('-id').first()
        
            if not leadnote:
                Leadnote.objects.create(
                    lead=lead_item,
                    groupid=next_group,
                    note="Demo Scheduled",
                    reminder_date = lead_item.demo_date,
                    meeting_time=lead_item.demo_time,
                    assigned_to=lead_item.assigned_to,
                    created_by = lead_item.assigned_to,
                    is_it_lead_demo = True,
                    created_at=now(),
                )
            else:
                if (leadnote.reminder_date != lead_item.demo_date or leadnote.meeting_time != lead_item.demo_time):
                    leadnote.reminder_date = lead_item.demo_date
                    leadnote.meeting_time = lead_item.demo_time
                    leadnote.save(update_fields=['reminder_date', 'meeting_time'])
        return HttpResponse('done')
    else:
        return HttpResponse('No record found')

def normalize_url(url):
    if url and not url.startswith(('http://', 'https://')):
        return 'https://' + url
    return url

class MarkNotesReadView(View):
    def post(self, request):
        today = localdate()  
        if request.user.is_authenticated:
            # Get user's roles
            user_roles = request.user.role.all().values_list('id', flat=True)

            # Allow update only if user has role 3
            if 3 in user_roles:
                Leadnote.objects.filter(
                    deleted_at__isnull=True, 
                    is_read=0, 
                    assigned_to=request.user,
                    reminder_date__in=[today, None]  # Update only notes assigned to the user
                ).update(is_read=1)
                return JsonResponse({'status': 'success', 'message': 'Notes marked as read'})

            return JsonResponse({'status': 'error', 'message': 'Permission denied'}, status=403)

        return JsonResponse({'status': 'error', 'message': 'Unauthorized'}, status=403)
def add_lead_attachment(request, id):
    if request.method == 'POST':
        lead = get_object_or_404(Lead, id=id)
        for file in request.FILES.getlist('image_attachments'):
            LeadAttachmentPhotos.objects.create(
                lead=lead,
                attachment=file,
                created_by=request.user,
                updated_by=request.user
            )
        for file in request.FILES.getlist('file_attachments'):
            LeadAttachmentFiles.objects.create(
                lead=lead,
                attachment=file,
                created_by=request.user,
                updated_by=request.user
            )
    return redirect('leads:list')
def lead_attachments_view(request, lead_id):
    lead = get_object_or_404(Lead, id=lead_id)
    attachments = LeadAttachmentPhotos.objects.filter(lead_id=lead_id, soft_deleted=False)
    attachmentfiless = LeadAttachmentFiles.objects.filter(lead_id=lead_id, soft_deleted=False)
    return render(request, 'pages/leads/view_attachment.html', {'attachments': attachments,'attachmentfiless' : attachmentfiless, 'lead': lead})
def export_leads_csv(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="leads.csv"'
    writer = csv.writer(response)
    writer.writerow(['ID', 'Company Name','Customer Name ', 'Email','Work Phone','Mobile','ABN','Address','Business Type','Lead Source','Interasted In Products'])
    for lead in Lead.objects.all():
        # dd(customer)
        business_type = lead.get_business_type_display()
        lead_source = lead.get_lead_source_display()
        # products = ", ".join(lead.products) if lead.products else ""
        # # product_names = Product.objects.filter(id__in=lead.products).values_list('product_name', flat=True)
        # product_names = Product.objects.filter(id__in=lead.products).values_list('product_name', flat=True)
        # products_str = ", ".join(product_names)
        product_names = []
        if lead.products:  # make sure it's not None or empty
            product_names = Product.objects.filter(id__in=lead.products).values_list('product_name', flat=True)
        
        products_str = ", ".join(product_names)
        # address=lead.city+', '+lead.street+', '+lead.state+', '+lead.street+' '+lead.post_code+' '+lead.country;
        address_parts = [
            lead.city or '',
            lead.street or '',
            lead.state or '',
            lead.post_code or '',
            lead.country or ''
        ]
        address = ', '.join(filter(None, address_parts))
        writer.writerow([lead.id,lead.company_name, f"{lead.first_name} {lead.last_name}", lead.email,lead.work_phone,lead.mobile,lead.abn,address,business_type,lead_source,products_str])
        
               
    return response
def process_note_action(request, note_id):
    if request.method == "POST":
        action_type = request.POST.get("action_type")
        note = Leadnote.objects.get(id=note_id)
        
        if action_type == "mark_read":
            note.is_read = True
            note.updated_by = request.user
            note.save()
            messages.success(request, "Note marked as read.")

        elif action_type == "update_log":
            # meeting_time = request.POST.get('meeting_time') or None
            userid = request.POST.get("useridlog") or None
            if not userid == None:
                assigned_user = get_object_or_404(User, id=userid)
            else:
                assigned_user=None
            new_log = request.POST.get("log_note")
            note.is_read = True
            note.updated_by = request.user
            note.save()
            new_date = request.POST.get("reminder_date") or None
            reminder_date_str = request.POST.get('reminder_date')
            reminder_date =None
            if reminder_date_str:
                try:
                    reminder_date = datetime.strptime(reminder_date_str, "%Y-%m-%d").date() if reminder_date_str else None
                except ValueError:
                    reminder_date = None  # fallback if invalid
            else:
                reminder_date=None
            meeting_time_str = request.POST.get('meeting_time')
    
            meeting_time = None
            if meeting_time_str:
                try:
                    meeting_time = datetime.strptime(meeting_time_str, "%H:%M").time()
                except ValueError:
                    meeting_time = None  # fallback if invalid
            Leadnote.objects.create(
                lead=note.lead,
                groupid=request.POST.get("groupid"),
                note=new_log,
                reminder_date = reminder_date,
                meeting_time=meeting_time,
                assigned_to=assigned_user,
                created_by = request.user,
                # assigned_to=note.assigned_to,
                created_at=now(),
            )
            messages.success(request, "New log added successfully.")

        elif action_type == "reschedule":
            # meeting_time = request.POST.get('reschedule_meeting_time') or None
            userid = request.POST.get("userid") or None
            if not userid == None:
                assigned_user = get_object_or_404(User, id=userid)
            else:
                assigned_user=None
            # new_date = request.POST.get("reschedule_date") or None
            reminder_date_str = request.POST.get('reschedule_date')
            reminder_date =None
            if reminder_date_str:
                try:
                    reminder_date = datetime.strptime(reminder_date_str, "%Y-%m-%d").date() if reminder_date_str else None
                except ValueError:
                    reminder_date = None  # fallback if invalid
            else:
                reminder_date=None
            meeting_time_str = request.POST.get('reschedule_meeting_time')
    
            meeting_time = None
            if meeting_time_str:
                try:
                    meeting_time = datetime.strptime(meeting_time_str, "%H:%M").time()
                except ValueError:
                    meeting_time = None  # fallback if invalid
            note.reminder_date = reminder_date
            note.updated_by = request.user
            note.meeting_time=meeting_time
            note.assigned_to=assigned_user
            note.save()
            messages.success(request, "Reminder date updated.")

        return redirect("leads:note_list")  # Adjust this URL to match your project

    return JsonResponse({"status": "error", "message": "Invalid request"}, status=400)
def add_customer_note(request, id):
    lead = get_object_or_404(Lead, id=id)
    meeting_invitation = 0
    meet_link = None
    meeting_time = None
    if 'meeting_invitation' in request.POST:
        meeting_invitation = 1
        meeting_time = request.POST.get('meeting_time') or None
    meet_link = request.POST.get('meet_link')
    if request.method == "POST":
        note = request.POST.get("note")
        userid = request.POST.get("userid") or None
        # reminder_date = request.POST.get("reminder_date") or None  # Optional field
        
        
            
        if not userid == None:
            assigned_user = get_object_or_404(User, id=userid)
        else:
            assigned_user=None
        
        last_group = Leadnote.objects.order_by('-groupid').first()
        next_group_id = (last_group.groupid + 1) if last_group else 1
        print(request.POST.get('meeting_time'))
        print(meeting_time)
        reminder_date_str = request.POST.get('reminder_date')
        reminder_date =None
        if reminder_date_str:
            try:
                reminder_date = datetime.strptime(reminder_date_str, "%Y-%m-%d").date() if reminder_date_str else None
            except ValueError:
                reminder_date = None  # fallback if invalid
        else:
            reminder_date=None
        meeting_time_str = request.POST.get('meeting_time')

        meeting_time = None
        if meeting_time_str:
            try:
                meeting_time = datetime.strptime(meeting_time_str, "%H:%M").time()
            except ValueError:
                meeting_time = None  # fallback if invalid
        print(meeting_time)
        Leadnote.objects.create(
            lead=lead,
            note=note,
            reminder_date=reminder_date,
            meeting_time=meeting_time,
            created_by = request.user,
            assigned_to=assigned_user,
            groupid=next_group_id,
            meeting_invitation=meeting_invitation,
            meet_link=meet_link
        )

        messages.success(request, "Note added successfully!")
        return redirect('leads:list')  # Adjust to your actual view

    return redirect('leads:list')
@login_required
def note_customer(request, id):
    lead = get_object_or_404(Lead, pk=id)
   
    context={'leads': lead}
    # dd(invoice.get_history)
    # dd( customer.note_history)
    note = lead.note_history
    # dd(note)
    # excluded_role_ids = [1,4,5]
    # users = User.objects.filter(deleted_at__isnull=True,is_superuser=0).exclude(role__id__in=excluded_role_ids)
    users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()
    
    return render(request, 'pages/leads/note.html', {'users':users,'notes':note,'lead':lead})
@login_required
def all_note_customer(request, id):
    lead = get_object_or_404(Lead, pk=id)
   
    context={'leads': lead}
    # dd(invoice.get_history)
    # dd( customer.note_history)
    note = lead.all_note_history
    # dd(note)
    # excluded_role_ids = [1,4,5]
    # users = User.objects.filter(deleted_at__isnull=True,is_superuser=0).exclude(role__id__in=excluded_role_ids)
    users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()
    # dd(note)
    return render(request, 'pages/leads/all_note.html', {'users':users,'notes':note,'lead':lead})
@login_required
def all_lead_note(request):
    
    note = Leadnote.objects.filter(deleted_at__isnull=True).order_by('-updated_at')
    # dd(note)
    # excluded_role_ids = [1,4,5]
    # users = User.objects.filter(deleted_at__isnull=True,is_superuser=0).exclude(role__id__in=excluded_role_ids)
    users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()
    # dd(note)
    return render(request, 'pages/leads/all_lead_notes.html', {'users':users,'notes':note})
@login_required
def note_list_customer(request):
    # today = localdate() 
    today = date.today()
    tomorrow = today + timedelta(days=1)
    day_after_tomorrow = today + timedelta(days=2)
    user = request.user 
    # excluded_role_ids = [1,4,5]  #
    # users = User.objects.filter(deleted_at__isnull=True, is_superuser=0).exclude(role__id__in=excluded_role_ids)
    users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()

    # note = Leadnote.objects.filter(deleted_at__isnull=True)
   
    # users = User.objects.filter(deleted_at__isnull=True,is_superuser=0).exclude(role__id__in=excluded_role_ids)
    # Check user's role
    user_roles = user.role.all().values_list('id', flat=True)  # Get role IDs

    # Check role-based filtering
    if 1 in user_roles:
        # Role 1: Show all customer notes
        # notes = Leadnote.objects.filter(deleted_at__isnull=True, reminder_date__in=[today, None]).order_by('-created_at')
        # latest_notes = (
        #     Leadnote.objects.filter(
        #         # reminder_date__in=[today, None],
        #         reminder_date__isnull=False,
        #         reminder_date__lte=today,
        #         is_read=0,
        #         deleted_at__isnull=True
        #     )
        #     .values('groupid')  # Group by groupid
        #     .annotate(lat_created_at=Max('created_at'))  # Get latest created_at per group
        # )

        # # Fetch actual notes matching the latest created_at per groupid
        # notes =  Leadnote.objects.filter(
        #     # reminder_date__in=[today, None],
        #     reminder_date__isnull=False,
        #     reminder_date__lte=today,
        #     is_read=0,
        #     deleted_at__isnull=True
        # ).filter(
        #     Q(groupid__in=[note['groupid'] for note in latest_notes]),
        #     Q(created_at__in=[note['lat_created_at'] for note in latest_notes])
        # ).order_by('-reminder_date') 
        latest_notes = (
            Leadnote.objects.filter(
                is_read=0,
                deleted_at__isnull=True
            )
            .values('groupid')
            .annotate(lat_created_at=Max('created_at'))
        )
        
        # Step 2: Fetch actual notes with conditional date filtering
        notes = (
            Leadnote.objects.filter(
                is_read=0,
                deleted_at__isnull=True
            )
            .filter(
                Q(
                    is_it_lead_demo=False,
                    reminder_date__lte=today
                )
                |
                Q(
                    is_it_lead_demo=True,
                    reminder_date__range=[today, day_after_tomorrow]
                )
            )
            .filter(
                Q(groupid__in=[note['groupid'] for note in latest_notes]),
                Q(created_at__in=[note['lat_created_at'] for note in latest_notes])
            )
            .order_by('-reminder_date')
        )
    elif 2 in user_roles:
        # Role 3: Show only notes assigned to the logged-in user
        # notes = Leadnote.objects.filter(deleted_at__isnull=True, assigned_to__id=user.id, reminder_date__in=[today, None]).order_by('-created_at')
        # latest_notes = (
        #     Leadnote.objects.filter(
        #         reminder_date__in=[today, None],
        #         assigned_to__id=user.id,
        #         deleted_at__isnull=True
        #     )
        #     .values('groupid')  # Group by groupid
        #     .annotate(lat_created_at=Max('created_at'))  # Get latest created_at per group
        # )

        # # Fetch actual notes matching the latest created_at per groupid
        # notes =  Leadnote.objects.filter(
        #     # reminder_date__in=[today, None],
        #     reminder_date__isnull=False,
        #     reminder_date__lte=today,
        #     is_read=0,
        #     assigned_to__id=user.id,
        #     deleted_at__isnull=True
        # ).filter(
        #     Q(groupid__in=[note['groupid'] for note in latest_notes]),
        #     Q(created_at__in=[note['lat_created_at'] for note in latest_notes])
        # ).order_by('-reminder_date')
        latest_notes = ( Leadnote.objects.filter(  assigned_to__id=user.id,  deleted_at__isnull=True ).values('groupid').annotate(lat_created_at=Max('created_at')))
 
        notes = ( Leadnote.objects.filter(is_read=0,assigned_to__id=user.id,deleted_at__isnull=True,).filter(
                Q( is_it_lead_demo=False,  reminder_date__lte=today ) | Q( is_it_lead_demo=True, reminder_date__range=[today, day_after_tomorrow] )
            )
            .filter(
                Q(groupid__in=[note['groupid'] for note in latest_notes]),
                Q(created_at__in=[note['lat_created_at'] for note in latest_notes])
            )
            .order_by('-reminder_date')
        )
    else:
        # Other roles: No access
        notes = Leadnote.objects.none()
    if request.user.is_authenticated:
        user_roles = list(request.user.role.all().values_list('id', flat=True))
    else:
        user_roles = []
    
    # dd(notes)
    return render(request, 'pages/notification/lead_note_list.html', {'users':users,'notes':notes,'user_roles':user_roles})
@login_required    
def update_customer_note(request,id):
    CustNote=Leadnote.objects.get(id=id)
    if request.method == 'POST':
        # dd(request.POST)
        meeting_invitation= None
        reminder_date_str = request.POST.get('reminder_date')
        reminder_date =None
        if reminder_date_str:
            try:
                reminder_date = datetime.strptime(reminder_date_str, "%Y-%m-%d").date() if reminder_date_str else None
            except ValueError:
                reminder_date = None  # fallback if invalid
        else:
            reminder_date=None
        meeting_time_str = request.POST.get('meeting_time')

        meeting_time = None
        if meeting_time_str:
            try:
                meeting_time = datetime.strptime(meeting_time_str, "%H:%M").time()
            except ValueError:
                meeting_time = None
        if 'meeting_invitation' in request.POST:
            meeting_invitation = 1
           
        userid = request.POST.get("userid") or None
        if not userid == None:
            assigned_user = get_object_or_404(User, id=userid)
        else:
            assigned_user=None
        print(reminder_date)
        print(meeting_time_str)
        CustNote.note=request.POST.get("note")
        # dd(customer.user)
        CustNote.reminder_date=reminder_date
        CustNote.assigned_to=assigned_user
        CustNote.meeting_invitation=meeting_invitation
        CustNote.meeting_time=meeting_time
        CustNote.updated_by = request.user
        CustNote.save()
        # dd(CustNote)
    messages.success(request, "Note updated successfully!")
    return redirect(reverse('leads:note_customer', args=[CustNote.lead.id]))
@login_required    
def update_lead_status(request,id):
    CustNote=Lead.objects.get(id=id)
    print(request.POST)
    if request.method == 'POST':
        status = request.POST.get("status")
        if status==5 or status=='5':
            demo_date=request.POST.get("reminder_date") or None
            demo_time=request.POST.get("demo_time") or None
            CustNote.demo_date = demo_date
            CustNote.demo_time = demo_time
        CustNote.status=status
        CustNote.save()
    messages.success(request, "Status updated successfully!")
    return redirect(reverse('leads:list'))
@login_required
def note_delete(request, id):
    # customer = CustNote.objects.get(id=id)
    # customer.deleted_by = request.user  
    # customer.delete()
    # id=2
    note = get_object_or_404(Customernote, id=id)
    note.deleted_by = request.user 
    note.soft_delete()
    # note.delete()
    messages.success(request, 'Customer Note Deleted Successfully.')
    return redirect(reverse('leads:note_customer', args=[note.customer.id])) 

def myhistory(row):
    # if not row.model_name == 'Quotation' and not row.model_name == 'SerialNumber'  and not row.model_name == 'Invoice':
        result = []
        old = []
        newarr = []
        activity={}
        activity['model_name']=row.model_name
        activity['timestamp']=row.timestamp
        
        # //dd(row)
        activity['activity_by'] = str(row.user.userinfo.get_name) if row.user and row.user.userinfo is not None else 'Admin'
        if row.action == 'Updated':
            a = json.dumps(row.new_data[0]['fields'])
            b = json.dumps( row.old_data[0]['fields'])
            a = json.loads(a)
            b = json.loads(b)
            activity['note']=a['note']
            # dd(a)
            for key in a:
                # if key != 'is_primary':
                activity['action']='Updated'
                replace=key
                # dd(activity)
                # if key == 'primary_emails':
                #     replace="Primary Email"
                    
                if a and b:
                    if key in a and key in b and a[key] != b[key]:
                        old.append(f'Updated {replace} From {a[key]} to {b[key]}')
                        activity['log_activity']=f'<b>{replace} </b> From   <b>{b[key]} </b> To  <b>{a[key]} </b>'
                    if key not in b:
                        result.append(f'{dict({replace: a[key]})} -> {"replace deleted"}')
                        activity['log_activity']=f'{dict({replace: a[key]})} -> {"replace deleted"}'
                        # activity['log_activity']=f'Updated <b>{dict({key: b[key]})} </b> <b>{" Added"} </b>'
    
                        if key in a and key in b and a[key] != b[key] and a[key] != None and  b[key] != None and a[key] != '' and b[key] != ''  :
        
        
                            result.append(f'{dict({replace: a[key]})} -> {dict({replace: b[key]})}')
                            if not ( key == 'updated_at' or key == 'updated_at' or key == 'updated_by' or key == 'deleted_at'):
                                old.append(f'Updated {replace} From {a[key]} to {b[key]}')
                                activity['log_activity']=f'<b>{replace} </b> From   <b>{b[key]} </b> To  <b>{a[key]} </b>'
            activity['log_activity']=old
        if row.action == 'Deleted':
            a = json.dumps(row.new_data[0]['fields'])
            # b = json.dumps( row.old_data[0]['fields'])
            a = json.loads(a)
            # b = json.loads(b)
            result.append(f'Deleted')
            activity['log_activity']='Deleted'
            activity['note']=a['note']
            activity['action']='Deleted'
        if row.action == 'Created':
            a = json.dumps(row.new_data[0]['fields'])
            # b = json.dumps( row.old_data[0]['fields'])
            a = json.loads(a)
            # b = json.loads(b)
            # dd(a['note'])
            result.append(f'Created')
            activity['log_activity']='Created'
            activity['action']='Created'
            activity['note']=a['note']
        # dd(activity)
        return activity  
        
@user_passes_test(lambda u: is_admin(u) or is_superuser(u))
@login_required
def note_activity(request, id):
    customer = get_object_or_404(Lead, pk=id)
   
    context={'customers': customer}
    # dd(invoice.get_history)
    
    history = customer.get_history
    t1=[]
    if history:
        
        for cus in history:
           
            t=myhistory(cus)

            if t is not None:
               t1.append(t)
    counter = 1

    for cust in t1:
        if 'log_activity' in cust and cust['log_activity'] is not None and cust['log_activity'] != ''  :
            cust['row_number'] = counter
            counter += 1
    # dd(t1)
    return render(request, 'pages/leads/activity.html', {'t1':t1,'counter':counter})



@login_required
def get_last_note(request):
    lead_id = request.GET.get('lead_id')
    lead=Lead.objects.filter(id=lead_id).first()
    if not lead:
        return JsonResponse({"note": "Lead not found"})
    # dd(lead.note_history.first())
    # note = lead.note_history.filter(
    #     deleted_at__isnull=True
    # ).order_by('-created_at').first()
    note = lead.note_history().first() if lead.note_history else None
    if note:
        data = {
            "note": note.note,
            "created_by": f"{note.created_by.userinfo.first_name} {note.created_by.userinfo.last_name}" if note.created_by else "-",
            "created_at": note.created_at.strftime("%d-%m-%Y %I:%M %p"),
            "reminder_date": note.reminder_date.strftime("%d-%m-%Y") if note.reminder_date else "",
            "meeting_time": note.meeting_time.strftime("%I:%M %p") if note.meeting_time else "",
            "assigned_to": f"{note.assigned_to.userinfo.first_name} {note.assigned_to.userinfo.last_name}" if note.assigned_to else "-"
        }
    else:
        data = {"note": "No notes found"}
    return JsonResponse(data)
@login_required
def generate_map_url(lead):
    address = f"{lead.street}, {lead.city}, {lead.state} {lead.post_code}, {lead.country}"
    encoded_address = urllib.parse.quote(address)
    return f"https://www.google.com/maps/search/?api=1&query={encoded_address}"
# Live
@login_required
def list_customer(request):
    start_time = time.time()
    customer_id = request.GET.get('customer_id')
    email = request.GET.get('email')
    phone = request.GET.get('phone')
    status = request.GET.get('status')
    lead_source = request.GET.get('lead_source')
    
    start_date = request.GET.get('start_date')
    end_date = request.GET.get('end_date')
    date_field = request.GET.get('date_field')  # created_at OR demo_date
    if is_admin(request.user) or '2' in request.user.get_role:
        customer=Lead.objects.filter(deleted_at__isnull=True)
    else:
        customer=Lead.objects.filter(deleted_at__isnull=True)
    if (start_date or end_date or date_field) and not ((start_date or end_date) and date_field):
        if date_field != 'all':
            messages.error(request, " Date and Date Type are required ")
            return redirect(request.META.get("HTTP_REFERER", "customer_list"))
    if ((start_date or end_date) and date_field):
        try:
            if start_date:
                start = make_aware(datetime.strptime(start_date, "%d-%m-%Y"))

            else:
                start=None
            if end_date:
                end = make_aware(datetime.strptime(end_date, "%d-%m-%Y") + timedelta(days=1) - timedelta(seconds=1))
            else:
                 end=None
        except ValueError:
            messages.error(request, "Invalid date format, please use DD-MM-YYYY")
            return redirect(request.META.get("HTTP_REFERER", "customer_list"))
        if start and end:
            print(start,end)
            if date_field == "all": 
                customer = customer.filter(
                    Q(created_at__range=[start, end]) |
                    Q(demo_date__range=[start, end]) |
                    Q(
                        notes__created_at__range=[start, end],
                        notes__deleted_at__isnull=True
                    )|
                    Q(
                        notes__reminder_date__isnull=False,
                        notes__deleted_at__isnull=True,
                        notes__reminder_date__range=[start, end]
                    )
                ).distinct()
            elif date_field == "note_date": 
                end = datetime.strptime(end_date, "%d-%m-%Y").date()# only leads with notes in range
                start = datetime.strptime(start_date, "%d-%m-%Y").date()# only leads with notes in range
                print(start,end)
                customer = customer.filter(
                    notes__reminder_date__isnull=False,
                    notes__deleted_at__isnull=True,
                    notes__reminder_date__range=[start, end]
                ).distinct()
                print("START:", start, type(start))
                print("END:", end, type(end))
            elif date_field == "note_created_at": 
             
                customer = customer.filter(
                    notes__created_at__range=[start, end],
                    notes__deleted_at__isnull=True
                ).distinct()
                print("START:", start, type(start))
                print("END:", end, type(end))
            else:
                filter_kwargs = {f"{date_field}__range": [start, end]}
                customer = customer.filter(**filter_kwargs)
            print('both')
        elif start:
            if date_field == "all": 
                customer = customer.filter(
                    Q(created_at__gte=start) |
                    Q(demo_date__gte=start) |
                    Q(
                        notes__created_at__gte=start,
                        notes__deleted_at__isnull=True
                    )|
                    Q(
                        notes__reminder_date__isnull=False,
                        notes__deleted_at__isnull=True,
                        notes__reminder_date__gte=start
                    )
                ).distinct()
            elif date_field == "note_date":
                start = datetime.strptime(start_date, "%d-%m-%Y").date()
                customer = customer.filter(
                    notes__reminder_date__isnull=False,
                    notes__deleted_at__isnull=True,
                    notes__reminder_date__gte=start
                ).distinct()
            elif date_field == "note_created_at": 
                customer = customer.filter(
                    notes__created_at__gte=start,
                    notes__deleted_at__isnull=True
                ).distinct()
            else:
                filter_kwargs = {f"{date_field}__gte": start}
                customer = customer.filter(**filter_kwargs)
            print('start')
        elif end:
            if date_field == "all": 
                customer = customer.filter(
                    Q(created_at__lte=end) |
                    Q(demo_date__lte=end) |
                    Q(
                        notes__created_at__lte=end,
                        notes__deleted_at__isnull=True
                    )|
                    Q(
                        notes__reminder_date__isnull=False,
                        notes__deleted_at__isnull=True,
                        notes__reminder_date__lte=end
                    )
                ).distinct()
            elif date_field == "note_date":
                end = datetime.strptime(end_date, "%d-%m-%Y").date()
                customer = customer.filter(
                    notes__reminder_date__isnull=False,
                    notes__deleted_at__isnull=True,
                    notes__reminder_date__lte=end
                ).distinct()
            elif date_field == "note_created_at": 
                customer = customer.filter(
                    notes__created_at__lte=end,
                    notes__deleted_at__isnull=True
                ).distinct()
            else:
                filter_kwargs = {f"{date_field}__lte": end}
                customer = customer.filter(**filter_kwargs)
            print('end')
        print(customer)
    if customer_id:
        customer = Lead.objects.filter(Q(id=customer_id) )
              
    if email:
        email = request.GET.get('email').strip()
        customer = customer.filter(email__icontains=email)

    if phone:
        phone = request.GET.get('phone').strip()
        customer = customer.filter(
        Q(work_phone__icontains=phone) | Q(mobile__icontains=phone)
        )
    if lead_source:
        customer = customer.filter(lead_source=lead_source)
    if status:
        customer = customer.filter(status=status)
        
    business_type = request.GET.get('business_type')
    if business_type:
        customer = customer.filter(business_type=business_type)

    product_ids = request.GET.get('products')
    if product_ids:
        product_ids = [int(pid.strip()) for pid in product_ids.split(',') if pid.strip().isdigit()]
        customer = customer.filter(products__contains=product_ids)

    userid = request.GET.get('userid')
    if userid:
        customer = customer.filter(assigned_to_id=userid)  # adjust field name accordingly
    address = request.GET.get('address')
    if address:
        address = address.strip()
        customer = customer.filter(
            Q(state__icontains=address) |
            Q(city__icontains=address) |
            Q(street__icontains=address) |
            Q(country__icontains=address) |
            Q(post_code__icontains=address)
        )
    customer = customer.order_by('-updated_at')
    # customer = ( customer .annotate(latest_note=Max('notes__updated_at')) .annotate(
    #             last_updated=Case(
    #                 When(latest_note__gt=F('updated_at'), then=F('latest_note')),
    #                 default=F('updated_at'),
    #                 output_field=DateTimeField()
    #             )
    #         )
    #         .order_by('-last_updated')
    #     )
    
    
    latest_note_subquery = Leadnote.objects.filter(
        lead_id=OuterRef('pk'),
        deleted_at__isnull=True
    ).order_by('-updated_at').values('updated_at')[:1]
    
    customer = customer.annotate(
        latest_note=Subquery(latest_note_subquery, output_field=DateTimeField())
    ).annotate(
        last_updated=Case(
            When(latest_note__gt=F('updated_at'), then=F('latest_note')),
            default=F('updated_at'),
            output_field=DateTimeField()
        )
    ).order_by('-last_updated')
    
    total_records = customer.count()
    show_pagination = total_records > settings.PAGE_RECORDS
    if show_pagination:     
        page = request.GET.get('page', 1)
        paginator = Paginator(customer, settings.PAGE_RECORDS)  # Show 10 customers per page
        try:
            customer = paginator.page(page)
        except PageNotAnInteger:
            customer = paginator.page(1)
        except EmptyPage:
            customer = paginator.page(paginator.num_pages)
    users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()
    if is_admin(request.user) or  '2' in request.user.get_role:
        leads = Lead.objects.filter(deleted_at__isnull=True)
    else:
        leads = Lead.objects.filter(deleted_at__isnull=True)
    allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
    print('test kiran')
    end_time = time.time()
    print(f"TOTAL TIME: {end_time - start_time:.3f} seconds")
    return render(request,'pages/leads/list.html', {'users':users,'customers': customer,'cust':leads,'allproducts':allproducts})

# @login_required
# def list_customer(request):
#     # env_vars = os.environ
#     # for key, value in env_vars.items():
#     #     print(f"{key}: {value}")
#     customer_id = request.GET.get('customer_id')
#     email = request.GET.get('email')
#     phone = request.GET.get('phone')
#     status = request.GET.get('status')
#     lead_source = request.GET.get('lead_source')
    
#     start_date = request.GET.get('start_date')
#     end_date = request.GET.get('end_date')
#     date_field = request.GET.get('date_field')  # created_at OR demo_date
    
#     if is_admin(request.user) or '2' in request.user.get_role:
#         customer=Lead.objects.filter(deleted_at__isnull=True)
#     # elif  '2' in request.user.get_role :
#     #     assigned_to = User.objects.get(id=request.user.id)
#     #     customer = Lead.objects.filter(assigned_to=assigned_to, deleted_by__isnull=True)
#     else:
#         customer=Lead.objects.filter(deleted_at__isnull=True)
        
#     # dd(request.user.get_role)
#     # customer=Lead.objects.filter(deleted_at__isnull=True)
#     # customer = Customer_Info.objects.filter(customer__in=customer_data, is_primary=True)
#     if (start_date or end_date or date_field) and not ((start_date or end_date) and date_field):
#         messages.error(request, " Date and Date Type are required ")
#         return redirect(request.META.get("HTTP_REFERER", "customer_list"))
#     if ((start_date or end_date) and date_field):
        
       
#         try:
#             if start_date:
#                 start = datetime.strptime(start_date, "%d-%m-%Y").date()
#             else:
#                 start=None
#             if end_date:
#                 end = datetime.strptime(end_date, "%d-%m-%Y") + timedelta(days=1) - timedelta(seconds=1)
#                 # end = datetime.strptime(end_date, "%d-%m-%Y").date()
#             else:
#                  end=None
#         except ValueError:
#             messages.error(request, "Invalid date format, please use DD-MM-YYYY")
#             return redirect(request.META.get("HTTP_REFERER", "customer_list"))
#         # print(start)
#         # print(end)
#         # print(date_field)
#         if start and end:
#             filter_kwargs = {f"{date_field}__range": [start, end]}
#         elif start:
#             filter_kwargs = {f"{date_field}__gte": start}
#         else:  # only end
#             filter_kwargs = {f"{date_field}__lte": end}
                
#         customer = customer.filter(**filter_kwargs)
    
#     if customer_id:
#         customer = Lead.objects.filter(Q(id=customer_id) )
              
#     if email:
#         email = request.GET.get('email').strip()
#         customer = customer.filter(email__icontains=email)

#     if phone:
#         phone = request.GET.get('phone').strip()
#         customer = customer.filter( Q(work_phone__icontains=phone) | Q(mobile__icontains=phone) )
#     if lead_source:
#         customer = customer.filter(lead_source=lead_source)
#     if status:
#         customer = customer.filter(status=status)
        
#     business_type = request.GET.get('business_type')
#     if business_type:
#         customer = customer.filter(business_type=business_type)

#     # 4. Filter by selected products (many-to-many or foreign key)
#     product_ids = request.GET.get('products')
#     if product_ids:
#         product_ids = [int(pid.strip()) for pid in product_ids.split(',') if pid.strip().isdigit()]
#         customer = customer.filter(products__contains=product_ids)

#     # 5. Filter by sales user
#     userid = request.GET.get('userid')
#     if userid:
#         customer = customer.filter(assigned_to_id=userid)  # adjust field name accordingly
#     address = request.GET.get('address')
#     if address:
#         address = address.strip()
#         customer = customer.filter(
#             Q(state__icontains=address) |
#             Q(city__icontains=address) |
#             Q(street__icontains=address) |
#             Q(country__icontains=address) |
#             Q(post_code__icontains=address)
#         )
#     customer = customer.order_by('-created_at')
#     total_records = customer.count()
#     show_pagination = total_records > settings.PAGE_RECORDS
#     if show_pagination:     
#         page = request.GET.get('page', 1)
#         # customer = customer.order_by('-created_at')
#         paginator = Paginator(customer, settings.PAGE_RECORDS)  # Show 10 customers per page
#         try:
#             customer = paginator.page(page)
#         except PageNotAnInteger:
#             customer = paginator.page(1)
#         except EmptyPage:
#             customer = paginator.page(paginator.num_pages)
#     users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()
#     if is_admin(request.user) or  '2' in request.user.get_role:
#         leads = Lead.objects.filter(deleted_at__isnull=True)
#     else:
#         leads = Lead.objects.filter(deleted_at__isnull=True)
#     allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
    
#     print('test kiran')
   
#     # for lead in leads:
#     #     lead.spec_sent_product_ids = set(
#     #         ProductSpecificationPDFSent.objects.filter(lead_id=lead.id)
#     #         .values_list('product_id', flat=True)
#     #     )
#     #     lead.manual_sent_product_ids = set(
#     #         ProductUserManualPDFSent.objects.filter(lead_id=lead.id)
#     #         .values_list('product_id', flat=True)
#     #     )
#     return render(request,'pages/leads/list.html', {'users':users,'customers': customer,'cust':leads,'allproducts':allproducts})



# def list_customer(request):
#     customer = Lead.objects.filter(deleted_at__isnull=True)

#     # ---------------- FILTERS ----------------
#     customer_id = request.GET.get('customer_id')
#     email = request.GET.get('email')
#     phone = request.GET.get('phone')
#     status = request.GET.get('status')
#     lead_source = request.GET.get('lead_source')
#     business_type = request.GET.get('business_type')
#     userid = request.GET.get('userid')
#     address = request.GET.get('address')

#     # ---------------- DATE FILTER ----------------
#     start_date = request.GET.get('start_date')
#     end_date = request.GET.get('end_date')
#     date_field = request.GET.get('date_field')

#     if (start_date or end_date) and date_field:
#         try:
#             start = make_aware(datetime.strptime(start_date, "%d-%m-%Y")) if start_date else None
#             end = make_aware(datetime.strptime(end_date, "%d-%m-%Y") + timedelta(days=1) - timedelta(seconds=1)) if end_date else None
#         except:
#             messages.error(request, "Invalid date format")
#             return redirect("leads:list")

#         if date_field == "all":
#             q = Q()
#             if start and end:
#                 q = Q(created_at__range=[start, end]) | Q(demo_date__range=[start, end]) | Q(notes__created_at__range=[start, end])
#             elif start:
#                 q = Q(created_at__gte=start) | Q(demo_date__gte=start) | Q(notes__created_at__gte=start)
#             elif end:
#                 q = Q(created_at__lte=end) | Q(demo_date__lte=end) | Q(notes__created_at__lte=end)

#             customer = customer.filter(q).distinct()

#         else:
#             lookup = {}
#             if start and end:
#                 lookup[f"{date_field}__range"] = [start, end]
#             elif start:
#                 lookup[f"{date_field}__gte"] = start
#             elif end:
#                 lookup[f"{date_field}__lte"] = end

#             customer = customer.filter(**lookup)

#     # ---------------- OTHER FILTERS ----------------

#     if customer_id:
#         customer = customer.filter(id=customer_id)

#     if email:
#         customer = customer.filter(email__icontains=email.strip())

#     if phone:
#         phone = phone.strip()
#         customer = customer.filter(Q(work_phone__icontains=phone) | Q(mobile__icontains=phone))

#     if lead_source:
#         customer = customer.filter(lead_source=lead_source)

#     if status:
#         customer = customer.filter(status=status)

#     if business_type:
#         customer = customer.filter(business_type=business_type)

#     if userid:
#         customer = customer.filter(assigned_to_id=userid)

#     if address:
#         address = address.strip()
#         customer = customer.filter(
#             Q(state__icontains=address) |
#             Q(city__icontains=address) |
#             Q(street__icontains=address) |
#             Q(country__icontains=address) |
#             Q(post_code__icontains=address)
#         )

#     # ---------------- OPTIMIZATION ----------------

#     customer = customer.select_related('assigned_to').prefetch_related(
#         Prefetch('notes', queryset=Leadnote.objects.filter(deleted_at__isnull=True))
#     )

#     # ---------------- ANNOTATION ----------------

#     customer = customer.annotate(
#         latest_note=Max('notes__updated_at')
#     ).annotate(
#         last_updated=Case(
#             When(latest_note__gt=F('updated_at'), then=F('latest_note')),
#             default=F('updated_at'),
#             output_field=DateTimeField()
#         )
#     ).order_by('-last_updated')

#     # ---------------- PAGINATION ----------------

#     paginator = Paginator(customer, settings.PAGE_RECORDS)
#     page = request.GET.get('page', 1)

#     try:
#         customer_page = paginator.page(page)
#     except PageNotAnInteger:
#         customer_page = paginator.page(1)
#     except EmptyPage:
#         customer_page = paginator.page(paginator.num_pages)

#     # ---------------- USERS & PRODUCTS ----------------

#     users = User.objects.filter(
#         deleted_at__isnull=True,
#         is_superuser=0,
#         role__id=2
#     ).only('id', 'name')

#     allproducts = Product.objects.filter(
#         deleted_at__isnull=True
#     ).select_related('category').only('id', 'category')

#     # ---------------- REMOVE N+1 ----------------

#     leads = Lead.objects.filter(deleted_at__isnull=True).prefetch_related(
#         Prefetch(
#             'productspecificationpdfsent_set',
#             queryset=ProductSpecificationPDFSent.objects.only('lead_id', 'product_id'),
#             to_attr='spec_sent'
#         ),
#         Prefetch(
#             'productusermanualpdfsent_set',
#             queryset=ProductUserManualPDFSent.objects.only('lead_id', 'product_id'),
#             to_attr='manual_sent'
#         )
#     )

#     # ---------------- FINAL ----------------

#     return render(request, 'pages/leads/list.html', {
#         'users': users,
#         'customers': customer_page,
#         'cust': leads,
#         'allproducts': allproducts
#     })
    
@login_required
def create_customer(request):
    allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
    # excluded_role_ids = [1,4,5]  #
    # users = User.objects.filter(deleted_at__isnull=True,is_superuser=0).exclude(role__id__in=excluded_role_ids)
    users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()
    return render(request,'pages/leads/create.html', {'allproducts': allproducts,'users':users})

def convert_to_customer(request,id):
    lead = Lead.objects.get(id=id)
    return render(request,'pages/customer/leadConvertToCustomer.html', {'lead': lead})
@login_required
def post_lead(request):
    # dd(request.POST)
    context={}
    if request.method == 'POST':
        # dd(request.POST)
        form = request.POST
        company_name = request.POST.get('company_name', '').strip()
        first_name = request.POST.get('first_name', '').strip()
        status = request.POST.get("status")
        if status:
            status=status
            
        else:
            status=1
        
        if not company_name and not first_name:
            messages.error(request, "Either Company Name or First Name is required.")
            context['form'] = request.POST
            allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
            return render(request, 'pages/leads/create.html', {'context':context,'allproducts': allproducts})
            # return JsonResponse(context, status=400)

            # Continue processing the valid input...
            # e.g., save to DB or perform further checks
            
        # is_active= request.POST.get('is_active')
       
        # if is_active is None:
        #   is_active = False
        # else:
        email = request.POST.get("email")
        if email:  # only check if email is provided
            if Lead.objects.filter(email=email, deleted_at__isnull=True).exists():
                messages.error(request, "A lead with this email already exists.")
                context['form'] = request.POST
                allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
                return render(request, 'pages/leads/create.html', {'context':context,'allproducts': allproducts})
            if User.objects.filter(email=email, deleted_at__isnull=True).exists():
                messages.error(request, "A Customer with this email already exists.")
                context['form'] = request.POST
                allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
                return render(request, 'pages/leads/create.html', {'context':context,'allproducts': allproducts})
            
        is_active = True
        # abn=request.POST.get('abn'),
        # if abn  and len(abn ) == 11:
        #     abnres = f"{abn[:2]} {abn[2:5]} {abn[5:8]} {abn[8:]}"
        # else:
        #     abnres=abn
        userid = request.POST.get("userid") or None
        if not userid == None:
            assigned_user = get_object_or_404(User, id=userid)
        else:
            assigned_user=request.user
        if request.POST.get('business_type') == '':
            business_type = None
        else:
            business_type=request.POST.get('business_type')
        if request.POST.get('lead_source') == '':
            lead_source = None
        else:
            lead_source=request.POST.get('lead_source')
        demo_date=None
        demo_time=None
        if status==5 or status=='5':
            demo_date=request.POST.get("reminder_date") or None
            demo_time=request.POST.get("demo_time") or None
        lead = Lead.objects.create(
            is_individual= 1,
            company_name= request.POST.get('company_name'),
            first_name = request.POST.get('first_name'),
            last_name = request.POST.get('last_name'),
            email = request.POST.get('email'),
            work_phone = request.POST.get('phone1'),
            mobile = request.POST.get('mobile'),
            is_active=is_active,
            abn=request.POST.get('abn'),
            lead_source=lead_source,
            business_type=business_type,
            products= request.POST.getlist('products[]'),
            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'),
            # assigned_to=request.user,
            assigned_to=assigned_user,
            status=status,
            demo_date = demo_date,
            demo_time = demo_time,
            geolocation='', #request.POST.get('geolocation'),
            linkedin = normalize_url(request.POST.get('linkedin')),
            instagram = normalize_url(request.POST.get('instagram')),
            facebook = normalize_url(request.POST.get('facebook')),
        )
        # addressurl=generate_map_url(lead)
        # lead.geolocation=addressurl
        lead.save()
        messages.success(request, "Lead Added successfully!") 
        return redirect('leads:list')        
    else:      
        context['form'] = request.POST
        allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
        return render(request, 'pages/leads/create.html', {'context':context,'allproducts': allproducts})


@login_required    
def edit_customer(request,id):
    lead = Lead.objects.get(id=id)
    users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()
    selected_product_ids = []
    if lead.products:
        selected_product_ids = [int(pid) for pid in lead.products]
   
    if request.method == 'POST':
        # dd(request.POST)
        form = request.POST
        company_name = request.POST.get('company_name', '').strip()
        first_name = request.POST.get('first_name', '').strip()

        if not company_name and not first_name:
            messages.error(request, "Either Company Name or First Name is required.")
            allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
            return render(request,'pages/leads/edit.html',{'lead': lead,'allproducts':allproducts,'selected_product_ids':selected_product_ids})
        email = request.POST.get("email")
        if email:  # only check if email is provided
            if Lead.objects.filter(email=email, deleted_at__isnull=True).exclude(id=id).exists():
                messages.error(request, "A lead with this email already exists.")
                # context['form'] = request.POST
                allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
                return render(request,'pages/leads/edit.html',{'lead': lead,'allproducts':allproducts,'selected_product_ids':selected_product_ids})
            if User.objects.filter(email=email, deleted_at__isnull=True).exists():
                messages.error(request, "A Customer with this email already exists.")
                context['form'] = request.POST
                allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
                return render(request,'pages/leads/edit.html',{'lead': lead,'allproducts':allproducts,'selected_product_ids':selected_product_ids})
        if request.POST.get('business_type') == '':
            business_type = None
        else:
            business_type=request.POST.get('business_type')
        if request.POST.get('lead_source') == '':
            lead_source = None
        else:
            lead_source=request.POST.get('lead_source')
        userid = request.POST.get("userid")
        status = request.POST.get("status")
        if userid:
            try:
                # Strip any stray commas or periods, then convert to int
                user_id_clean = int(str(userid).strip().replace(',', '').replace('.', ''))
                assigned_user = get_object_or_404(User, id=user_id_clean)
            except (ValueError, TypeError):
                assigned_user = None  # or handle invalid input
        else:
            assigned_user = request.user
        # dd(user_id_clean)
        demo_date=None
        demo_time=None
        if status==5 or status=='5':
            demo_date=request.POST.get("reminder_date") or None
            demo_time=request.POST.get("demo_time") or None
            lead.demo_date = demo_date
            lead.demo_time = demo_time
        is_active = True
        lead.is_individual= 1
        lead.company_name= request.POST.get('company_name')
        lead.first_name = request.POST.get('first_name')
        lead.last_name = request.POST.get('last_name')
        lead.email = request.POST.get('email')
        lead.work_phone = request.POST.get('phone1')
        lead.mobile = request.POST.get('mobile')
        lead.is_active=is_active
        lead.abn=request.POST.get('abn')
        lead.lead_source=lead_source
        lead.business_type=business_type
        lead.assigned_to_id=assigned_user
        lead.products= request.POST.getlist('products[]')
        lead.street=request.POST.get('street')
        lead.city=request.POST.get('city')
        lead.state=request.POST.get('state')
        lead.post_code=request.POST.get('post_code')
        lead.country=request.POST.get('country')
        lead.geolocation='' #request.POST.get('geolocation'),
        lead.status=status if status is not None else 1
        lead.linkedin = normalize_url(request.POST.get('linkedin'))
        lead.instagram = normalize_url(request.POST.get('instagram'))
        lead.facebook = normalize_url(request.POST.get('facebook'))
        lead.updated_by = request.user
        lead.save()    
       
        messages.success(request, 'Lead Updated Successfully.')
        return redirect('leads:list')
    allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
    return render(request,'pages/leads/edit.html',{'lead': lead,'allproducts':allproducts,'selected_product_ids':selected_product_ids,'users':users})
def show_customer(request,id):
    lead = Lead.objects.get(id=id)
    users = User.objects.filter( deleted_at__isnull=True, is_superuser=0, role__id=2 ).distinct()
    selected_product_ids = []
    if lead.products:
        selected_product_ids = [int(pid) for pid in lead.products]
    allproducts = Product.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
    return render(request,'pages/leads/show.html',{'lead': lead,'allproducts':allproducts,'selected_product_ids':selected_product_ids,'users':users})
def add_quote(request, id):
    leadexist = Lead.objects.get(id=id)
    leads=Lead.objects.filter(deleted_at__isnull=True ).order_by('category__category_name')
    return render(request,'pages/leads/add_quote.html',{'leadexist': leadexist,'leads':leads})
def add_lead_quote(request):
    if is_admin(request.user):
        leads = Lead.objects.filter(deleted_at__isnull=True)
    elif  '2' in request.user.get_role :
        assigned_to = User.objects.get(id=request.user.id)
        leads = Lead.objects.filter(deleted_at__isnull=True,assigned_to=assigned_to)
    return render(request,'pages/leads/add_quote.html',{'leads':leads})

def create_Lead_Quotation(request):
    id=request.POST.get('lead')
    lead= Lead.objects.get(id=id)
    attachment = request.FILES.get('attachment')
    existing_quotes_count = Lead_Quote.objects.filter(lead=lead).count()
    version_number = existing_quotes_count + 1
    leadquote = Lead_Quote.objects.create(
            lead=lead,
            mailstatus=0,
            version=version_number,
            created_by=request.user
        )
    if  attachment:
        filename = f'Excitech-Australia-Quotation-{leadquote.id}-{leadquote.version}.pdf'
        leadquote.attachment.save(filename, attachment)
        # leadquote.attachment.save(f'{leadquote.id}-attachment.pdf', attachment)
    messages.success(request, 'Lead Quote Added Successfully.')
    return redirect('leads:Lead_Quotation_list')
# def Lead_Quotation_list(request):
    
#     leads=Lead.objects.filter(deleted_at__isnull=True )
#     lead_id = request.GET.get('lead_id')
#     lead_quotes=Lead_Quote.objects.filter(deleted_at__isnull=True )
#     if lead_id:
#             lead_quotes = lead_quotes.objects.filter(Q(lead__id=lead_id) )
    
#     # dd(lead_quotes);
#     return render(request,'pages/leads/quote_list.html', {'leads':leads,'lead_quotes': lead_quotes})
@login_required
def Lead_Quotation_list(request):
    
    lead_id = request.GET.get('lead_id')
    
    if is_admin(request.user):
        leads = Lead.objects.filter(deleted_at__isnull=True)
    elif  '2' in request.user.get_role :
        assigned_to = User.objects.get(id=request.user.id)
        leads = Lead.objects.filter(deleted_at__isnull=True,assigned_to=assigned_to)
        
    if is_admin(request.user):
        lead_quotes = Lead_Quote.objects.filter(deleted_at__isnull=True)
    elif  '2' in request.user.get_role :
        assigned_to = User.objects.get(id=request.user.id)
        lead_quotes = Lead_Quote.objects.filter(deleted_at__isnull=True,lead__assigned_to=assigned_to)
        # customer = Lead.objects.filter(assigned_to=assigned_to, deleted_by__isnull=True)
    

    if lead_id:
        lead_quotes = lead_quotes.filter(Q(lead__id=lead_id))
    

    return render(request, 'pages/leads/quote_list.html', {
        'leads': leads,
        'lead_quotes': lead_quotes
    })

@login_required
def Lead_Quotation_list_by_lead(request,lead_id):
    
    if is_admin(request.user):
        leads = Lead.objects.filter(deleted_at__isnull=True,id=lead_id)
    elif  '2' in request.user.get_role :
        assigned_to = User.objects.get(id=request.user.id)
        leads = Lead.objects.filter(deleted_at__isnull=True,assigned_to=assigned_to,id=lead_id)
        
    if is_admin(request.user):
        lead_quotes = Lead_Quote.objects.filter(deleted_at__isnull=True,lead_id=lead_id)
    elif  '2' in request.user.get_role :
        assigned_to = User.objects.get(id=request.user.id)
        lead_quotes = Lead_Quote.objects.filter(deleted_at__isnull=True,lead__assigned_to=assigned_to,lead_id=lead_id)
        # customer = Lead.objects.filter(assigned_to=assigned_to, deleted_by__isnull=True)
    

    # if lead_id:
    #     lead_quotes = lead_quotes.filter(Q(lead__id=lead_id))

    return render(request, 'pages/leads/quote_list.html', {
        'leads': leads,
        'lead_quotes': lead_quotes
    })
def edit_quote(request):
    dd('edit_quote')
@login_required
def delete_customer(request, id):
    customer = Lead.objects.get(id=id)
    customer.deleted_by = request.user  
    customer.delete()
    
    
    messages.success(request, 'Lead Deleted Successfully.')
    return redirect('leads:list')
def send_lead_note_email(request, lead_id, note_id):
    lead = get_object_or_404(Lead, id=lead_id)
    note = get_object_or_404(Leadnote, id=note_id, lead=lead)

    if not lead.email:
        messages.error(request, 'Lead has no email address.')
        return redirect(request.META.get('HTTP_REFERER', '/'))

    subject = f'EXCITECH Australia - Meeting Scheduled for {lead.first_name } {lead.last_name}'
    context = {
        'lead': lead,
        'note': note,
    }
    message = render_to_string('pages/leads/lead_note_email.html', context)
    from_email = settings.FROM_EMAIL
    try:
        email = EmailMessage(subject, message, from_email, [lead.email])
        email.content_subtype = 'html'  # To send HTML content
        email.send()
        note.mail_status=1
        note.save()
        messages.success(request, 'Note email sent successfully.')
    except Exception as e:
        messages.error(request, f'Failed to send email: {e}')

    return redirect(request.META.get('HTTP_REFERER', '/')) 
def send_quotation_mail_lead(request,id,):
    leadquote = get_object_or_404(Lead_Quote, id=id)
    # quotationitem = QuotationItem.objects.filter(quotation=quotation)
    lead = Lead.objects.get(id=leadquote.lead.id)
    # quotation_detail_url = request.build_absolute_uri(reverse('quotation:view_quotation_detail', args=[quotation.id]))
    if lead.company_name:
        name_part = lead.company_name
    else:
        name_part = f"{lead.first_name} {lead.last_name}"
    
    subject = f"EXCITECH Australia - Quotation for {name_part}"
    confirm=True
    template_data = {'quotation': leadquote}
    message = render_to_string('pages/leads/quote_email_temp.html', template_data)

    # message += "Please find attached Quote."
    
    from_email = settings.FROM_EMAIL
 
    recipient_email = lead.email 
    cc_email=settings.ADMIN_EMAIL_CC_PO # settings.ADMIN_EMAIL
    email = EmailMessage(subject, message, from_email, [recipient_email],cc_email)
    
    if email:
       pdf_file_path = leadquote.attachment.path
       email.attach_file(pdf_file_path, 'application/pdf')
       email.content_subtype = 'html'
       email.send()
       
    #   get_registration_token = get_object_or_404(FCMDevice,user_id=customer.user.id)
    #   sendPush('Quote Confirmation Notification',f'EXCITECH Australia - Quote Confirmation Required for Quote ID {quotation.id}',[get_registration_token.registration_id])
       leadquote.mailstatus=1
       
       leadquote.save()
       
       print("------------------")
       print("send mail",email)
       messages.success(request, 'Mail Sent Successfully.')
       return redirect(request.META.get('HTTP_REFERER', '/'))
    else:
        messages.error(request, 'Failed To Send Mail.')
        return redirect('leads:Lead_Quotation_list')
def CustToLeadInsert(request):
    customers = Customer.objects.all()
    existing_emails = set(Lead.objects.values_list('email', flat=True))

    for customer in customers:
        if customer.email and customer.email not in existing_emails:
            Lead.objects.create(
                company_name=customer.company_name,
                first_name=customer.first_name,
                last_name=customer.last_name,
                email=customer.email,
                mobile=customer.phone1,
                work_phone=customer.phone2,
                city=customer.city,
                state=customer.state,
                post_code=customer.post_code,
                country=customer.country,
                website=customer.website,
                contact_name=customer.contact_name,
                salutation=customer.salutation,
                abn=customer.abn,
                is_active=customer.is_active,
                is_individual=customer.is_individual,
                created_at=customer.created_at or timezone.now(),
                updated_at=customer.updated_at or timezone.now(),
                created_by_id=customer.created_by_id,
                updated_by_id=customer.updated_by_id,
                # lead_source=customer.business_type,  # if this maps logically
                # Add other fields if required
            )
            