#!/usr/bin/env python3
"""RFC-001 lifecycle audit writer (JSONL, advisory-safe)."""

from __future__ import annotations

import argparse
import datetime as dt
import json
from pathlib import Path
from typing import Any, Dict, Optional

SCHEMA_VERSION = "rfc001.lifecycle-audit.v1"
DEFAULT_LOG_PATH = Path("/Users/openclaw/.openclaw/workspace/tmp/rfc001-lifecycle-audit.jsonl")

REQUIRED_FIELDS = [
    "timestamp",
    "schemaVersion",
    "lane",
    "sessionKey",
    "actionType",
    "triggerReason",
    "actor",
]


def utc_now_iso() -> str:
    return dt.datetime.now(dt.timezone.utc).isoformat().replace("+00:00", "Z")


def build_entry(
    *,
    lane: str,
    session_key: str,
    action_type: str,
    trigger_reason: str,
    actor: str,
    severity: str = "advisory",
    old_session_key: Optional[str] = None,
    new_session_key: Optional[str] = None,
    summary_reference_path: Optional[str] = None,
    details: Optional[Dict[str, Any]] = None,
) -> Dict[str, Any]:
    return {
        "timestamp": utc_now_iso(),
        "schemaVersion": SCHEMA_VERSION,
        "mode": "advisory",
        "severity": severity,
        "lane": lane,
        "sessionKey": session_key,
        "actionType": action_type,
        "triggerReason": trigger_reason,
        "oldSessionKey": old_session_key,
        "newSessionKey": new_session_key,
        "summaryReferencePath": summary_reference_path,
        "actor": actor,
        "details": details or {},
    }


def validate_entry(entry: Dict[str, Any]) -> None:
    missing = [k for k in REQUIRED_FIELDS if not entry.get(k)]
    if missing:
        raise ValueError(f"Missing required lifecycle audit fields: {', '.join(missing)}")


def append_entry(entry: Dict[str, Any], log_path: Path = DEFAULT_LOG_PATH) -> None:
    validate_entry(entry)
    log_path.parent.mkdir(parents=True, exist_ok=True)
    with log_path.open("a", encoding="utf-8") as f:
        f.write(json.dumps(entry, ensure_ascii=False) + "\n")


def main() -> int:
    p = argparse.ArgumentParser(description="Write RFC-001 lifecycle audit entry (JSONL)")
    p.add_argument("--lane", required=True)
    p.add_argument("--session-key", required=True)
    p.add_argument("--action-type", required=True, choices=["advisory", "rollover", "prune", "cleanup"])
    p.add_argument("--trigger-reason", required=True)
    p.add_argument("--actor", default="watchdog")
    p.add_argument("--severity", default="advisory")
    p.add_argument("--old-session-key")
    p.add_argument("--new-session-key")
    p.add_argument("--summary-reference-path")
    p.add_argument("--details-json", help="JSON object")
    p.add_argument("--log-path", default=str(DEFAULT_LOG_PATH))
    args = p.parse_args()

    details = json.loads(args.details_json) if args.details_json else {}
    entry = build_entry(
        lane=args.lane,
        session_key=args.session_key,
        action_type=args.action_type,
        trigger_reason=args.trigger_reason,
        actor=args.actor,
        severity=args.severity,
        old_session_key=args.old_session_key,
        new_session_key=args.new_session_key,
        summary_reference_path=args.summary_reference_path,
        details=details,
    )
    append_entry(entry, Path(args.log_path))
    print(json.dumps(entry, indent=2))
    return 0


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