"""
PM Module — HRM Event Handlers

هندلرهای رویدادهای HRM که ماژول PM به آنها گوش می‌دهد.
manifest.json declares: consumes: ["hrm.employee.hired", "hrm.employee.terminated", "hrm.employee.transferred"]
"""

import logging
from typing import Optional
from uuid import UUID

from apps.core.event_bus.events import event_bus, BaseEvent

logger = logging.getLogger(__name__)


def handle_employee_hired(event: BaseEvent) -> None:
    """
    هنگام استخدام کارمند جدید در HRM:
    - ایجاد یا فعال‌سازی Resource مرتبط در PM (اختیاری)
    """
    tenant_id = event.tenant_id
    data = event.metadata if hasattr(event, 'metadata') else {}
    employee_id = data.get("employee_id")
    employee_name = data.get("full_name", "")

    logger.info(
        "pm.hrm_handler.employee_hired: tenant=%s employee=%s name=%s",
        tenant_id, employee_id, employee_name,
    )

    # NOTE: Auto-creation of PM Resource from HRM Employee is optional.
    # Organizations may choose to manually map employees to PM resources.
    # If auto-sync is desired, uncomment and implement:
    #
    # from ...infrastructure.repositories import DjangoResourceRepository
    # repo = DjangoResourceRepository(UUID(tenant_id))
    # existing = repo.find_by_employee(UUID(employee_id))
    # if not existing:
    #     resource = Resource(...)
    #     repo.save(resource)


def handle_employee_terminated(event: BaseEvent) -> None:
    """
    هنگام ترک خدمت کارمند:
    - غیرفعال‌سازی Resource مرتبط (اگر sync شده باشد)
    - اطلاع‌رسانی به مدیران پروژه‌هایی که کارمند در آنها فعال است
    """
    tenant_id = event.tenant_id
    data = event.metadata if hasattr(event, 'metadata') else {}
    employee_id = data.get("employee_id")

    logger.info(
        "pm.hrm_handler.employee_terminated: tenant=%s employee=%s",
        tenant_id, employee_id,
    )

    # NOTE: Implement resource deactivation when needed.
    # from ...infrastructure.repositories import DjangoResourceRepository
    # repo = DjangoResourceRepository(UUID(tenant_id))
    # resource = repo.find_by_employee(UUID(employee_id))
    # if resource:
    #     resource.is_active = False
    #     repo.save(resource)


def handle_employee_transferred(event: BaseEvent) -> None:
    """
    هنگام جابه‌جایی کارمند بین واحدهای سازمانی:
    - به‌روزرسانی اطلاعات Resource مرتبط
    """
    tenant_id = event.tenant_id
    data = event.metadata if hasattr(event, 'metadata') else {}
    employee_id = data.get("employee_id")
    new_org_unit_id = data.get("new_org_unit_id")

    logger.info(
        "pm.hrm_handler.employee_transferred: tenant=%s employee=%s new_org_unit=%s",
        tenant_id, employee_id, new_org_unit_id,
    )


def register_hrm_event_handlers() -> None:
    """
    ثبت هندلرهای HRM در Event Bus.
    باید در AppConfig.ready() فراخوانی شود.
    """
    # Import HRM contract event types if available
    try:
        from modules.hrm.contracts.v1.events import (
            EmployeeHired,
            EmployeeTerminated,
            EmployeeTransferred,
        )
        event_bus.subscribe(EmployeeHired, handle_employee_hired)
        event_bus.subscribe(EmployeeTerminated, handle_employee_terminated)
        event_bus.subscribe(EmployeeTransferred, handle_employee_transferred)
        logger.info("pm.hrm_handlers: registered successfully")
    except ImportError:
        # HRM module not installed or contracts not available
        logger.debug("pm.hrm_handlers: HRM contracts not available — skipping registration")
