# -*- coding: utf-8 -*-
"""Regression — task-2553+51 TRACK 2 runtime structure SMOKE PILOT.

회장 §7 성공 기준을 코드로 고정한다:

  * 회장이 gate/HOLD/allowed/forbidden 세부 미지정 → ANU default
    low-risk read-only profile 자동 산출 (selected-policy-profile).
  * 실 entrypoint 직접 호출 (mock-only FAIL): registry / owner
    validator / authoritative selector 4 checks 전부 PASS.
  * executor self-collector 0 · normal callback ANU key ·
    authoritative verdict independent ANU · self-chain 영구 비권위.
  * READ-ONLY: +44 영구 ledger byte-0 (append/mark_completed 0).
  * §6 allowlist 외 write 0 — _write REFUSE 보장.
"""
import hashlib
import importlib.util
import sys
import unittest
from pathlib import Path

_ROOT = Path(__file__).resolve().parents[2]
if str(_ROOT) not in sys.path:
    sys.path.insert(0, str(_ROOT))


def _load(modname: str, relpath: str):
    spec = importlib.util.spec_from_file_location(modname, _ROOT / relpath)
    assert spec is not None and spec.loader is not None
    mod = importlib.util.module_from_spec(spec)
    sys.modules[modname] = mod
    spec.loader.exec_module(mod)
    return mod


_pilot = _load(
    "_p51_pilot", "scripts/runtime_smoke_pilot_2553plus51.py"
)


class TestRuntimeSmokePilot2553p51(unittest.TestCase):
    def setUp(self):
        self.result = _pilot.run_pilot()
        self.checks = {c["name"][:1]: c for c in self.result["checks"]}

    # ── 1. 실 entrypoint 직접 호출, mock-only 아님 ──────────────────
    def test_real_entrypoints_not_mock(self):
        self.assertFalse(self.result["mock_only"])
        self.assertTrue(self.result["real_entrypoints_called"])

    def test_all_four_checks_pass(self):
        self.assertEqual(len(self.result["checks"]), 4)
        for c in self.result["checks"]:
            self.assertTrue(c["passed"], f"check FAILED: {c['name']} :: {c}")

    # ── 2. +44 ledger READ-ONLY (byte-0) ──────────────────────────
    def test_ledger_not_mutated(self):
        self.assertFalse(self.result["ledger_mutated"])
        self.assertFalse(self.checks["A"]["detail"]["ledger_mutated"])

    def test_ledger_byte0_after_pilot(self):
        ledger = _ROOT / "memory/events/callback_4tuple_index.jsonl"
        before = hashlib.sha256(ledger.read_bytes()).hexdigest()
        _pilot.run_pilot()  # re-run: query-only path must not append
        after = hashlib.sha256(ledger.read_bytes()).hexdigest()
        self.assertEqual(before, after, "ledger mutated by read-only pilot")

    # ── 3. owner=ANU key 검증 / self-collector 0 ──────────────────
    def test_owner_validator_anu_pass_self_blocked(self):
        b = self.checks["B"]["detail"]
        self.assertEqual(b["anu_key_result"]["verdict"], "PASS")
        self.assertTrue(b["anu_key_result"]["owner_is_independent_anu"])
        self.assertEqual(b["executor_self_key_result"]["verdict"], "FAIL")
        self.assertFalse(
            b["executor_self_key_result"]["registration_allowed"]
        )

    def test_mandated_callback_key_is_independent_anu(self):
        d = self.checks["D"]["detail"]
        self.assertEqual(d["mandated_callback_key"], "c119085addb0f8b7")
        self.assertIn("c119085addb0f8b7", d["registered_anu_keys"])
        self.assertNotIn("a999e2ea4c06d2fb", d["registered_anu_keys"])

    # ── 4. self-chain 영구 비권위 / authoritative=independent ANU ──
    def test_self_chain_never_authoritative(self):
        self.assertFalse(self.result["self_chain_authoritative"])
        self.assertEqual(
            self.result["authoritative_selection"],
            "DEFERRED_TO_INDEPENDENT_ANU_COLLECTOR",
        )
        c = self.checks["C"]["detail"]
        self.assertEqual(c["self_chain_only"]["verdict"], "FAIL")
        self.assertIsNone(c["self_chain_only"]["authoritative_verdict"])
        self.assertEqual(
            c["with_independent_anu"]["classification"],
            "AUTHORITATIVE_PASS",
        )
        self.assertEqual(
            c["with_independent_anu"]["independent_anu_count"], 1
        )

    # ── 5. §6 allowlist 외 write 0 (fail-closed) ──────────────────
    def test_write_refuses_outside_allowlist(self):
        with self.assertRaises(SystemExit):
            _pilot._write("memory/events/NOT-ALLOWED.json", "{}")

    def test_executor_self_key_is_not_callback_owner(self):
        # executor(이참나) self key 는 절대 callback owner 가 될 수 없다.
        self.assertEqual(_pilot.EXECUTOR_SELF_KEY, "a999e2ea4c06d2fb")
        self.assertEqual(_pilot.ANU_CALLBACK_KEY, "c119085addb0f8b7")
        self.assertNotEqual(
            _pilot.EXECUTOR_SELF_KEY, _pilot.ANU_CALLBACK_KEY
        )


if __name__ == "__main__":
    unittest.main()
