from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
from .models import ActivityLog,User
from user.models import UserInfo
from customer.models import Customer
from supplier.models import Supplier,Supplier_Bill_Item,Supplier_Bill,Supplier_Payment
from quotation.models import Quotation,QuotationItem,QuotationVersion,Confirm_Quote,Invoice,InvoiceItem,InvoicePdf,Customer_Payment,ContractOfSale,Order,Order_Item,SerialNumber,Technician_Assigned_Order_Item,Technician_Comment,WorkOrderService,WorkOrder
from service.models import Service,Service_Request_image,Heading,SubHeading,Question
from product.models import Product,ProductCategory
from technician.models import Job_Time,CallDetail
from django.contrib.auth import get_user
import json
from leads.models import Lead,Leadnote,LeadAttachmentPhotos,LeadAttachmentFiles



# @receiver(post_save, sender=UserInfo)
# def log_userinfo_change(sender, instance, created, **kwargs):
#     if created:
#         action = f'Created UserInfo: {instance}'
#     elif instance.soft_deleted:
#         action = f'Deleted UserInfo: {instance}'
#     else:
#         action = f'Updated UserInfo: {instance}'c

#     ActivityLog.objects.create(user=instance.user, action=action)

# @receiver(pre_delete, sender=UserInfo)
# def log_userinfo_soft_delete(sender, instance, using, **kwargs):
#     action = f'Deleted UserInfo: {instance}'
#     ActivityLog.objects.create(user=instance.user, action=action)

from django.core import serializers

MODEL_SIGNAL_HANDLERS = {


 
    UserInfo: {
        'verbose_name': 'UserInfo',
        'signal_handlers': (post_save, pre_delete),
    },

    Lead: {
    'verbose_name': 'Lead',
    'signal_handlers': (post_save, pre_delete),
    },
    
    Leadnote: {
    'verbose_name': 'Leadnote',
    'signal_handlers': (post_save, pre_delete),
    },
    
    LeadAttachmentPhotos: {
    'verbose_name': 'LeadAttachmentPhotos',
    'signal_handlers': (post_save, pre_delete),
    },
    
    LeadAttachmentFiles: {
    'verbose_name': 'LeadAttachmentFiles',
    'signal_handlers': (post_save, pre_delete),
    },
    
    Product: {
        'verbose_name': 'Product',
        'signal_handlers': (post_save, pre_delete),
    },

   
    ProductCategory: {
        'verbose_name': 'ProductCategory',
        'signal_handlers': (post_save, pre_delete),
    },


    Quotation: {
        'verbose_name': 'Quotation',
        'signal_handlers': (post_save, pre_delete),
    },
     QuotationItem: {
        'verbose_name': 'QuotationItem',
        'signal_handlers': (post_save, pre_delete),
    },

     QuotationVersion: {
        'verbose_name': 'QuotationVersion',
        'signal_handlers': (post_save, pre_delete),
    },

     Confirm_Quote: {
        'verbose_name': 'Confirm_Quote',
        'signal_handlers': (post_save, pre_delete),
    },

     Invoice: {
        'verbose_name': 'Invoice',
        'signal_handlers': (post_save, pre_delete),
    },


     InvoiceItem: {
        'verbose_name': 'InvoiceItem',
        'signal_handlers': (post_save, pre_delete),
    },

     InvoicePdf: {
        'verbose_name': 'InvoicePdf',
        'signal_handlers': (post_save, pre_delete),
    },

    Customer: {
    'verbose_name': 'Customer',
    'signal_handlers': (post_save, pre_delete),
    },
    
    
    
    Customer_Payment: {
    'verbose_name': 'Customer_Payment',
    'signal_handlers': (post_save, pre_delete),
    },


    Supplier: {
        'verbose_name': 'Supplier',
        'signal_handlers': (post_save, pre_delete),
    },
     Supplier_Bill: {
        'verbose_name': 'Supplier_Bill',
        'signal_handlers': (post_save, pre_delete),
    },

    #  Supplier_Bill_Item: {
    #     'verbose_name': 'Supplier_Bill_Item',
    #     'signal_handlers': (post_save, pre_delete),
    # },

     Supplier_Payment: {
        'verbose_name': 'Supplier_Payment',
        'signal_handlers': (post_save, pre_delete),
    },



    ContractOfSale: {
        'verbose_name': 'ContractOfSale',
        'signal_handlers': (post_save, pre_delete),
    },

    Order: {
        'verbose_name': 'Order',
        'signal_handlers': (post_save, pre_delete),
    },
    Order_Item: {
        'verbose_name': 'Order_Item',
        'signal_handlers': (post_save, pre_delete),
    },

    SerialNumber: {
            'verbose_name': 'SerialNumber',
            'signal_handlers': (post_save, pre_delete),
        },
    
    WorkOrder: {
            'verbose_name': 'WorkOrder',
            'signal_handlers': (post_save, pre_delete),
        },
        
    WorkOrderService: {
            'verbose_name': 'WorkOrderService',
            'signal_handlers': (post_save, pre_delete),
        },
 
     
    
    #   SerialNumber: {
    #         'verbose_name': 'SerialNumber',
    #         'signal_handlers': (post_save, pre_delete),
    #     },

    # Order_Item: {
    #     'verbose_name': 'Order_Item',
    #     'signal_handlers': (post_save, pre_delete),
    # },


    Technician_Assigned_Order_Item: {
        'verbose_name': 'Technician_Assigned_Order_Item',
        'signal_handlers': (post_save, pre_delete),
    },

    Technician_Comment: {
        'verbose_name': 'Technician_Comment',
        'signal_handlers': (post_save, pre_delete),
    },

    Service: {
        'verbose_name': 'Service',
        'signal_handlers': (post_save, pre_delete),
    },

    Service_Request_image: {
        'verbose_name': 'Service_Request_image',
        'signal_handlers': (post_save, pre_delete),
    },

    

    Job_Time: {
        'verbose_name': 'Job_Time',
        'signal_handlers': (post_save, pre_delete),
    },

    CallDetail: {
        'verbose_name': 'CallDetail',
        'signal_handlers': (post_save, pre_delete),
    },




}


