"""a tool library's loans and members

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

import json
from pathlib import Path

import pandas as pd
import fieldwork as fw

members = pd.DataFrame(
    [
        (101, "North", 102),
        (102, "North", 101),
        (103, "South", 104),
        (104, "South", None),
        (105, "South", 101),
    ],
    columns=["member_id", "home_branch", "buddy_id"],
)
loans = pd.DataFrame(
    [
        ("L1", 101, "drill", "North"),
        ("L2", 101, "ladder", "North"),
        ("L3", 102, "saw", "South"),
        ("L4", 103, "drill", "North"),
        ("L5", 103, "sander", "South"),
        ("L6", 107, "ladder", "South"),
        ("L7", None, "saw", "South"),
    ],
    columns=["loan", "member_id", "tool", "branch"],
)
print(loans.to_string(index=False))
print("Key types:", loans["member_id"].dtype, "and", members["member_id"].dtype)

link = fw.relate(
    loans,
    members,
    on={"member_id": "member_id"},
    compare={"branch": "home_branch"},
    table_ids=("loans", "members"),
)
for finding in link["findings"]:
    print(finding["id"], finding["statement"])

print(link["key_coverage"]["left_to_right"])
print(link["sides"]["left"]["rows"])
unknown = link.inspect(loans, "f0", exceptions=True)
print(unknown.to_string(index=False))

no_loans = link.inspect(loans, "f1", exceptions=True, side="right", right=members)
print(no_loans.to_string(index=False))

print(link["relation"]["type"], "with", link["relation"]["joined_rows"], "joined rows")
agreement = link["agreement"][0]
for field in ["state", "ambiguity", "agreeing_keys", "disagreeing_keys", "ambiguous_keys"]:
    print(f"{field}: {agreement[field]}")
print(link.inspect(loans, "f3", exceptions=True).to_string(index=False))

members_csv = members.astype({"member_id": "string"})
typed = fw.relate(
    loans, members_csv, on={"member_id": "member_id"}, table_ids=("loans", "members")
)
print(typed["key_coverage"]["left_to_right"]["state"])
print(typed["warnings"][0]["code"], typed["warnings"][0]["left_kinds"], typed["warnings"][0]["right_kinds"])
as_text = fw.relate(
    loans,
    members_csv,
    on={"member_id": "member_id"},
    match="text",
    table_ids=("loans", "members"),
)
print(as_text["key_coverage"]["left_to_right"]["state"], as_text["warnings"])

buddies = fw.relate(members, on={"buddy_id": "member_id"})
for finding in buddies["findings"]:
    print(finding["id"], finding["statement"])
print(buddies["reciprocity"]["reciprocated"], "of", buddies["reciprocity"]["resolved_references"], "reciprocated")
print(buddies.inspect(members, "f3", exceptions=True).to_string(index=False))

Path("relate.svg").write_text(fw.render_svg(link), encoding="utf-8")
Path("tool-library-relation.json").write_text(json.dumps(link.to_dict()), encoding="utf-8")
saved = fw.Result.from_dict(json.loads(Path("tool-library-relation.json").read_text()))
again = saved.recompute(loans, right=members)
print("Same coverage after recompute:", again["key_coverage"] == link["key_coverage"])
