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

HERE = Path(__file__).resolve().parent
TARGET = HERE / "mystery_manifest.py"
SAMPLE = HERE / "sample_data"

def invoke(*args):
    return subprocess.run(
        [sys.executable, str(TARGET), *map(str, args)],
        capture_output=True, text=True, check=False
    )

class ManifestBehaviorTests(unittest.TestCase):
    def test_valid_directory_emits_json(self):
        result = invoke(SAMPLE)
        self.assertEqual(result.returncode, 0)
        data = json.loads(result.stdout)
        self.assertEqual(data["file_count"], len(data["files"]))

    def test_hidden_and_temp_files_excluded(self):
        data = json.loads(invoke(SAMPLE).stdout)
        paths = {item["path"] for item in data["files"]}
        self.assertNotIn(".private.txt", paths)
        self.assertNotIn("scratch.tmp", paths)

    def test_nested_file_included(self):
        data = json.loads(invoke(SAMPLE).stdout)
        paths = {item["path"] for item in data["files"]}
        self.assertIn("nested/events.log", paths)

    def test_missing_argument_returns_usage_error(self):
        result = invoke()
        self.assertEqual(result.returncode, 2)
        self.assertIn("usage:", result.stderr)

    def test_missing_directory_returns_error(self):
        result = invoke(HERE / "definitely_missing_input")
        self.assertEqual(result.returncode, 1)
        self.assertIn("error: not a directory:", result.stderr)

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