from __future__ import annotations

import json
import os
import time
from datetime import datetime, timezone
from pathlib import Path


def append_record(tool: str, runtime: str, mode: str, exit_code: int, started: float, *,
                  host: str | None = None, workspace: str | None = None,
                  reason: str | None = None, account: str | None = None,
                  log_path: Path | None = None, sandbox_id: str | None = None) -> None:
    if mode in ("aborted", "info-only"):
        containment = "none"
        host = workspace = None
        sandbox_id = None
    elif mode == "remote":
        containment = "ssh-agent-seat"
    else:
        containment = "podman-rootless"
    payload = {
        "schema": 1,
        "ts": datetime.now(timezone.utc).isoformat(timespec="milliseconds").replace("+00:00", "Z"),
        "tool": tool, "runtime": runtime, "mode": mode, "containment": containment,
        "host": host, "workspace": workspace, "sandboxId": sandbox_id, "account": account,
        "logPath": str(log_path) if log_path is not None else None, "exitCode": exit_code,
        "durationSec": round(time.monotonic() - started, 3), "reason": reason,
    }
    try:
        path = Path(os.environ.get("OD_CONTAINMENT_LOG", "~/.local/state/overdeck/containment.jsonl")).expanduser()
        path.parent.mkdir(parents=True, exist_ok=True)
        with path.open("a", encoding="utf-8") as stream:
            stream.write(json.dumps(payload, separators=(",", ":")) + "\n")
    except OSError:
        pass
