from __future__ import annotations

from typing import Any

from .helpers import ReviewMemoryHelpersMixin
from .session_chunks import ReviewSessionChunksMixin


class ReviewMemoryService(
    ReviewSessionChunksMixin,
    ReviewMemoryHelpersMixin,
):
    """Build review memory and project memory chunks for existing RAG ingestion flows."""

    REVIEW_MEMORY_TYPE = "review_memory"
    PROJECT_MEMORY_TYPE = "project_memory"

    def build_review_session_chunks(
        self, session: dict[str, Any]
    ) -> list[dict[str, Any]]:
        """Convert a dossier review session into knowledge chunks."""
        chunks: list[dict[str, Any]] = []
        task_type = self._resolve_task_type(
            session.get("metadata"),
            fallback=session.get("lead_agent_code"),
        )
        if not task_type:
            return []

        session_chunk = self._build_review_session_summary_chunk(session, task_type)
        if session_chunk:
            chunks.append(session_chunk)

        for finding in session.get("findings", []) or []:
            finding_chunk = self._build_finding_memory_chunk(
                session, finding, task_type
            )
            if finding_chunk:
                chunks.append(finding_chunk)

            resolution_chunk = self._build_finding_resolution_chunk(
                session, finding, task_type
            )
            if resolution_chunk:
                chunks.append(resolution_chunk)

        for action in session.get("actions", []) or []:
            action_chunk = self._build_review_action_chunk(session, action, task_type)
            if action_chunk:
                chunks.append(action_chunk)

        return chunks

    def build_project_event_chunks(self, event: dict[str, Any]) -> list[dict[str, Any]]:
        """Convert an operational project event into project memory knowledge chunks."""
        task_type = self._resolve_task_type(
            event.get("metadata"), fallback=event.get("agent_scope")
        )
        if not task_type:
            return []

        text = self._join_lines(
            [
                self._prefixed("Dự án", event.get("project_code")),
                self._prefixed(
                    "Loại sự kiện", event.get("event_type") or "project_event"
                ),
                self._prefixed("Tiêu đề", event.get("title")),
                self._prefixed("Tóm tắt", event.get("summary")),
                self._prefixed("Chi tiết", event.get("details")),
                self._prefixed("Kết quả", event.get("outcome")),
                self._prefixed("Hành động tiếp theo", event.get("next_action")),
            ]
        )
        if not text:
            return []

        metadata = self._base_metadata(
            task_type=task_type,
            project_code=event.get("project_code"),
            agent_scope=event.get("agent_scope")
            or event.get("metadata", {}).get("agent_scope"),
            document_type=event.get("document_type"),
            knowledge_type=self.PROJECT_MEMORY_TYPE,
            source_table=event.get("source_table") or "project_operational_events",
        )
        metadata.update(
            {
                "event_type": event.get("event_type") or "project_event",
                "event_id": event.get("event_id"),
            }
        )
        metadata.update(self._normalize_metadata(event.get("metadata")))

        return [{"text": text, "metadata": metadata}]
