"""Human-first change-impact-analysis view model."""
from __future__ import annotations

from ..common import analysis_review_ids, evidence_index
from ..models import HumanReportView, VisualEdge, VisualNode
from ..visualizations import flow_figure


def _impact_figure(change: dict):
    nodes = [
        VisualNode(
            row["id"],
            row["target"],
            "affected",
            row["level"],
            row["impactKind"],
            note=f'Impact {row["level"]}',
        )
        for row in change.get("impactItems", [])
    ]
    edges: list[VisualEdge] = []
    for index, row in enumerate(change.get("dependencyBlastRadius", []), start=1):
        target_id = f"BR-{index:03d}"
        nodes.append(
            VisualNode(
                target_id, row["affectedTarget"], "downstream", "risk", row["direction"], note="Downstream"
            )
        )
        edges.append(VisualEdge(row["sourceImpactId"], target_id, row["direction"], "impact"))
    return flow_figure(nodes=tuple(nodes), edges=tuple(edges), title="Change blast radius")


def build_change_impact_analysis_view(data: dict) -> HumanReportView:
    change = data["changeImpactAnalysis"]
    figure = _impact_figure(change)
    context = {
        "humanSummary": data["humanSummary"],
        "change": change,
        "narrative": change["userNarrative"],
        "blastRadiusFigure": figure,
        "analysisReviewIds": analysis_review_ids(data),
        "evidenceIndex": evidence_index(data),
    }
    return HumanReportView(
        task_type="change-impact-analysis",
        template_name="html/tasks/change-impact-analysis.template.html",
        context=context,
        figures=(figure,),
    )
