"""Score the week-1 case file against an injected complete()."""

from __future__ import annotations

import json
from pathlib import Path

from northline.loop import run_agent
from northline.orders import lookup_order

CASES_PATH = Path(__file__).with_name("cases_week1.json")


def load_cases(path=CASES_PATH):
    cases = json.loads(Path(path).read_text())
    if len(cases) != 15:
        raise ValueError(f"expected 15 cases, found {len(cases)}")
    ids = [c["id"] for c in cases]
    if len(set(ids)) != len(ids):
        raise ValueError("duplicate case id")
    return cases


def score_case(case, complete, tools=None):
    tools = tools if tools is not None else {"lookup_order": lookup_order}
    out = run_agent(case["task"], complete, tools, max_steps=case["max_steps"])
    final = out["final"] or ""
    tool_names = [m.get("name") for m in out["messages"] if m.get("role") == "tool"]
    errors = []
    expect = case["expect_tool"]
    if expect is None:
        if tool_names:
            errors.append("tool_called:" + ",".join(tool_names))
    elif expect not in tool_names:
        errors.append("missing_tool:" + expect)
    for needle in case.get("expect_in_final", []):
        if needle not in final:
            errors.append("missing_text:" + needle)
    for needle in case.get("forbid_in_final", []):
        if needle in final:
            errors.append("forbidden_text:" + needle)
    if out["steps"] > case["max_steps"]:
        errors.append("steps")
    return errors, out


def run_all(complete):
    rows = []
    for case in load_cases():
        errors, out = score_case(case, complete)
        rows.append((case["id"], errors, out["steps"]))
    return rows
