import logging

from django.contrib import admin
from django.db import transaction

from .models import Product, PricingRule
from products.services.digistore_service import DigistoreService
from products.services.product_service import ProductService

logger = logging.getLogger(__name__)


# ===============================
# INLINE
# ===============================

class PricingRuleInline(admin.TabularInline):
    model = PricingRule
    extra = 1


# ===============================
# ADMIN
# ===============================

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = (
        "shopify_product_id",
        "digistore_product_id",
        "digistore_paymentplan_id",
        "title",
        "created_at",
        "is_volume_pricing_enabled",
    )
    search_fields = ("shopify_product_id", "digistore_product_id", "title")
    inlines = [PricingRuleInline]

    actions = ["enable_volume_pricing", "disable_volume_pricing"]

    def has_add_permission(self, request, obj=None):
        return False

    # ===============================
    # BULK ACTIONS
    # ===============================

    def enable_volume_pricing(self, request, queryset):
        updated = 0

        for product in queryset:
            if product.is_volume_pricing_enabled:
                continue

            product.is_volume_pricing_enabled = True
            product.save(update_fields=["is_volume_pricing_enabled"])

            self._sync_product(product)
            updated += 1

        self.message_user(request, f"✅ Enabled volume pricing for {updated} products")

    enable_volume_pricing.short_description = "Enable Volume Pricing"

    def disable_volume_pricing(self, request, queryset):
        updated = 0

        for product in queryset:
            if not product.is_volume_pricing_enabled:
                continue

            product.is_volume_pricing_enabled = False
            product.save(update_fields=["is_volume_pricing_enabled"])

            self._sync_product(product)
            updated += 1

        self.message_user(request, f"❌ Disabled volume pricing for {updated} products")

    disable_volume_pricing.short_description = "Disable Volume Pricing"

    # ===============================
    # CORE SYNC LOGIC (SINGLE SOURCE)
    # ===============================

    def _sync_product(self, product: Product):
        """
        Single place to sync:
        - Digistore volume pricing
        - Shopify metafields
        """

        if not product.digistore_product_id:
            logger.warning(
                "Skipping sync — no Digistore ID",
                extra={"product_id": product.id},
            )
            product.sync_error = "Missing Digistore product id (volume pricing sync skipped)"
            product.save(update_fields=["sync_error", "updated_at"])
            return

        try:
            rules = list(product.pricing_rules.filter(is_active=True))

            logger.info(
                "🚀 Syncing product",
                extra={
                    "product_id": product.id,
                    "rules": [f"{r.quantity}x@{r.unit_price}" for r in rules],
                    "enabled": product.is_volume_pricing_enabled,
                },
            )

            # 🔥 DIGISTORE SYNC
            DigistoreService.sync_volume_discounts(
                int(product.digistore_product_id),
                rules,
                is_enabled=bool(product.is_volume_pricing_enabled),
                currency=(product.raw_payload or {}).get("currency") or "EUR",
            )

            # 🔥 SHOPIFY SYNC
            ProductService.sync_shopify_metafields_for_product(product)

            logger.info(
                "✅ Sync completed",
                extra={"product_id": product.id},
            )

        except Exception as exc:
            logger.exception(
                "❌ Sync failed",
                extra={
                    "product_id": product.id,
                    "error": str(exc),
                },
            )
            msg = str(exc)
            if len(msg) > 8000:
                msg = msg[:7997] + "..."
            product.refresh_from_db()
            product.sync_error = msg
            product.save(update_fields=["sync_error", "updated_at"])

    # ===============================
    # ADMIN SAVE HOOK (FIXED)
    # ===============================

    def save_related(self, request, form, formsets, change):
        """
        Called AFTER:
        - Product saved
        - ALL inline PricingRules saved

        Ensures:
        - Sync runs only once
        - No duplicate signal calls
        """

        super().save_related(request, form, formsets, change)

        product = form.instance

        logger.info(
            "🔥 Admin save_related triggered",
            extra={"product_id": product.id},
        )

        # 🔥 Run once after DB commit (important)
        transaction.on_commit(lambda: self._sync_product(product))