"""
PPM ← Document Control Event Handlers.

هندل رویدادهای سرویس مدیریت اسناد برای به‌روزرسانی پیوندهای PPM.
"""
import logging

from apps.core.event_bus.events import event_bus

logger = logging.getLogger("apps.ppm")


def register_doc_event_handlers():
    """ثبت هندلرهای رویداد مدیریت اسناد."""
    event_bus.subscribe("document_control.document.deleted", handle_document_deleted)
    event_bus.subscribe("document_control.document.archived", handle_document_archived)
    event_bus.subscribe("document_control.document.approved", handle_document_approved)
    logger.info("[PPM] Document Control event handlers registered.")


def handle_document_deleted(event):
    """
    وقتی سندی حذف (soft-delete) می‌شود، پیوندهای PPM آن را حذف کن.
    """
    from ...infrastructure.persistence.models import PPMDocumentModel

    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:
        qs = PPMDocumentModel.objects.filter(document_id=document_id)
        if tenant_id:
            qs = qs.filter(tenant_id=tenant_id)

        count = qs.count()
        if count > 0:
            qs.delete()
            logger.info(
                "[PPM] Removed %d document link(s) for deleted document %s",
                count, document_id,
            )
    except Exception:
        logger.exception("[PPM] Error handling document.deleted for %s", document_id)


def handle_document_archived(event):
    """
    وقتی سندی آرشیو می‌شود، لاگ کن — PPM لینک‌ها باقی می‌مانند (سند هنوز قابل مشاهده).
    """
    document_id = event.data.get("document_id") or str(event.entity_id)
    logger.info("[PPM] Document %s archived — links preserved.", document_id)


def handle_document_approved(event):
    """
    وقتی سندی تأیید می‌شود، عنوان و کد را در پیوندهای PPM به‌روز کن.
    """
    from ...infrastructure.persistence.models import PPMDocumentModel

    document_id = event.data.get("document_id") or str(event.entity_id)
    tenant_id = str(event.tenant_id) if event.tenant_id else None
    new_title = event.data.get("title")
    new_code = event.data.get("code")

    if not new_title and not new_code:
        return

    try:
        qs = PPMDocumentModel.objects.filter(document_id=document_id)
        if tenant_id:
            qs = qs.filter(tenant_id=tenant_id)

        update_fields = {}
        if new_title:
            update_fields["title"] = new_title
        if new_code:
            update_fields["document_code"] = new_code

        if update_fields:
            count = qs.update(**update_fields)
            if count:
                logger.info(
                    "[PPM] Updated %d document link(s) after approval of %s",
                    count, document_id,
                )
    except Exception:
        logger.exception("[PPM] Error handling document.approved for %s", document_id)
