from django.contrib.auth.signals import user_logged_in
from django.dispatch import receiver
from django.conf import settings
from .models import Cart, CartItem
from product.models import Product

@receiver(user_logged_in)
def merge_cart_on_login(sender, user, request, **kwargs):
    """
    Kullanıcı giriş yaptığında session sepetini veritabanı sepetiyle birleştirir.
    """
    session_cart = request.session.get(settings.CART_SESSION_ID)
    
    if session_cart:
        # Kullanıcının DB sepetini al veya oluştur
        db_cart, created = Cart.objects.get_or_create(user=user)
        
        for product_id, item_data in session_cart.items():
            quantity = item_data['quantity']
            product = Product.objects.get(id=product_id)
            
            # Ürün zaten DB sepetinde var mı?
            cart_item, item_created = CartItem.objects.get_or_create(cart=db_cart, product=product)
            
            if not item_created:
                # Varsa miktarı artır
                cart_item.quantity += quantity
            else:
                # Yoksa miktarı ayarla (default 1 olduğu için üzerine eklemiyoruz, direkt atıyoruz ama get_or_create default ile oluşturduysa quantity 1 olabilir, o yüzden dikkat)
                # get_or_create default=1 ile oluşturur. Biz session'dan geleni kullanmalıyız.
                # Ancak item_created True ise yeni oluştu demektir ve default değeri almıştır.
                # Bizim session'daki quantity'yi atamamız lazım.
                cart_item.quantity = quantity
            
            cart_item.save()
            
        # Session sepetini temizle
        del request.session[settings.CART_SESSION_ID]
        request.session.modified = True
