"""Behavior checks using real CLI subprocesses and disposable inputs."""
import hashlib
import json
from pathlib import Path
import subprocess
import sys
import tempfile
import unittest

ROOT = Path(__file__).resolve().parents[1]
EXPECTED = [{"id": "alpha", "label": "Alpha"}, {"id": "beta", "label": "Beta"}]


class CatalogTests(unittest.TestCase):
    def call(self, *args):
        return subprocess.run([sys.executable] + list(args), cwd=ROOT, capture_output=True,
                              text=True, timeout=5)

    def test_valid_two_rows(self):
        with tempfile.TemporaryDirectory() as folder:
            target = Path(folder) / "catalog.json"
            run = self.call("scripts/build_catalog.py", "--output", str(target))
            self.assertEqual(run.returncode, 0, run.stderr)
            self.assertEqual(json.loads(target.read_bytes()), EXPECTED)
            checked = self.call("scripts/check_catalog.py", "--catalog", str(target))
            self.assertEqual(checked.returncode, 0, checked.stderr)
            print(json.dumps({"case": "valid_two_rows", "buildExit": run.returncode,
                              "checkExit": checked.returncode, "sha256": hashlib.sha256(target.read_bytes()).hexdigest()}))

    def test_duplicate_id_is_rejected(self):
        with tempfile.TemporaryDirectory() as folder:
            source, target = Path(folder) / "duplicate.csv", Path(folder) / "catalog.json"
            source.write_text("id,label\nalpha,Alpha\nalpha,Another\n", encoding="utf-8")
            run = self.call("scripts/build_catalog.py", "--input", str(source), "--output", str(target))
            self.assertEqual(run.returncode, 2)
            self.assertIn("duplicate id: alpha", run.stderr)
            self.assertFalse(target.exists())
            print(json.dumps({"case": "duplicate_id", "exit": run.returncode,
                              "stderr": run.stderr.strip(), "outputCreated": target.exists()}))

    def test_absent_catalog_fails(self):
        with tempfile.TemporaryDirectory() as folder:
            missing = Path(folder) / "absent.json"
            run = self.call("scripts/check_catalog.py", "--catalog", str(missing))
            self.assertEqual(run.returncode, 1)
            self.assertIn("missing catalog:", run.stderr)
            print(json.dumps({"case": "absent_catalog", "exit": run.returncode, "stderr": run.stderr.strip()}))


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