"""Architecture Lane Visualization + Calculation planner smoke."""

from __future__ import annotations

import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
if str(ROOT) not in sys.path:
    sys.path.insert(0, str(ROOT))

from src.domain.app_blocks.compiler import compile_install_plan  # noqa: E402
from src.domain.app_blocks.planner import (  # noqa: E402
    product_intent_from_spec,
    select_capabilities,
)
from src.domain.projects.discovery_schemas import (  # noqa: E402
    Actor,
    AuthenticationSpec,
    DiscoverySpec,
    Entity,
    ProductDefinition,
    TenancySpec,
    Workflow,
)

RECEIPT = ROOT / "src/domain/app_blocks/recipes/visualization_calculation_freeze.receipt.txt"

SMOKE = (
    ("Show a bar chart of monthly revenue.", ("visualization.chart",)),
    ("Add a mortgage calculator to estimate monthly loan payments.", ("calculation.calculator",)),
    ("Add a calculator that estimates consulting project margin.", ("calculation.calculator",)),
)

NEGATIVES = (
    ("Do not add a calculator.", "calculation.calculator"),
    ("No charts needed.", "visualization.chart"),
    ("chart of accounts", "visualization.chart"),
    ("Staff need a reporting dashboard.", "visualization.chart"),
)


def _spec(prompt: str) -> DiscoverySpec:
    return DiscoverySpec(
        product=ProductDefinition(
            purpose=prompt,
            first_build_goal=prompt,
        ),
        original_intent=prompt,
        actors=[Actor(id="staff", name="Staff counselor")],
        workflows=[Workflow(id="review", name="Staff review", description="Review records")],
        entities=[Entity(id="record", name="Record", description="A record")],
        tenancy=TenancySpec(model="single_workspace"),
        authentication=AuthenticationSpec(required=False),
    )


def _ids(prompt: str) -> set[str]:
    intent = product_intent_from_spec(_spec(prompt), source_prompt=prompt)
    return {block_id for _cap, block_id, _reason in select_capabilities(intent)}


def run_smoke() -> dict:
    failures = []
    rows = []
    for prompt, expected in SMOKE:
        ids = _ids(prompt)
        ok = set(expected) <= ids
        rows.append({"prompt": prompt, "ids": sorted(ids), "pass": ok})
        if not ok:
            failures.append(f"missing {expected} in {sorted(ids)} for {prompt}")
        if "reporting.dashboard" in ids and "reporting" not in prompt:
            failures.append(f"unexpected reporting for {prompt}")
    for prompt, forbidden in NEGATIVES:
        ids = _ids(prompt)
        ok = forbidden not in ids
        rows.append({"prompt": prompt, "ids": sorted(ids), "pass": ok})
        if not ok:
            failures.append(f"{forbidden} selected for {prompt}")
    mortgage = compile_install_plan(_spec(SMOKE[1][0]), source_prompt=SMOKE[1][0])
    if "calculator-mortgage" not in mortgage.required_feature_packs:
        failures.append("mortgage prompt did not install calculator-mortgage")
    margin = compile_install_plan(_spec(SMOKE[2][0]), source_prompt=SMOKE[2][0])
    if "calculator-mortgage" in margin.required_feature_packs:
        failures.append("margin calculator unexpectedly installed mortgage pack")
    receipt = RECEIPT.read_text(encoding="utf-8")
    if "visualization_calculation_admitted=yes" not in receipt:
        failures.append("missing freeze receipt")
    return {"pass": not failures, "failures": failures, "rows": rows}


if __name__ == "__main__":
    payload = run_smoke()
    print(payload)
    raise SystemExit(0 if payload["pass"] else 1)
