from __future__ import annotations

from app.models.schemas import (
    WorkflowReviewFindingRequest,
    WorkflowReviewNextActionItem,
    WorkflowReviewPolicyCheckResult,
)


def collect_policy_blocked_reasons(
    policy_checks: list[WorkflowReviewPolicyCheckResult],
) -> list[str]:
    """Gom lý do policy chặn automation."""
    reasons: list[str] = []
    seen: set[str] = set()

    for item in policy_checks:
        for violation in item.violations:
            text = f"{item.scope}: {violation.message}"
            if text not in seen:
                seen.add(text)
                reasons.append(text)

        if item.requires_manual_review:
            text = (
                f"{item.scope}: yêu cầu manual review do risk level {item.risk_level}"
            )
            if text not in seen:
                seen.add(text)
                reasons.append(text)

        if item.circuit_breaker_triggered:
            text = f"{item.scope}: circuit breaker đã kích hoạt"
            if text not in seen:
                seen.add(text)
                reasons.append(text)

    return reasons


def build_manual_follow_up_reason(
    finding: WorkflowReviewFindingRequest,
    finding_policy: WorkflowReviewPolicyCheckResult | None,
    blocking_policy: bool,
) -> str:
    """Tạo lý do follow-up tay dễ đọc."""
    if blocking_policy:
        return "Policy cấp session đang chặn automation cho toàn bộ workflow."
    if finding_policy is None:
        return f"Finding {finding.finding_code} chưa đủ điều kiện để tự động assign."
    if finding_policy.circuit_breaker_triggered:
        return f"Finding {finding.finding_code} bị circuit breaker chặn do dữ liệu mâu thuẫn/thiếu nghiêm trọng."
    if finding_policy.requires_manual_review:
        return f"Finding {finding.finding_code} yêu cầu manual review trước khi tiếp tục automation."
    if not finding_policy.allowed:
        return f"Finding {finding.finding_code} vi phạm policy guardrail."
    return f"Finding {finding.finding_code} cần follow-up thủ công."


def find_policy_for_finding(
    policy_checks: list[WorkflowReviewPolicyCheckResult],
    finding_code: str,
) -> WorkflowReviewPolicyCheckResult | None:
    """Lấy policy theo finding code."""
    expected_scope = f"finding:{finding_code}"
    for item in policy_checks:
        if item.scope == expected_scope:
            return item
    return None


def build_escalation_next_actions(
    *,
    finding: WorkflowReviewFindingRequest,
    finding_id: str,
    policy_result: WorkflowReviewPolicyCheckResult,
) -> list[WorkflowReviewNextActionItem]:
    """Đổi escalation thành next action."""
    items: list[WorkflowReviewNextActionItem] = []
    for target in policy_result.escalation_targets:
        items.append(
            WorkflowReviewNextActionItem(
                scope="finding",
                target_type="finding",
                target_id=finding_id,
                department_code=finding.responsible_department_code,
                owner_employee_code=None,
                title=f"Escalate finding {finding.finding_code} cho agent {target.agent_code}",
                action_type="policy_escalation",
                priority=target.priority,
                reason=target.reason or "Policy yêu cầu escalation.",
                status="queued",
                execution_channel="agent_escalation",
                metadata={
                    "finding_code": finding.finding_code,
                    "agent_code": target.agent_code,
                    **target.metadata,
                },
            )
        )
    return items
