from __future__ import annotations

from app.core.agent.processes.v2.workflows.doc_update_from_feature.steps.feature_markdown_parser import FeatureMarkdownParser
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 ParseFeatureRequirementsStep(WorkflowStep[DocUpdateFromFeatureContext]):
    step_id = "parse_feature"
    title = "Парсинг функциональных требований"

    def __init__(self, parser: FeatureMarkdownParser | None = None) -> None:
        self._parser = parser or FeatureMarkdownParser()

    async def run(self, context: DocUpdateFromFeatureContext) -> DocUpdateFromFeatureContext:
        if context.answer or not context.feature_content:
            return context
        parsed = self._parser.parse(context.feature_content)
        context.analytics_meta = parsed.meta
        context.units = parsed.units
        if not context.analytics_meta.analysis_id:
            context.issues.append("Отсутствует analysis_id в metadata аналитики.")
        if not context.analytics_meta.domains:
            context.issues.append("Отсутствует domain в metadata аналитики.")
        if not context.analytics_meta.subdomains:
            context.issues.append("Отсутствует sub_domain в metadata аналитики.")
        if not context.units:
            context.issues.append(
                "Не найдены units в разделе '## 5. Функциональные требования' с заголовками уровня '###'."
            )
        return context

    def trace_output(self, context: DocUpdateFromFeatureContext) -> dict[str, object]:
        return {
            "analysis_id": context.analytics_meta.analysis_id,
            "application": context.analytics_meta.application,
            "platform": context.analytics_meta.platform,
            "domains": context.analytics_meta.domains,
            "subdomains": context.analytics_meta.subdomains,
            "units": len(context.units),
            "issues": len(context.issues),
        }
