from __future__ import annotations

import argparse
import json
from pathlib import Path
from typing import Any


ROOT = Path(__file__).resolve().parents[1]
DEFAULT_JSON = ROOT / "GatherTradingData.json"
DEFAULT_OUT = ROOT / "Temp" / "derivation_validity_score_v1.json"


def _load(path: Path) -> dict[str, Any]:
    data = json.loads(path.read_text(encoding="utf-8"))
    return data if isinstance(data, dict) else {}


def _rows(v: Any) -> list[dict[str, Any]]:
    if isinstance(v, list):
        return [x for x in v if isinstance(x, dict)]
    if isinstance(v, str):
        try:
            p = json.loads(v)
            return _rows(p)
        except Exception:
            return []
    return []


def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument("--json", default=str(DEFAULT_JSON))
    ap.add_argument("--out", default=str(DEFAULT_OUT))
    args = ap.parse_args()
    json_path = Path(args.json)
    out_path = Path(args.out)
    if not json_path.is_absolute():
        json_path = ROOT / json_path
    if not out_path.is_absolute():
        out_path = ROOT / out_path

    payload = _load(json_path)
    data = payload.get("data") if isinstance(payload.get("data"), dict) else {}
    h = data.get("_harness_context") if isinstance(data.get("_harness_context"), dict) else {}

    ob = _rows(h.get("order_blueprint_json"))
    invalid_rows = [r for r in ob if str(r.get("validation_status") or "").startswith("INVALID")]
    invalid_rate = (len(invalid_rows) / max(1, len(ob))) * 100.0

    coverage = _load(ROOT / "Temp" / "harness_coverage_audit.json")
    # effective_coverage_pct accounts for Python mirror implementations; use it as true coverage
    coverage_pct = float(coverage.get("effective_coverage_pct") or coverage.get("coverage_pct") or 0.0)
    determinism_pct = 100.0 if str(h.get("determinism_status") or "PASS").upper() in ("PASS", "OK", "") else 70.0

    score = round(max(0.0, min(100.0, 0.5 * coverage_pct + 0.3 * (100.0 - invalid_rate) + 0.2 * determinism_pct)), 2)
    grade = "A" if score >= 98 else "B" if score >= 95 else "C" if score >= 90 else "D"
    gate = "PASS" if score >= 95 else "HALVE_NEW_BUY_QUANTITY" if score >= 90 else "NO_PRICE_QTY_EXPORT"

    result = {
        "formula_id": "DERIVATION_VALIDITY_SCORE_V1",
        "score": score,
        "grade": grade,
        "gate": gate,
        "metrics": {
            "coverage_pct": round(coverage_pct, 2),
            "invalid_blueprint_rate_pct": round(invalid_rate, 2),
            "determinism_pct": determinism_pct,
            "order_blueprint_rows": len(ob),
        },
    }
    out_path.parent.mkdir(parents=True, exist_ok=True)
    out_path.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(result, ensure_ascii=False, indent=2))
    return 0


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

