#!/usr/bin/env python
"""Atomically publish a completed Foster->Michel result without exposing secrets."""
from __future__ import annotations
import argparse, datetime, json, os, re, tempfile
from pathlib import Path

RESULTS = Path("C:/MCSJAgent/foster-ask-michel/results")
ID_RE = re.compile(r"^[A-Za-z0-9._-]{6,128}$")


def main() -> int:
    p = argparse.ArgumentParser()
    p.add_argument("--request-id", required=True)
    p.add_argument("--answer-file", required=True)
    p.add_argument("--status", choices=("completed", "failed"), default="completed")
    p.add_argument("--confidence", choices=("high", "medium", "low"), default="high")
    p.add_argument("--proof", action="append", default=[])
    p.add_argument("--caveat", action="append", default=[])
    a = p.parse_args()
    if not ID_RE.fullmatch(a.request_id):
        raise SystemExit("invalid request id")
    answer = Path(a.answer_file).read_text(encoding="utf-8").strip()
    if not answer:
        raise SystemExit("answer file is empty")
    result = {
        "request_id": a.request_id,
        "status": a.status,
        "completed_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
        "answer": answer,
        "confidence": a.confidence,
        "proof": a.proof,
        "caveats": a.caveat,
    }
    RESULTS.mkdir(parents=True, exist_ok=True)
    dest = RESULTS / f"{a.request_id}.json"
    fd, tmp = tempfile.mkstemp(prefix=dest.name + ".", suffix=".tmp", dir=RESULTS)
    try:
        with os.fdopen(fd, "w", encoding="utf-8", newline="\n") as f:
            json.dump(result, f, ensure_ascii=False, indent=2)
            f.write("\n")
            f.flush(); os.fsync(f.fileno())
        os.replace(tmp, dest)
    finally:
        if os.path.exists(tmp): os.unlink(tmp)
    print(json.dumps({"ok": True, "request_id": a.request_id, "status": a.status}))
    return 0

if __name__ == "__main__":
    raise SystemExit(main())
