#!/usr/bin/env python3
from __future__ import annotations

import importlib.util
import json
import tempfile
import unittest
from pathlib import Path

HERE = Path(__file__).resolve().parent
SCRIPT = HERE.parent / "remote/phase2-candidate.py"
spec = importlib.util.spec_from_file_location("phase2_candidate", SCRIPT)
assert spec and spec.loader
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)


class CandidateHelperTests(unittest.TestCase):
    def make_root(self, root: Path) -> None:
        files = {
            "etc/machine-id": "4" * 32 + "\n",
            "etc/os-release": 'ID=debian\nVERSION_ID="12"\n',
            "run/overdeck-fixture/architecture": "x86_64\n",
            "run/overdeck-fixture/k3s-agent-state": "inactive\n",
            "proc/meminfo": "MemTotal:       16777216 kB\n",
            "var/lib/rustdesk/id": "28884444\n",
        }
        for relative, content in files.items():
            path = root / relative
            path.parent.mkdir(parents=True, exist_ok=True)
            path.write_text(content)
        for relative in (
            "run/systemd/system",
            "sys/fs/cgroup",
            "sys/class/net/tailscale0",
            "run/systemd/timesync",
            "var/lib",
        ):
            (root / relative).mkdir(parents=True, exist_ok=True)
        (root / "sys/fs/cgroup/cgroup.controllers").write_text("cpu memory\n")
        (root / "run/overdeck-fixture/tailscale-online").write_text("yes\n")
        (root / "run/systemd/timesync/synchronized").write_text("yes\n")

    def test_fixture_inspection_is_read_only_and_complete(self):
        with tempfile.TemporaryDirectory() as tmp:
            root = Path(tmp)
            self.make_root(root)
            payload = module.inspect(root)
            self.assertEqual(payload["status"], "ok")
            self.assertEqual(payload["identity"]["machine_id"], "4" * 32)
            self.assertEqual(payload["identity"]["rustdesk"], "28884444")
            self.assertTrue(payload["preflight"]["tailscale_online"])
            self.assertEqual(payload["preflight"]["k3s_agent_state"], "absent")
            self.assertEqual(payload["mutation_surface"], "none")

    def test_machine_id_symlink_is_rejected(self):
        with tempfile.TemporaryDirectory() as tmp:
            root = Path(tmp)
            self.make_root(root)
            (root / "etc/machine-id").unlink()
            (root / "etc/machine-id").symlink_to("os-release")
            with self.assertRaises(module.InspectError):
                module.inspect(root)

    def test_cli_has_no_mutation_command(self):
        with self.assertRaises(SystemExit):
            module.parser().parse_args(["apply"])


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