from osx_backup.context import Context
from osx_backup.modules.base import NullProgress, get_module
from osx_backup.modules.editors import EXTENSIONS_FILE, EditorsModule
from osx_backup.runner import RecordingRunner


def test_registered() -> None:
    assert isinstance(get_module("editors"), EditorsModule)


def _seed(ctx: Context) -> None:
    user = ctx.home / "Library" / "Application Support" / "Code" / "User"
    user.mkdir(parents=True)
    (user / "settings.json").write_text("{}")
    (ctx.home / ".config" / "zed").mkdir(parents=True)
    (ctx.home / ".config" / "zed" / "settings.json").write_text("{}")


def test_backup_lists_extensions(ctx: Context) -> None:
    _seed(ctx)
    runner = RecordingRunner()
    runner.add(("code", "--list-extensions"), stdout="ms-python.python\nesbenp.prettier-vscode\n")
    ctx.runner = runner
    res = EditorsModule().backup(ctx, NullProgress())
    assert res.status == "ok"
    ext = (ctx.dest / "editors" / EXTENSIONS_FILE).read_text().splitlines()
    assert ext == ["ms-python.python", "esbenp.prettier-vscode"]
    assert (ctx.dest / "editors" / ".config" / "zed" / "settings.json").exists()


def test_backup_without_code_cli_warns(ctx: Context) -> None:
    _seed(ctx)
    ctx.runner = RecordingRunner(which_map={})
    res = EditorsModule().backup(ctx, NullProgress())
    assert res.status == "ok" and any("code" in w for w in res.warnings)


def test_restore_installs_extensions(ctx: Context) -> None:
    _seed(ctx)
    runner = RecordingRunner()
    runner.add(("code", "--list-extensions"), stdout="a.b\nc.d\n")
    runner.add(("code", "--install-extension", "c.d"), returncode=1, stderr="boom")
    ctx.runner = runner
    EditorsModule().backup(ctx, NullProgress())
    res = EditorsModule().restore(ctx, NullProgress())
    assert res.status == "ok"
    assert ["code", "--install-extension", "a.b"] in runner.mutations
    assert any("c.d" in w for w in res.warnings)
