"""Helper retrigger cho workflow persistence."""

from __future__ import annotations

from typing import Any

from app.models.schemas import (
    DossierReviewSessionRecord,
    WorkflowReviewFindingRequest,
    WorkflowReviewNextActionItem,
    WorkflowReviewStartRequest,
    WorkflowReviewTriggerSummary,
)


class WorkflowPersistenceRetriggerMixin:
    """Mixin cho retrigger/replay."""

    def build_retrigger_request(
        self,
        *,
        review: DossierReviewSessionRecord,
        next_actions: list[WorkflowReviewNextActionItem] | None = None,
        trigger_source: str = "workflow_retrigger",
        metadata: dict[str, Any] | None = None,
    ) -> WorkflowReviewStartRequest:
        """Build request replay ổn định."""
        unresolved_findings: list[WorkflowReviewFindingRequest] = []
        for finding in review.findings:
            if str(finding.status).lower() in {"resolved", "waived", "rejected"}:
                continue
            unresolved_findings.append(
                WorkflowReviewFindingRequest(
                    finding_code=finding.finding_code,
                    finding_group=finding.finding_group,
                    finding_type=finding.finding_type,
                    title=finding.title,
                    description=finding.description,
                    document_type=finding.document_type,
                    dossier_stage=finding.dossier_stage,
                    severity=finding.severity,
                    impact_level=finding.impact_level,
                    responsible_department_code=finding.responsible_department_code,
                    supplement_status=finding.supplement_status,
                    status=finding.status,
                    is_blocking=finding.is_blocking,
                    due_date=finding.due_date,
                    evidences=list(finding.evidences),
                    metadata={
                        **dict(finding.metadata or {}),
                        "retriggered_from_review_id": review.review_id,
                        "retriggered_from_finding_id": finding.finding_id,
                    },
                )
            )

        return WorkflowReviewStartRequest(
            project_code=review.project_code,
            lead_agent_code=review.lead_agent_code or "SYSTEM",
            lead_reviewer_employee_code=review.lead_reviewer_employee_code,
            initiated_by_employee_code=review.initiated_by_employee_code,
            dossier_scope=review.dossier_scope,
            trigger_source=trigger_source,
            status="in_review",
            review_reason=review.review_reason
            or f"Re-trigger workflow từ review {review.review_code}.",
            review_summary=review.review_summary,
            assigned_departments=list(review.assigned_departments),
            findings=unresolved_findings,
            metadata={
                **dict(review.metadata or {}),
                **dict(metadata or {}),
                "retriggered_from_review_id": review.review_id,
                "retriggered_from_review_code": review.review_code,
                "retrigger_planned_action_count": len(next_actions or []),
            },
        )

    def build_retrigger_summary(
        self,
        *,
        review: DossierReviewSessionRecord,
        next_actions: list[WorkflowReviewNextActionItem] | None = None,
    ) -> WorkflowReviewTriggerSummary:
        """Build trigger summary cho replay plan."""
        actions = next_actions or []
        return WorkflowReviewTriggerSummary(
            trigger_source="workflow_retrigger",
            trigger_mode="replay_planning",
            trigger_reason=f"Lập kế hoạch re-trigger cho review {review.review_code}.",
            initiated_by_employee_code=review.initiated_by_employee_code,
            lead_reviewer_employee_code=review.lead_reviewer_employee_code,
            lead_agent_code=review.lead_agent_code,
            project_code=review.project_code,
            dossier_scope=review.dossier_scope,
            assigned_departments=list(review.assigned_departments),
            metadata={
                "source_review_id": review.review_id,
                "source_review_code": review.review_code,
                "open_finding_count": sum(
                    1
                    for item in review.findings
                    if str(item.status).lower()
                    not in {"resolved", "waived", "rejected"}
                ),
                "planned_action_count": len(actions),
                "planned_action_types": self._merge_string_lists(
                    [item.action_type for item in actions if item.action_type]
                ),
            },
        )