@receiver(post_save)
def log_model_change_on_post_save(sender, instance, created, **kwargs):
    # dd(instance);
    model_info = MODEL_SIGNAL_HANDLERS.get(sender)
    # dd(model_info);
    if not model_info:
        return

    if created:
        action = 'Created'
    elif hasattr(instance, 'soft_deleted') and instance.soft_deleted:
        action = 'Deleted'
    else:
        action = 'Updated'
    # dd(action)
    # Pass the user as an argument to the signal handler
    user = get_user(instance)

    new_data = json.loads(serializers.serialize('json', [instance]))

    if created or action == 'Deleted':
        old_data = ''
    else:
        try:
            latest_activity_log = ActivityLog.objects.filter(instance_id=instance.pk).latest('timestamp')
            old_data = latest_activity_log.new_data
        except ActivityLog.DoesNotExist:
            old_data = ''

    ActivityLog.objects.create(
        user=user,
        action=action,
        model_name=model_info['verbose_name'],
        instance_id=instance.pk,
        instance_str=str(instance),
        old_data=old_data,
        new_data=new_data
    )

@receiver(pre_delete)
def log_model_change_on_pre_delete(sender, instance, **kwargs):
    model_info = MODEL_SIGNAL_HANDLERS.get(sender)
    if not model_info:
        return

    action = 'Deleted'

    # Pass the user as an argument to the signal handler
    user = get_user(instance)
    

    ActivityLog.objects.create(
        user=user,
        action=action,
        model_name=model_info['verbose_name'],
        instance_id=instance.pk,
        instance_str=str(instance)
    )

# Define a function to get the user based on the instance or request
def get_user(instance):
    # dd(instance)
    if instance.updated_by:
        return instance.updated_by
    elif instance.deleted_by:
        return instance.deleted_by
    # elif instance.created_by:
    #     dd(instance)
    #     return instance.created_by
    else:
        return instance.updated_by
    
      