from __future__ import annotations
from pathlib import Path

from app.core.agent.processes.v2.workflows.doc_update_from_feature.workflow_runtime.context import DocUpdateFromFeatureContext
from app.core.agent.utils.workflow import WorkflowStep


class LoadSourceContentStep(WorkflowStep[DocUpdateFromFeatureContext]):
    step_id = "load_source"
    title = "Загрузка системной аналитики"

    async def run(self, context: DocUpdateFromFeatureContext) -> DocUpdateFromFeatureContext:
        if context.answer:
            return context
        if not context.source_ref:
            return context
        if context.source_kind == "confluence_url":
            context.issues.append("Пока не поддерживается скачивание системной аналитики по Confluence URL.")
            return context
        if context.source_kind != "markdown_file":
            context.issues.append("Поддерживается только источник markdown-файла (.md).")
            return context
        source_path = Path(context.source_ref)
        if not source_path.exists() or not source_path.is_file():
            context.issues.append(f"Файл системной аналитики не найден: {context.source_ref}")
            return context
        try:
            context.feature_content = source_path.read_text(encoding="utf-8")
            context.project_root = self._resolve_project_root(source_path).as_posix()
        except Exception as exc:
            context.issues.append(f"Не удалось прочитать файл аналитики: {exc}")
        return context

    def trace_output(self, context: DocUpdateFromFeatureContext) -> dict[str, object]:
        return {
            "source_kind": context.source_kind,
            "content_loaded": bool(context.feature_content),
            "project_root": context.project_root,
            "issues": len(context.issues),
        }

    def _resolve_project_root(self, source_path: Path) -> Path:
        parts = list(source_path.parts)
        if "_incoming" in parts:
            idx = parts.index("_incoming")
            if idx > 0:
                return Path(*parts[:idx])
        return source_path.parent
