"""
Strategy Application — PPM Event Handlers.

گوش دادن به رویدادهای ماژول PPM برای همراستایی استراتژیک پورتفولیو.
"""

import logging
from uuid import UUID

from apps.core.event_bus.events import event_bus

logger = logging.getLogger(__name__)


# ─── Portfolio Alignment Handlers ─────────────────

def handle_portfolio_created(event):
    """هنگام ایجاد پورتفولیو — بررسی همراستایی استراتژیک."""
    tenant_id = getattr(event, "tenant_id", None)
    portfolio_id = getattr(event, "portfolio_id", None)
    if not portfolio_id:
        data = getattr(event, "data", {})
        portfolio_id = data.get("portfolio_id") if data else None
    logger.info(
        "Strategy: Portfolio created → checking strategic alignment. "
        "tenant=%s, portfolio=%s",
        tenant_id, portfolio_id,
    )
    if tenant_id and portfolio_id:
        try:
            from ...infrastructure.persistence.models import ObjectiveModel
            active_count = ObjectiveModel.objects.filter(
                tenant_id=tenant_id, status="active",
            ).count()
            logger.info(
                "Strategy: Portfolio %s — %d active objectives available for alignment.",
                portfolio_id, active_count,
            )
        except Exception as exc:
            logger.warning("Strategy: Failed to check alignment: %s", exc)


def handle_portfolio_updated(event):
    """هنگام بروزرسانی پورتفولیو — بازمحاسبه امتیاز تناسب."""
    tenant_id = getattr(event, "tenant_id", None)
    portfolio_id = getattr(event, "portfolio_id", None)
    logger.info(
        "Strategy: Portfolio updated → recalculating strategic fit. "
        "tenant=%s, portfolio=%s",
        tenant_id, portfolio_id,
    )
    if tenant_id and portfolio_id:
        try:
            from ...infrastructure.persistence.models import (
                ObjectivePortfolioAlignmentModel,
            )
            count = ObjectivePortfolioAlignmentModel.objects.filter(
                tenant_id=tenant_id, portfolio_id=portfolio_id, is_active=True,
            ).count()
            logger.info(
                "Strategy: Portfolio %s has %d active alignments.",
                portfolio_id, count,
            )
        except Exception as exc:
            logger.warning("Strategy: Failed to recalculate alignment: %s", exc)


def handle_project_completed(event):
    """هنگام تکمیل پروژه — بررسی تأثیر بر Key Result."""
    tenant_id = getattr(event, "tenant_id", None)
    project_id = getattr(event, "project_id", None)
    if not project_id:
        data = getattr(event, "data", {})
        project_id = data.get("project_id") if data else None
    logger.info(
        "Strategy: Project completed → evaluating key result impact. "
        "tenant=%s, project=%s",
        tenant_id, project_id,
    )
    if tenant_id and project_id:
        try:
            from ...infrastructure.persistence.models import KeyResultModel
            krs = KeyResultModel.objects.filter(
                tenant_id=tenant_id, status="active",
                metadata__linked_project_id=str(project_id),
            )
            for kr in krs:
                logger.info(
                    "Strategy: KR '%s' linked to completed project %s — progress update needed.",
                    kr.title, project_id,
                )
        except Exception as exc:
            logger.warning("Strategy: Failed to evaluate KR impact: %s", exc)


def handle_scoring_completed(event):
    """هنگام اتمام امتیازدهی — بروزرسانی امتیاز تناسب استراتژیک."""
    tenant_id = getattr(event, "tenant_id", None)
    portfolio_id = getattr(event, "portfolio_id", None)
    logger.info(
        "Strategy: Scoring completed → updating alignment scores. "
        "tenant=%s, portfolio=%s",
        portfolio_id, tenant_id,
    )
    if tenant_id and portfolio_id:
        try:
            from ...infrastructure.persistence.models import (
                ObjectivePortfolioAlignmentModel,
            )
            count = ObjectivePortfolioAlignmentModel.objects.filter(
                tenant_id=tenant_id, portfolio_id=portfolio_id, is_active=True,
            ).count()
            logger.info(
                "Strategy: %d alignments to re-evaluate for portfolio %s.",
                count, portfolio_id,
            )
        except Exception as exc:
            logger.warning("Strategy: Failed to update alignment scores: %s", exc)


# ─── Event Subscriptions ─────────────────────────

def register_ppm_event_handlers():
    """ثبت Event Handler‌ها برای رویدادهای PPM."""
    event_bus.subscribe("ppm.portfolio.created", handle_portfolio_created)
    event_bus.subscribe("ppm.portfolio.updated", handle_portfolio_updated)
    event_bus.subscribe("pm.project.completed", handle_project_completed)
    event_bus.subscribe("ppm.scoring.completed", handle_scoring_completed)
    logger.info("Strategy: PPM event handlers registered.")
