#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.12,<3.14"
# dependencies = ["pydantic>=2,<3"]
# ///

# ─── How to run ───
# 1. Install uv (if not installed):
#      curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. Run directly (no venv, no pip install needed):
#      uv run scripts/verify_nutricoach_v140_candidate.py --base BASE.json --successor DIR --manifest DIR/manifest.json
# 3. Or make executable and run:
#      chmod +x scripts/verify_nutricoach_v140_candidate.py && ./scripts/verify_nutricoach_v140_candidate.py --help
# ──────────────────

"""Verify the immutable NutriCoach v1.4.0 qualification directory."""

from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

from scripts.verify_nutricoach_v140_candidate_checks import verify_candidate
from scripts.verify_nutricoach_v140_candidate_core import (
    CandidateContractError,
    load_json,
    require_object,
    sha256_file,
)


class CliNamespace(argparse.Namespace):
    """Mutable argparse destination with statically known path fields."""

    def __init__(self) -> None:
        super().__init__()
        self.base: Path = Path()
        self.successor: Path = Path()
        self.manifest: Path = Path()


def _parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(
        description="Verify the immutable NutriCoach v1.4.0 candidate seal."
    )
    _ = parser.add_argument("--base", required=True, type=Path)
    _ = parser.add_argument("--successor", required=True, type=Path)
    _ = parser.add_argument("--manifest", required=True, type=Path)
    return parser


def main() -> int:
    args = _parser().parse_args(namespace=CliNamespace())
    try:
        baseline = require_object(load_json(args.base), "baseline")
        manifest = require_object(load_json(args.manifest), "manifest")
        if baseline.get("status") != "PASS":
            raise CandidateContractError("Task1 baseline is not PASS")
        if manifest.get("task1_baseline_sha256") != sha256_file(args.base):
            raise CandidateContractError("Task1 baseline hash mismatch")
        result = verify_candidate(args.successor, args.manifest)
        qualification_path = args.successor / "qualification.json"
        qualification = require_object(load_json(qualification_path), "qualification")
        if (
            qualification.get("status") != "QUALIFIED_PENDING_LIVE_AUTHORIZATION"
            or qualification.get("candidate_digest") != result.candidate_digest
        ):
            raise CandidateContractError("qualification receipt binding is invalid")
    except (CandidateContractError, OSError, ValueError) as error:
        print(f"NUTRICOACH_V140_CANDIDATE_FAIL:{error}")
        return 1
    print(
        json.dumps(
            {
                "candidate_digest": result.candidate_digest,
                "evidence_member_count": result.evidence_member_count,
                "hermes_wheel_sha256": result.hermes_wheel_sha256,
                "profile_wheel_sha256": result.profile_wheel_sha256,
                "source_member_count": result.source_member_count,
                "source_tree_digest": result.source_tree_digest,
                "status": "NUTRICOACH_V140_CANDIDATE_PASS",
            },
            sort_keys=True,
            separators=(",", ":"),
        )
    )
    print("NUTRICOACH_V140_CANDIDATE_PASS")
    return 0


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