#!/usr/bin/env python3
from __future__ import annotations

import hashlib
import json
import os
import stat
from pathlib import Path

ROOT = Path(__file__).parent
ARCHIVE = Path("/home/cube/.hermes/profiles/dualcoachtest/data/post-lifecycle-cleanup-archives/task26-current-4a6c7ee5-20260817")


def sha(path: Path) -> str:
    return hashlib.sha256(path.read_bytes()).hexdigest()


def archive_rows() -> list[dict[str, str]]:
    rows: list[dict[str, str]] = []
    for base, dirs, files in os.walk(ARCHIVE):
        dirs.sort()
        files.sort()
        for name in dirs:
            path = Path(base) / name
            rows.append({"path": path.relative_to(ARCHIVE).as_posix(), "type": "D", "mode": f"{stat.S_IMODE(path.stat().st_mode):04o}"})
        for name in files:
            path = Path(base) / name
            rows.append({"path": path.relative_to(ARCHIVE).as_posix(), "type": "F", "mode": f"{stat.S_IMODE(path.stat().st_mode):04o}", "sha256": sha(path)})
    return rows


def digest_rows(rows: list[dict[str, str]]) -> str:
    raw = (json.dumps(rows, sort_keys=True, separators=(",", ":")) + "\n").encode()
    return hashlib.sha256(raw).hexdigest()


def main() -> int:
    inventory_raw = (ROOT / "inventory.json").read_bytes()
    inventory = json.loads(inventory_raw)
    seal = json.loads((ROOT / "SEAL.json").read_text())
    for row in inventory["entries"]:
        path = ROOT / row["path"]
        assert path.stat().st_size == row["size"] and sha(path) == row["sha256"], row["path"]
    assert seal["inventory_sha256"] == hashlib.sha256(inventory_raw).hexdigest()
    assert seal["controller_sha256"] == sha(ROOT / "cleanup_controller.py")
    assert seal["permission_sha256"] == sha(ROOT / "permission-seal-v3.json")
    assert seal["archive_root_sha256"] == digest_rows(archive_rows())
    assert all(stat.S_IMODE(path.stat().st_mode) == 0o600 for path in ARCHIVE.rglob("*") if path.is_file())
    print(json.dumps({"schema": "task26-cleanup-successor-seal-verification-v1", "status": "PASS", "evidence_entries": len(inventory["entries"]), "archive_entries": len(archive_rows()), "checks": len(inventory["entries"]) + 5}, sort_keys=True, separators=(",", ":")))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
