#!/usr/bin/env python3
"""Verify the Task23 Codex-card execution boundary without mutating it."""

from __future__ import annotations

import hashlib
import json
from pathlib import Path

PROFILE_ROOT = Path("/home/cube/.hermes/profiles/dualcoachtest")
SOURCE_ROOT = Path("/home/cube/projects/richard/hermes-agent")
OWNER = ("9000000001", "9000000001", "0")
PARENT_TOKEN = "e2f07f9a41431ff1"
PARENT_DIGEST = "429a45f63878ae3fa568077ea057a6195486c8d40e6b137df8c9cc5da671a9c1"
PREDECESSOR_TOKEN = "664046dbca210afc"
PREDECESSOR_DIGEST = "9bc0920c5be80a312ab04f3cbb4f75a4d69cbee967ed9bddd402959ea7347454"


def canonical(value: object) -> bytes:
    return json.dumps(
        value,
        ensure_ascii=False,
        sort_keys=True,
        separators=(",", ":"),
        allow_nan=False,
    ).encode("utf-8")


def main() -> int:
    import sys

    sys.path.insert(0, str(SOURCE_ROOT))
    from gateway.platforms.task23_codex_compatibility_repair import (
        Task23CodexCompatibilityRepairError,
        Task23CodexCompatibilityRepairStore,
    )

    store = Task23CodexCompatibilityRepairStore(PROFILE_ROOT, source_root=SOURCE_ROOT)
    seal = store.preflight()
    journal = json.loads(store.journal_path.read_text(encoding="utf-8"))
    generations = json.loads(
        (PROFILE_ROOT / "data" / "owner-actions" / "draft-generations.json").read_text(
            encoding="utf-8"
        )
    )
    parent_history = generations[PARENT_TOKEN]
    parent = parent_history[-1]
    predecessor = generations[PREDECESSOR_TOKEN][-1]

    assert journal["state"] == "owner_authorized"
    assert journal["owner"] == list(OWNER)
    assert journal["publication"] == {
        "chat_id": OWNER[1],
        "topic_id": OWNER[2],
        "message_id": "144",
    }
    assert journal["authorization"] == {
        "actor_user_id": OWNER[0],
        "chat_id": OWNER[1],
        "topic_id": OWNER[2],
        "message_id": "144",
        "update_id": 629525075,
    }
    assert journal["seal_digest"] == seal.seal_digest
    assert journal["generation_child_append_count"] == 0
    assert journal["provider_generation_called"] is False
    assert journal["customer_delivery_count"] == 0
    assert hashlib.sha256(canonical({k: v for k, v in journal.items() if k != "journal_digest"})).hexdigest() == journal["journal_digest"]

    child = journal["prospective_child"]
    assert child["generation"] == 1
    assert child["state"] == "generation_pending"
    assert child["lineage_parent_token"] == PARENT_TOKEN
    assert child["lineage_predecessor_digest"] == PARENT_DIGEST
    assert parent["generation"] == 3
    assert parent["state"] == "generation_failed"
    assert parent["record_digest"] == PARENT_DIGEST
    assert parent["error"] == {
        "code": "provider_failure",
        "detail": "generation provider failed",
        "retryable": True,
    }
    assert predecessor["state"] == "generation_failed"
    assert predecessor["record_digest"] == PREDECESSOR_DIGEST
    assert not [
        token
        for token, history in generations.items()
        if token != PARENT_TOKEN
        and history
        and history[0].get("lineage_predecessor_digest") == PARENT_DIGEST
    ]

    proposed = dict(journal)
    proposed["state"] = "consumed"
    proposed["journal_digest"] = hashlib.sha256(
        canonical({k: v for k, v in proposed.items() if k != "journal_digest"})
    ).hexdigest()
    try:
        store._validate_journal(proposed, seal=seal)
    except Task23CodexCompatibilityRepairError:
        consumed_transition_rejected = True
    else:
        consumed_transition_rejected = False
    assert consumed_transition_rejected
    assert not hasattr(store, "consume_authorization")

    print(
        json.dumps(
            {
                "schema": "task23-codex-live-direct-verifier-v1",
                "verifier": "passed",
                "verdict": "BLOCKED_SEMANTIC",
                "authorization": {
                    "message_id": "144",
                    "update_id": 629525075,
                    "owner_route": {
                        "user_id": OWNER[0],
                        "chat_id": OWNER[1],
                        "topic_id": OWNER[2],
                    },
                    "journal_state": journal["state"],
                    "journal_digest": journal["journal_digest"],
                    "seal_digest": seal.seal_digest,
                },
                "lineage": {
                    "terminal_parent_token": PARENT_TOKEN,
                    "terminal_parent_generation": 3,
                    "terminal_parent_record_digest": PARENT_DIGEST,
                    "predecessor_token": PREDECESSOR_TOKEN,
                    "predecessor_record_digest": PREDECESSOR_DIGEST,
                    "prospective_child_token": child["token"],
                    "descendant_count": 0,
                },
                "invariants": {
                    "provider_generation_called": False,
                    "generation_child_append_count": 0,
                    "customer_delivery_count": 0,
                    "journal_digest_valid": True,
                    "seal_matches_current_source": True,
                },
                "semantic_diagnostic": {
                    "code": "authorization_journal_has_no_consumable_state_transition",
                    "consumed_transition_rejected": consumed_transition_rejected,
                    "consume_method_present": False,
                    "provider_call_attempted": False,
                    "retry_performed": False,
                },
            },
            ensure_ascii=False,
            sort_keys=True,
            separators=(",", ":"),
        )
    )
    return 0


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