"""
Strategy ← Document Control Event Handlers.

هندل رویدادهای سرویس مدیریت اسناد برای به‌روزرسانی ارجاعات Strategy.
"""
import logging

from apps.core.event_bus.events import event_bus

logger = logging.getLogger("apps.strategy")


def register_doc_event_handlers():
    """ثبت هندلرهای رویداد مدیریت اسناد."""
    event_bus.subscribe("document_control.document.deleted", handle_document_deleted)
    event_bus.subscribe("document_control.document.approved", handle_document_approved)
    logger.info("[Strategy] Document Control event handlers registered.")


def handle_document_deleted(event):
    """
    وقتی سندی حذف می‌شود، ارجاعات document_id را در Strategy null کن.
    """
    from ...infrastructure.persistence.models import (
        GateDeliverableModel,
        PolicyModel,
    )

    document_id = event.data.get("document_id") or str(event.entity_id)
    tenant_id = str(event.tenant_id) if event.tenant_id else None

    try:
        # پاکسازی ارجاعات GateDeliverable
        gd_qs = GateDeliverableModel.objects.filter(document_id=document_id)
        if tenant_id:
            gd_qs = gd_qs.filter(tenant_id=tenant_id)
        gd_count = gd_qs.update(document_id=None)

        # پاکسازی ارجاعات Policy
        pol_qs = PolicyModel.objects.filter(document_id=document_id)
        if tenant_id:
            pol_qs = pol_qs.filter(tenant_id=tenant_id)
        pol_count = pol_qs.update(document_id=None)

        if gd_count or pol_count:
            logger.info(
                "[Strategy] Cleared document refs for deleted doc %s: "
                "%d deliverables, %d policies",
                document_id, gd_count, pol_count,
            )
    except Exception:
        logger.exception("[Strategy] Error handling document.deleted for %s", document_id)


def handle_document_approved(event):
    """
    وقتی سندی تأیید می‌شود — لاگ اطلاعاتی.
    GateDeliverable و Policy فقط UUID ذخیره می‌کنند، عنوان denormalize نشده.
    """
    document_id = event.data.get("document_id") or str(event.entity_id)
    logger.info("[Strategy] Document %s approved — refs intact.", document_id)
