from osx_backup.context import Context
from osx_backup.modules.base import NullProgress, get_module
from osx_backup.modules.claude import ClaudeModule, claude_items


def _seed(ctx: Context) -> None:
    c = ctx.home / ".claude"
    (c / "hooks").mkdir(parents=True)
    (c / "settings.json").write_text("{}")
    (c / "hooks" / "h.sh").write_text("#!/bin/sh")
    (c / "plugins" / "cache" / "x").mkdir(parents=True)
    (c / "plugins" / "cache" / "x" / "big").write_text("cache")
    (c / "plugins" / "installed.json").write_text("[]")
    (c / "projects" / "p1" / "memory").mkdir(parents=True)
    (c / "projects" / "p1" / "memory" / "MEMORY.md").write_text("m")
    (c / "projects" / "p1" / "sessions").mkdir()
    (c / "projects" / "p1" / "sessions" / "s.jsonl").write_text("nope")
    (ctx.home / ".claude.json").write_text("secret")


def test_registered() -> None:
    assert isinstance(get_module("claude"), ClaudeModule)


def test_claude_items_include_memory_glob(ctx: Context) -> None:
    _seed(ctx)
    rels = [i.rel for i in claude_items(ctx)]
    assert ".claude/projects/p1/memory" in rels
    assert ".claude/plugins" in rels


def test_claude_backup_excludes_cache_and_sessions(ctx: Context) -> None:
    _seed(ctx)
    res = ClaudeModule().backup(ctx, NullProgress())
    assert res.status == "ok"
    out = ctx.dest / "claude" / ".claude"
    assert (out / "settings.json").exists()
    assert (out / "plugins" / "installed.json").exists()
    assert not (out / "plugins" / "cache").exists()
    assert (out / "projects" / "p1" / "memory" / "MEMORY.md").exists()
    assert not (out / "projects" / "p1" / "sessions").exists()
    assert not (ctx.dest / "claude" / ".claude.json").exists()
