"""opening a museum catalog at the right level

Generated from src/content/docs/reference/suggest-paths.md.
Run with the documented Fieldwork release in a writable directory.
Exports are saved there using the filenames shown in the walkthrough.
"""

import pandas as pd
import fieldwork as fw

rows = []
for collection, rooms in [
    ("Ceramics", ["C1", "C2"]),
    ("Textiles", ["T1", "T2"]),
]:
    for room in rooms:
        for cabinet in [f"{room}-A", f"{room}-B"]:
            for item in [1, 2]:
                rows.append(
                    (
                        collection,
                        room,
                        cabinet,
                        f"{cabinet}-{item}",
                        "stored",
                    )
                )
rows.append(("Ceramics", "Loan", "Loan-A", "LOAN-1", "on loan"))
catalog = pd.DataFrame(
    rows,
    columns=["collection", "room", "cabinet", "accession", "status"],
)
stored_positions = [
    i
    for i, status in enumerate(catalog["status"])
    if status == "stored"
]
stored = fw.Scope.from_positions(
    catalog, stored_positions, name="stored objects"
)
print(
    f"Catalog: {len(catalog)} rows; stored: {len(stored.positions)} rows"
)

paths = fw.suggest_paths(
    catalog,
    features=["collection", "room", "cabinet", "accession"],
    max_dimensions=4,
    limits={"display_budget": 40},
    scope=stored,
    table_id="museum_catalog",
)
summary = paths.to_frame("paths")
print("Recommended:", " > ".join(summary.loc[0, "dimensions"]))
print("Prefix groups:", summary.loc[0, "measurements.prefix_counts"])
print("Score:", summary.loc[0, "measurements.score"])

forced = fw.suggest_paths(
    catalog,
    features=["collection", "room", "cabinet", "accession"],
    max_dimensions=4,
    limits={"display_budget": 40},
    scope=stored,
    table_id="museum_catalog",
    start_with=["accession"],
)
for label, result in [
    ("Browse shelves", paths),
    ("Look up accession", forced),
]:
    candidate = result["paths"][0]
    measures = candidate["measurements"]
    print(label + ": " + " > ".join(candidate["dimensions"]))
    print(
        f"  groups={measures['prefix_counts']}; score={measures['score']}; "
        f"redundant={measures['redundant_steps']}; "
        f"inversions={measures['nesting_inversions']}"
    )
    joint_groups = (
        catalog.iloc[stored_positions]
        .groupby(candidate["dimensions"])
        .ngroups
    )
    print("  final joint groups:", joint_groups)

best = paths.best
if best is None:
    print(
        "No path was found. Try fewer required columns or a larger search budget."
    )
else:
    tree = best.census(catalog, max_nodes=40)
    print(fw.render_plaintext(tree, max_lines=10))

from pathlib import Path

Path("suggest_paths.svg").write_text(
    fw.render_svg(paths), encoding="utf-8"
)
