from __future__ import annotations

"""Action items extraction from session data."""

from typing import Any

from app.models.schemas import OperationsActionItem

from .actions_post_completion import ActionsPostCompletionMixin


class ActionsBuilderMixin(ActionsPostCompletionMixin):
    """Action items extraction from session mixin."""

    def _build_actions_from_session(
        self, session: dict[str, Any]
    ) -> list[OperationsActionItem]:
        """Map one review session into operational action queue items."""
        items: list[OperationsActionItem] = []
        project_code = str(session.get("project_code") or "")
        review_id = str(session.get("review_id") or "")

        for finding in self._ensure_list(session.get("findings")):
            case_id = self._build_case_id(review_id=review_id, finding=finding)
            assignments = self._ensure_list(finding.get("assignments"))

            if assignments:
                for assignment in assignments:
                    assignment_id = str(assignment.get("assignment_id") or "")
                    status = str(assignment.get("status") or "pending")
                    items.append(
                        OperationsActionItem(
                            action_id=assignment_id or f"{case_id}:assignment",
                            action_code=assignment_id or f"{case_id}:assignment",
                            case_id=case_id,
                            project_code=project_code,
                            review_session_id=review_id or None,
                            finding_code=str(finding.get("finding_code") or "") or None,
                            action_type="assignment_follow_up",
                            title=str(finding.get("title") or "Theo dõi bổ sung hồ sơ"),
                            description=assignment.get("assignment_note")
                            or finding.get("description"),
                            owner_department_code=assignment.get(
                                "assigned_department_code"
                            )
                            or finding.get("responsible_department_code"),
                            owner_employee_code=assignment.get(
                                "assigned_employee_code"
                            ),
                            priority=str(
                                assignment.get("priority")
                                or self._derive_priority(
                                    finding.get("severity"),
                                    finding.get("impact_level"),
                                    finding.get("is_blocking"),
                                )
                            ),
                            due_date=assignment.get("due_date")
                            or finding.get("due_date"),
                            status=status,
                            dependency_refs=[str(finding.get("finding_id"))]
                            if finding.get("finding_id")
                            else [],
                            expected_outcome=self._build_expected_outcome(finding),
                            success_criteria=self._build_success_criteria(finding),
                            requires_human_confirmation=status
                            in {"submitted", "pending_verification"},
                            completion_note=assignment.get("latest_submission_note"),
                            created_at=assignment.get("accepted_at")
                            or finding.get("detected_at"),
                            completed_at=assignment.get("verified_at")
                            or assignment.get("closed_at"),
                            metadata=self._merge_metadata(
                                assignment.get("metadata"),
                                {
                                    "finding_status": finding.get("status"),
                                    "supplement_status": finding.get(
                                        "supplement_status"
                                    ),
                                    "assigned_by_employee_code": assignment.get(
                                        "assigned_by_employee_code"
                                    ),
                                },
                            ),
                        )
                    )
            else:
                items.append(
                    OperationsActionItem(
                        action_id=f"{case_id}:triage",
                        action_code=f"{case_id}:triage",
                        case_id=case_id,
                        project_code=project_code,
                        review_session_id=review_id or None,
                        finding_code=str(finding.get("finding_code") or "") or None,
                        action_type="triage",
                        title=f"Phân công xử lý: {finding.get('title') or 'Dossier finding'}",
                        description=finding.get("description"),
                        owner_department_code=finding.get(
                            "responsible_department_code"
                        ),
                        owner_employee_code=None,
                        priority=self._derive_priority(
                            finding.get("severity"),
                            finding.get("impact_level"),
                            finding.get("is_blocking"),
                        ),
                        due_date=finding.get("due_date"),
                        status="pending",
                        dependency_refs=[str(finding.get("finding_id"))]
                        if finding.get("finding_id")
                        else [],
                        expected_outcome=self._build_expected_outcome(finding),
                        success_criteria=self._build_success_criteria(finding),
                        requires_human_confirmation=True,
                        completion_note=None,
                        created_at=finding.get("detected_at"),
                        completed_at=finding.get("resolved_at"),
                        metadata=self._merge_metadata(
                            finding.get("metadata"),
                            {
                                "finding_status": finding.get("status"),
                                "supplement_status": finding.get("supplement_status"),
                                "source": "unassigned_finding",
                            },
                        ),
                    )
                )

            items.extend(
                self._build_post_completion_actions(
                    session=session,
                    finding=finding,
                    case_id=case_id,
                )
            )

        return items
