"""Apply the registered rule to a round 10 result: per country, the share of its registered questions whose six-cell
error is at or below their own sampling floor (a registered pair that was not scored counts as a miss); a country
meets the rule at 80 percent or more; the claim is met if at least 80 percent of the registered countries meet it.

  python ab_score.py PROTOCOL.json RESULT.json OUT.json
"""
import json, sys
proto, res = json.load(open(sys.argv[1])), json.load(open(sys.argv[2]))
reg = json.load(open(proto["data"]["plan_file"]))["registered"] if "plan_file" in proto["data"] else proto["registered"]
out = {"countries": {}}
for c, qs in reg.items():
    got = res["countries"].get(c, {})
    passed = sum(bool(got.get(q, {}).get("pass_floor", False)) for q in qs)
    strict = sum(bool(got.get(q, {}).get("met", False)) for q in qs)
    out["countries"][c] = {"registered": len(qs), "scored": sum(q in got for q in qs), "pass_floor": passed,
                           "share": round(passed / len(qs), 3), "meets": passed / len(qs) >= 0.8, "strict_met": strict}
n = len(out["countries"]); k = sum(v["meets"] for v in out["countries"].values())
pairs = sum(v["registered"] for v in out["countries"].values())
out["claim"] = {"countries_meeting": k, "of": n, "needed": -(-8 * n // 10), "primary_met": k >= -(-8 * n // 10),
                "pairs_pass_floor": sum(v["pass_floor"] for v in out["countries"].values()), "pairs": pairs,
                "pairs_strict_met": sum(v["strict_met"] for v in out["countries"].values())}
json.dump(out, open(sys.argv[3], "w"), indent=1)
print(json.dumps(out["claim"]))
