from django.db.models.signals import post_delete, pre_delete
from django.dispatch import receiver
from .models import FeaturedProducts, Products, ProductGallery, NewArrivalProducts
from blogs.models import Blogs
from projects.models import Projects
import logging
from utils.r2.client import R2

LOGGER = logging.getLogger(__name__)


@receiver(post_delete, sender=Blogs)
def delete_blog_related_featured_products(sender, instance, **kwargs):
    instance: Blogs = instance

    featured_products = FeaturedProducts.objects.filter(model_object_id=instance.id)

    if featured_products:
        LOGGER.info(f"Deleting featured products for blog: {instance.title}")
        featured_products.delete()

        LOGGER.info(f"Deleted featured products for blog: {instance.title}")
    else:  # pragma: no cover
        LOGGER.info(f"No featured products found for blog: {instance.title}")


@receiver(post_delete, sender=Projects)
def delete_project_related_featured_products(sender, instance, **kwargs):
    instance: Projects = instance

    featured_products = FeaturedProducts.objects.filter(model_object_id=instance.id)

    if featured_products:
        LOGGER.info(f"Deleting featured products for project: {instance.title}")
        featured_products.delete()

        LOGGER.info(f"Deleted featured products for project: {instance.title}")
    else:  # pragma: no cover
        LOGGER.info(f"No featured products found for project: {instance.title}")


@receiver(pre_delete, sender=Products)
def delete_product_images_and_galleries_in_cloudflare(sender, instance, **kwargs):
    instance: Products = instance
    main_image = getattr(instance, "image_path", None)

    r2 = R2()

    if main_image:
        r2.delete_object(r2_path=main_image)
        LOGGER.info(f"Deleted main image for product: {instance.name}")

    product_galleries = ProductGallery.objects.filter(product=instance)

    if product_galleries:
        images = product_galleries.values_list("image_path", flat=True)
        r2.delete_objects(r2_path_list=images)
        LOGGER.info(
            f"Deleted {len(images)} gallery images for product: {instance.name}"
        )


@receiver(pre_delete, sender=ProductGallery)
def delete_removed_product_images(sender, instance, **kwargs):
    instance: ProductGallery = instance
    image_path = instance.image_path

    r2 = R2()
    r2.delete_object(r2_path=image_path)
    LOGGER.info(f"Deleted gallery image {image_path} of {instance.product.edp_number}")


@receiver(pre_delete, sender=NewArrivalProducts)
def make_product_new_arrival_false(sender, instance, **kwargs):
    instance: NewArrivalProducts = instance
    product = instance.product

    product.is_new_arrival = False
    product.save()
