import json
import subprocess
import sys
import unittest
from pathlib import Path


SCRIPT = Path(__file__).resolve().parents[1] / "mcsj-fast-fx.py"


class FastFxLiveTests(unittest.TestCase):
    def run_fast(self, *args):
        return subprocess.run([sys.executable, str(SCRIPT), *args], capture_output=True, text=True, timeout=30)

    def test_ensure_confirms_agent_is_owned_by_live_mcsj(self):
        result = self.run_fast("ensure")
        self.assertEqual(result.returncode, 0, result.stderr)
        payload = json.loads(result.stdout)
        self.assertEqual(payload["status"], "OK")
        self.assertEqual(payload["port"], 9807)
        self.assertGreater(payload["pid"], 0)
        self.assertEqual(payload["ownerPid"], payload["pid"])

    def test_state_alias_returns_compact_live_state(self):
        result = self.run_fast("state")
        self.assertEqual(result.returncode, 0, result.stderr)
        payload = json.loads(result.stdout)
        self.assertEqual(payload["status"], "OK")
        self.assertGreaterEqual(payload["panelCount"], 1)

    def test_hardened_launcher_rejects_unexposed_raw_command(self):
        result = self.run_fast("raw", "PING")
        self.assertNotEqual(result.returncode, 0)
        payload = json.loads(result.stderr)
        self.assertEqual(payload["status"], "ERROR")

    def test_live_mutation_route_returns_nonzero_on_stale_guard(self):
        result = self.run_fast(
            "cell", "--panel-class", "util.client.fx.EFXUtadjbatchPanel",
            "--header", "Descript", "--row", "0", "--column", "11",
            "--action", "select", "--expected", "__definitely_stale__",
        )
        self.assertNotEqual(result.returncode, 0)
        payload = json.loads(result.stdout)
        self.assertEqual(payload["status"], "STALE")


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