from __future__ import annotations

from app.models.schemas import (
    WorkflowReviewEmployeeActionRequest,
    WorkflowReviewFindingRequest,
    WorkflowReviewNextActionItem,
    WorkflowReviewSubmissionRequest,
    WorkflowReviewVerificationRequest,
)
from app.modules.core.application.workflow_persistence.helpers import (
    infer_assigned_employee_code,
    map_priority,
)


def build_auto_submission(
    *,
    request: WorkflowReviewStartRequest,
    finding: WorkflowReviewFindingRequest,
    assignment: dict[str, str],
) -> WorkflowReviewSubmissionRequest:
    """Tạo payload nộp bổ sung tự động."""
    return WorkflowReviewSubmissionRequest(
        submission_type="document_bundle",
        submitted_by_employee_code=assignment.get("assigned_employee_code")
        or request.lead_reviewer_employee_code
        or request.initiated_by_employee_code,
        submission_note=f"Tự động ghi nhận bổ sung cho finding {finding.finding_code}.",
        attachment_count=max(1, len(finding.evidences) or 1),
        submitted_payload={
            "finding_code": finding.finding_code,
            "finding_title": finding.title,
            "document_type": finding.document_type,
            "dossier_stage": finding.dossier_stage,
            "supplement_status": "submitted",
        },
        metadata={
            "submission_mode": "auto_generated",
            "review_project_code": request.project_code,
        },
    )


def build_auto_verification(
    *,
    request: WorkflowReviewStartRequest,
    finding: WorkflowReviewFindingRequest,
    assignment: dict[str, str],
) -> WorkflowReviewVerificationRequest:
    """Tạo payload verify tự động."""
    return WorkflowReviewVerificationRequest(
        verification_result="accepted",
        verification_note=f"Tự động xác minh finding {finding.finding_code} đã đủ điều kiện đóng.",
        verified_by_employee_code=request.lead_reviewer_employee_code
        or request.initiated_by_employee_code
        or assignment.get("assigned_by_employee_code")
        or assignment.get("assigned_employee_code"),
        resolution_note=f"Finding {finding.finding_code} được đánh dấu resolved trong workflow tự động.",
        metadata={
            "verification_mode": "auto_generated",
            "review_project_code": request.project_code,
        },
    )


def build_automation_employee_actions(
    *,
    finding: WorkflowReviewFindingRequest,
    assignment: dict[str, str],
    request: WorkflowReviewStartRequest,
) -> list[WorkflowReviewEmployeeActionRequest]:
    """Sinh action nhân sự do automation tạo."""
    assigned_employee_code = assignment.get(
        "assigned_employee_code"
    ) or infer_assigned_employee_code(finding)
    priority = map_priority(finding.severity, finding.impact_level, finding.is_blocking)

    return [
        WorkflowReviewEmployeeActionRequest(
            employee_code=assigned_employee_code
            or request.lead_reviewer_employee_code
            or "SYSTEM",
            role_title="Điều phối workflow",
            agent_role="workflow_automation",
            department_code=assignment.get("assigned_department_code")
            or finding.responsible_department_code,
            action=f"Tự động phân công xử lý {finding.finding_code}",
            status="in_progress",
            summary=f"Finding {finding.title} đã được tự động giao xử lý.",
            priority=priority,
            role_group=assignment.get("assigned_department_code")
            or finding.responsible_department_code,
            next_priority="Chuẩn bị hồ sơ bổ sung để xác minh.",
            findings=[finding.title],
            missing_items=[finding.document_type] if finding.document_type else [],
            notes=[
                assignment.get("assignment_note")
                or "Workflow tự động đã tạo assignment."
            ],
            metadata={
                "action_type": "task_update",
                "finding_code": finding.finding_code,
            },
        ),
        WorkflowReviewEmployeeActionRequest(
            employee_code=assigned_employee_code
            or request.lead_reviewer_employee_code
            or "SYSTEM",
            role_title="Điều phối workflow",
            agent_role="workflow_automation",
            department_code=assignment.get("assigned_department_code")
            or finding.responsible_department_code,
            action=f"Tự động nộp bổ sung cho {finding.finding_code}",
            status="in_progress",
            summary=f"Đã ghi nhận bổ sung hồ sơ cho finding {finding.title}.",
            priority=priority,
            role_group=assignment.get("assigned_department_code")
            or finding.responsible_department_code,
            next_priority="Chờ bước xác minh hoàn tất.",
            findings=[finding.title],
            missing_items=[],
            notes=["Bổ sung được hệ thống ghi nhận tự động."],
            metadata={
                "action_type": "progress_update",
                "finding_code": finding.finding_code,
            },
        ),
        WorkflowReviewEmployeeActionRequest(
            employee_code=request.lead_reviewer_employee_code
            or assigned_employee_code
            or "SYSTEM",
            role_title="Lead reviewer",
            agent_role=request.lead_agent_code,
            department_code=finding.responsible_department_code,
            action=f"Tự động xác minh và đóng {finding.finding_code}",
            status="completed",
            summary=f"Finding {finding.title} đã được xác minh xong.",
            priority=priority,
            role_group=finding.responsible_department_code,
            next_priority="Theo dõi next actions hậu kiểm nếu còn.",
            progress_percent=100,
            completed_count=1,
            findings=[finding.title],
            notes=["Workflow tự động đã xác minh finding."],
            ai_result=[f"Resolved finding {finding.finding_code}"],
            metadata={
                "action_type": "ai_analysis",
                "finding_code": finding.finding_code,
            },
        ),
    ]


def build_next_actions(
    *,
    request: WorkflowReviewStartRequest,
    finding: WorkflowReviewFindingRequest,
    finding_id: str,
    assignment: dict[str, str] | None,
) -> list[WorkflowReviewNextActionItem]:
    """Sinh next action cho finding."""
    if assignment:
        return [
            WorkflowReviewNextActionItem(
                scope="review",
                target_type="session",
                target_id=None,
                department_code=finding.responsible_department_code,
                owner_employee_code=request.lead_reviewer_employee_code,
                title=f"Theo dõi hậu kiểm finding {finding.finding_code}",
                action_type="post_verification_monitoring",
                priority=map_priority(
                    finding.severity, finding.impact_level, finding.is_blocking
                ),
                reason="Finding đã được auto-resolve nhưng vẫn cần theo dõi các bước vận hành tiếp theo.",
                metadata={
                    "finding_id": finding_id,
                    "finding_code": finding.finding_code,
                    "project_code": request.project_code,
                },
            )
        ]

    return [
        WorkflowReviewNextActionItem(
            scope="finding",
            target_type="finding",
            target_id=finding_id,
            department_code=finding.responsible_department_code,
            owner_employee_code=infer_assigned_employee_code(finding),
            title=f"Phân công thủ công cho finding {finding.finding_code}",
            action_type="manual_assignment_required",
            priority=map_priority(
                finding.severity, finding.impact_level, finding.is_blocking
            ),
            reason="Finding chưa có assignment hợp lệ để hệ thống tự động xử lý tiếp.",
            status="pending",
            execution_channel="human_review",
            metadata={
                "finding_code": finding.finding_code,
                "project_code": request.project_code,
            },
        )
    ]
