"""Replay invented attachment acceptance cases. Python 3, stdlib, no I/O/network.
Run: python3 reconcile.py
Text bytes and role outcomes are synthetic, not observations of any CRM.
"""
import copy
import hashlib
import json

RECORD_MAP = {"account-a": "new-account-a", "deal-a": "new-deal-a",
              "account-b": "new-account-b", "deal-b": "new-deal-b"}
SOURCE = {
    "doc-a": {"filename": "agreement.txt", "version": "2", "body": b"A signed revision 2\n",
              "parents": ["account-a", "deal-a"], "access": {"owner": True, "other_team": False}},
    "doc-b": {"filename": "agreement.txt", "version": "1", "body": b"B agreement revision 1\n",
              "parents": ["account-b"], "access": {"owner": True, "other_team": False}},
    "doc-c": {"filename": "brief.txt", "version": "1", "body": b"C brief revision 1\n",
              "parents": ["deal-b"], "access": {"owner": True, "other_team": False}},
    "doc-d": {"filename": "handoff.txt", "version": "1", "body": b"D handoff revision 1\n",
              "parents": ["account-b", "deal-b"], "access": {"owner": True, "other_team": False}},
}


def baseline():
    return [{"source_id": key, "target_id": "new-" + key, "filename": value["filename"],
             "version": value["version"], "body": value["body"],
             "parents": [RECORD_MAP[parent] for parent in value["parents"]],
             "access": dict(value["access"])} for key, value in SOURCE.items()]


def audit(rows):
    problems = []
    source_ids = [row["source_id"] for row in rows]
    if sorted(source_ids) != sorted(SOURCE):
        problems.append("source_identity")
    if len({row["target_id"] for row in rows}) != len(rows):
        problems.append("target_identity")
    for row in rows:
        source = SOURCE.get(row["source_id"])
        if source is None:
            continue
        prefix = row["source_id"] + ":"
        if row["version"] != source["version"]:
            problems.append(prefix + "version")
        if hashlib.sha256(row["body"]).digest() != hashlib.sha256(source["body"]).digest():
            problems.append(prefix + "bytes")
        expected_parents = [RECORD_MAP[parent] for parent in source["parents"]]
        if sorted(row["parents"]) != sorted(expected_parents):
            problems.append(prefix + "record_links")
        if row["access"] != source["access"]:
            problems.append(prefix + "access")
    return problems


def replay():
    cases = {"baseline": baseline()}
    for name in ("wrong_record", "missing_second_link", "stale_version", "changed_bytes",
                 "excess_access", "missing_access"):
        cases[name] = copy.deepcopy(cases["baseline"])
    cases["wrong_record"][0]["parents"][1] = "new-deal-b"
    cases["missing_second_link"][0]["parents"].remove("new-deal-a")
    cases["stale_version"][0]["version"] = "1"
    cases["stale_version"][0]["body"] = b"A draft revision 1\n"
    cases["changed_bytes"][0]["body"] = b"A altered revision 2\n"
    cases["excess_access"][0]["access"]["other_team"] = True
    cases["missing_access"][0]["access"]["owner"] = False
    return {
        "method": "Invented latest-version migration, four documents, six required record links, two role outcomes per document. No vendor calls.",
        "cases": [{"case": name, "file_rows": len(rows),
                   "count_pass": len(rows) == len(SOURCE),
                   "reconciliation_pass": not audit(rows), "problems": audit(rows)}
                  for name, rows in cases.items()],
    }


if __name__ == "__main__":
    print(json.dumps(replay(), indent=2))
