"""ALE-style evaluator for `exact_sos_certificate_multi_1`.

evaluate(task_dir, output_dir) -> dict with score in [0, 1]. Fully exact:
no floating point in any acceptance decision. Requires sos_common.py.
"""

import json
import os
import sys

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from sos_common import grade_multi_submission  # noqa: E402


def evaluate(task_dir: str, output_dir: str) -> dict:
    log = {"score": 0.0}
    try:
        with open(os.path.join(task_dir, "input", "polynomials.json")) as fh:
            data = json.load(fh)
        polys = {k: {tuple(t["exponents"]): int(t["coeff"]) for t in v}
                 for k, v in data["polynomials"].items()}
        with open(os.path.join(output_dir, "solution.json")) as fh:
            subs = json.load(fh)
    except Exception as exc:
        log["reason"] = f"invalid submission: {exc}"
        return log
    score, per = grade_multi_submission(subs, polys)
    log["score"] = score
    log["per_instance"] = {k: {"score": v["score"], "reason": v["reason"]}
                           for k, v in per.items()}
    log["reason"] = "; ".join(f"{k}: {v['reason']}" for k, v in per.items())
    return log


if __name__ == "__main__":
    print(json.dumps(evaluate(sys.argv[1], sys.argv[2]), indent=2, default=str))
