#!/usr/bin/env python3
"""medf verifier CLI. Prints JSON on stdout.

  verify.py <target> <smiles> [--past <smiles> ...] [--cpu N] [--pose]   run the pipeline (settlement uses cpu 1)
  verify.py re-run <target> <smiles> [--expect <result_hash>]            reproduce a settled record and compare its hash
  verify.py filters <smiles>                                             parse and filter table only, no docking
  verify.py version                                                      the pinned version string
  verify.py screen <target> [--past <smiles> ...] < smiles.txt           parse, novelty and filters for each line, no docking (JSON lines)
"""
import json, sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
import medf


def opt(args, k, default=None, many=False):
    vals = [args[i + 1] for i, a in enumerate(args[:-1]) if a == k]
    return vals if many else (vals[-1] if vals else default)


def main(argv):
    if not argv or argv[0] in ("-h", "--help"):
        print(__doc__.strip()); return 0
    if argv[0] == "version":
        print(json.dumps({"verifier_version": medf.VERIFIER_VERSION})); return 0
    if argv[0] == "filters":
        m, why = medf.parse(argv[1])
        if m is None:
            print(json.dumps({"ok": False, "step": "parse", "reason": why})); return 1
        rows, fails = medf.table(m)
        from rdkit import Chem
        print(json.dumps({"ok": not fails, "canonical_smiles": Chem.MolToSmiles(m), "filters": rows, "fails": fails})); return 0 if not fails else 1
    if argv[0] == "screen":
        target = medf.load_target(argv[1])
        past = opt(argv, "--past", many=True)
        for line in sys.stdin:
            smi = line.rstrip("\n")
            m, fields, rej = medf.screen(target, smi, past)
            r = {"smiles": smi, "verdict": "REJECTED" if rej else "PASS", **fields}
            if rej:
                r["step"], r["reason"] = rej
            print(json.dumps(r))
        return 0
    if argv[0] == "re-run":
        tid, smi = argv[1], argv[2]
        r = medf.verify(tid, smi, cpu=medf.SETTLE_CPU)
        exp = opt(argv, "--expect")
        if exp:
            r["matches_record"] = r.get("result_hash") == exp
        print(json.dumps(r)); return 0 if not exp or r["matches_record"] else 2
    tid, smi = argv[0], argv[1]
    r = medf.verify(tid, smi, past=opt(argv, "--past", many=True), cpu=int(opt(argv, "--cpu", medf.SETTLE_CPU)), want_pose="--pose" in argv)
    print(json.dumps(r)); return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
