from django.db.models.signals import pre_save, post_save, post_delete
from django.dispatch import receiver
from .models import Blogs
from products.models import FeaturedProducts, Products
import logging
from django.contrib.contenttypes.models import ContentType
from utils.r2.client import R2

LOGGER = logging.getLogger(__name__)


@receiver(post_delete)
def delete_blog_image_banner_in_cloudflare(sender, instance, **kwargs):
    instance: Blogs = instance
    image_banner = getattr(instance, "image_banner", None)

    r2 = R2()

    if image_banner:
        r2.delete_object(image_banner)
        LOGGER.info(f"Deleted image banner for blog: {instance.title}")


@receiver(post_save, sender=Blogs)
def create_featured_products(sender, instance, created, **kwargs):
    featured_products: list[Products] = getattr(instance, "_featured_products", None)

    if featured_products:
        LOGGER.info(f"Adding featured products for blog: {instance.title}")
        new_featured_products_list = []

        blog_content_type = ContentType.objects.get_for_model(Blogs)

        existing_blog_featured_products = FeaturedProducts.objects.filter(
            model=blog_content_type, model_object_id=instance.id
        ).values_list("product__id", flat=True)

        new_featured_ids = {product.id for product in featured_products}
        removed_product_ids = set(existing_blog_featured_products) - new_featured_ids

        for product in featured_products:
            if product.id not in existing_blog_featured_products:
                new_featured_products_list.append(
                    FeaturedProducts(
                        model=blog_content_type,
                        model_object_id=instance.id,
                        product=product,
                    )
                )

        if removed_product_ids:
            FeaturedProducts.objects.filter(
                model=blog_content_type,
                model_object_id=instance.id,
                product__id__in=removed_product_ids,
            ).delete()
            LOGGER.info(f"Deleted featured products removed from blog {instance.title}")

        LOGGER.info(f"Featured products added for blog: {instance.title}")
        FeaturedProducts.objects.bulk_create(new_featured_products_list)
