from __future__ import annotations

from typing import Any

from app.models.schemas import (
    WorkflowReviewPolicyCheckResult,
    WorkflowReviewStartRequest,
)

from .finding_policy import FindingPolicyMixin
from .session_policy import SessionPolicyMixin


class WorkflowPolicyService(
    SessionPolicyMixin,
    FindingPolicyMixin,
):
    """Evaluate workflow guardrails before auto-processing dossier review findings."""

    def evaluate_start_request(
        self, request: WorkflowReviewStartRequest
    ) -> list[WorkflowReviewPolicyCheckResult]:
        """Return ordered policy checks for the workflow request and each finding."""
        results: list[WorkflowReviewPolicyCheckResult] = [
            self._evaluate_session_policy(request),
        ]
        for finding in request.findings:
            results.append(self._evaluate_finding_policy(request, finding))
        return results

    def summarize_policy_outcome(
        self, results: list[WorkflowReviewPolicyCheckResult]
    ) -> dict[str, Any]:
        """Build compact policy summary metadata for workflow persistence."""
        blocked_scopes = [item.scope for item in results if not item.allowed]
        escalated_scopes = [item.scope for item in results if item.requires_escalation]
        manual_review_scopes = [
            item.scope for item in results if item.requires_manual_review
        ]
        circuit_breaker_scopes = [
            item.scope for item in results if item.circuit_breaker_triggered
        ]
        highest_risk = "low"
        for item in results:
            if item.risk_level == "high":
                highest_risk = "high"
                break
            if item.risk_level == "medium":
                highest_risk = "medium"

        return {
            "policy_check_count": len(results),
            "blocked_scopes": blocked_scopes,
            "escalated_scopes": escalated_scopes,
            "highest_risk_level": highest_risk,
            "manual_review_scopes": manual_review_scopes,
            "circuit_breaker_scopes": circuit_breaker_scopes,
        }
