from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.utils.timezone import now

from .models import Product, ProductHistory
from utils.product_utils import product_to_dict, dict_diff

@receiver(pre_save, sender=Product)
def create_product_history_on_change(sender, instance: Product, **kwargs):
    # New record: no previous state to snapshot
    if not instance.pk:
        return

    try:
        current = Product.objects.get(pk=instance.pk)
    except Product.DoesNotExist:
        return

    before = product_to_dict(current)   # DB row (OLD)
    after  = product_to_dict(instance)  # pending (NEW)
    changes = dict_diff(before, after)

    if not changes:
        return  # nothing changed → no history

    last = ProductHistory.objects.filter(product=current).order_by("-version").first()
    next_version = 1 if not last else last.version + 1

    ProductHistory.objects.create(
        product=current,
        version=next_version,
        snapshot=before,
        diff=changes,
        changed_at=now(),
        changed_by=getattr(instance, "_changed_by", None),     # set in view before save
        change_notes=getattr(instance, "_change_notes", ""),
    )
