#!/usr/bin/env python3
import importlib.util
import json
import os
from pathlib import Path
import stat
import sys

validator_path, manifest_path, revision = sys.argv[1:]
spec = importlib.util.spec_from_file_location("runtime_subset_validator", validator_path)
validator = importlib.util.module_from_spec(spec)
spec.loader.exec_module(validator)
manifest = json.loads(Path(manifest_path).read_text(encoding="utf-8"))
home = Path.home()
managed = home / ".local/share/overdeck/claude-runtime"
current = managed / revision
complete = [path for path in managed.iterdir() if path.is_dir() and (path / ".runtime-complete").is_file()]

for entry in manifest["entries"]:
    rel = entry["path"]
    src = entry.get("src", rel)
    link = home / ".claude" / rel
    target = current / src
    if not target.exists() and not target.is_symlink():
        print(f"entry:{rel}:missing-target", file=sys.stderr)
        sys.exit(1)
    if not link.exists() and not link.is_symlink():
        continue
    mode = link.lstat().st_mode
    if stat.S_ISLNK(mode):
        resolved = Path(os.path.abspath(link.parent / os.readlink(link)))
        try:
            resolved.relative_to(managed)
        except ValueError:
            print(f"entry:{rel}:foreign-symlink", file=sys.stderr)
            sys.exit(1)
        continue
    if stat.S_ISDIR(mode):
        targets = [release / src for release in complete if (release / src).exists() or (release / src).is_symlink()]
        legacy = {key: set(values) for key, values in entry.get("legacy_takeover_sha256", {}).items()}
        try:
            validator.validate(str(link), [str(path) for path in targets], legacy)
        except SystemExit:
            print(f"entry:{rel}", file=sys.stderr)
            raise
        continue
    if stat.S_ISREG(mode) and target.is_file():
        if link.read_bytes() != target.read_bytes():
            print(f"entry:{rel}:file-mismatch", file=sys.stderr)
            sys.exit(1)
        continue
    print(f"entry:{rel}:type-mismatch", file=sys.stderr)
    sys.exit(1)

print("runtime-links:adoptable")
