from __future__ import annotations

from app.models.schemas import (
    WorkflowReviewAssignmentRequest,
    WorkflowReviewCloseRequest,
    WorkflowReviewFindingRequest,
    WorkflowReviewNextActionItem,
)
from app.modules.core.application.workflow_persistence.helpers import (
    infer_assigned_employee_code,
    map_priority,
)


def build_post_close_actions(
    *,
    request: WorkflowReviewStartRequest,
    review_id: str,
    review_code: str,
) -> list[WorkflowReviewNextActionItem]:
    """Tạo backlog hậu close."""
    items: list[WorkflowReviewNextActionItem] = []

    for finding in request.findings:
        if finding.metadata.get("skip_post_close"):
            continue

        priority = map_priority(
            finding.severity, finding.impact_level, finding.is_blocking
        )
        owner_employee_code = (
            infer_assigned_employee_code(finding) or request.lead_reviewer_employee_code
        )
        shared_metadata = {
            "review_id": review_id,
            "review_code": review_code,
            "project_code": request.project_code,
            "finding_code": finding.finding_code,
            "post_close_source": "workflow_persistence_service",
            "dossier_stage": finding.dossier_stage,
            "document_type": finding.document_type,
        }

        items.append(
            WorkflowReviewNextActionItem(
                scope="post_close",
                target_type="review",
                target_id=review_id,
                department_code=finding.responsible_department_code,
                owner_employee_code=owner_employee_code,
                title=f"Theo dõi hậu đóng review cho finding {finding.finding_code}",
                action_type="post_close_monitoring",
                priority=priority,
                reason="Review đã đóng nhưng cần tiếp tục theo dõi vận hành sau verify.",
                status="queued",
                execution_channel="operations_follow_up",
                metadata=shared_metadata,
            )
        )

        if finding.document_type or finding.dossier_stage:
            items.append(
                WorkflowReviewNextActionItem(
                    scope="post_close",
                    target_type="finding",
                    target_id=None,
                    department_code=finding.responsible_department_code,
                    owner_employee_code=owner_employee_code,
                    title=f"Cập nhật backlog hồ sơ sau close cho {finding.finding_code}",
                    action_type="post_close_backlog_projection",
                    priority=priority,
                    reason="Cần phản ánh kết quả review vào backlog vận hành/hồ sơ còn theo dõi.",
                    status="pending",
                    execution_channel="operations_backlog",
                    metadata={
                        **shared_metadata,
                        "backlog_hint": "document_follow_up",
                    },
                )
            )

    unique_items: list[WorkflowReviewNextActionItem] = []
    seen_keys: set[str] = set()
    for item in items:
        key = "|".join(
            [
                item.scope,
                item.action_type,
                item.title,
                str(item.department_code or ""),
                str(item.metadata.get("finding_code") or ""),
            ]
        )
        if key in seen_keys:
            continue
        seen_keys.add(key)
        unique_items.append(item)
    return unique_items


def build_close_payload(review_code: str) -> WorkflowReviewCloseRequest:
    """Tạo payload đóng review."""
    return WorkflowReviewCloseRequest(
        closure_note="Tự động đóng review sau khi toàn bộ findings đã được xác minh.",
        metadata={
            "workflow_mode": "automated_end_to_end",
            "review_code": review_code,
        },
    )


def build_assignment_request(
    *,
    request: WorkflowReviewStartRequest,
    finding: WorkflowReviewFindingRequest,
) -> WorkflowReviewAssignmentRequest:
    """Tạo assignment mặc định."""
    return WorkflowReviewAssignmentRequest(
        assigned_department_code=finding.responsible_department_code,
        assigned_employee_code=infer_assigned_employee_code(finding),
        assigned_by_employee_code=request.lead_reviewer_employee_code
        or request.initiated_by_employee_code,
        status="pending",
        priority=map_priority(
            finding.severity, finding.impact_level, finding.is_blocking
        ),
        due_date=finding.due_date,
        assignment_note=f"Tự động phân công xử lý finding {finding.finding_code}.",
        metadata={
            "assignment_mode": "auto_generated",
            "finding_code": finding.finding_code,
        },
    )
