import json
from pathlib import Path

from osx_backup.context import Context
from osx_backup.manifest import build_manifest, read_manifest, write_manifest
from osx_backup.modules.base import ModuleResult


def test_build_write_read(ctx: Context) -> None:
    results = {
        "brew": ModuleResult.ok("ok", size_bytes=10, items=3),
        "docker": ModuleResult.failed("boom"),
    }
    m = build_manifest(ctx, "backup", results)
    assert m.action == "backup" and m.home == str(ctx.home)
    assert m.created_at == ctx.timestamp
    assert m.module_names == ["brew"]
    path = write_manifest(ctx.dest, m)
    assert path == ctx.dest / "manifest.json"
    history = list((ctx.dest / "manifests").glob("*.json"))
    assert history == [ctx.dest / "manifests" / f"{ctx.timestamp}.json"]
    assert history[0].read_text(encoding="utf-8") == path.read_text(encoding="utf-8")
    loaded = read_manifest(ctx.dest)
    assert loaded is not None
    assert loaded.modules["docker"]["status"] == "failed"
    assert loaded.modules["brew"]["items"] == 3
    assert json.loads(path.read_text())["tool_version"] == loaded.tool_version


def test_read_missing(dest: Path) -> None:
    assert read_manifest(dest) is None
