from __future__ import annotations

import argparse
import json
from datetime import datetime, timezone
from pathlib import Path
from typing import Any


def _load_json(path: Path) -> dict[str, Any]:
    if not path.exists():
        return {}
    try:
        return json.loads(path.read_text(encoding="utf-8"))
    except (json.JSONDecodeError, OSError):
        return {}


def assess_alert_proof(alert_report_path: str | Path) -> dict[str, Any]:
    path = Path(alert_report_path)
    payload = _load_json(path)
    raw_alerts = payload.get("alerts")
    alerts: list[Any] = raw_alerts if isinstance(raw_alerts, list) else []
    blockers: list[str] = []
    if payload.get("status") != "ok":
        blockers.append("alert_smoke_not_ok")
    if payload.get("secrets_sent") is True:
        blockers.append("secrets_sent_true")
    if not alerts:
        blockers.append("no_alerts_in_smoke")
    for item in alerts:
        name = str(item.get("name") or "unknown") if isinstance(item, dict) else "unknown"
        sent = item.get("sent") if isinstance(item, dict) else False
        if sent is not True:
            blockers.append(f"alert_not_sent:{name}")
    return {
        "timestamp": datetime.now(timezone.utc).isoformat(),
        "alerts_proven": not blockers,
        "blockers": blockers,
        "alert_report_path": str(path),
        "alerts_checked": len(alerts),
        "status": payload.get("status"),
    }


def update_preflight_alert_evidence(*, runtime_dir: str | Path = "runtime", alert_report_path: str | Path | None = None) -> dict[str, Any]:
    runtime = Path(runtime_dir)
    if alert_report_path is None:
        candidates = sorted((runtime / "reports").glob("telegram_alert_smoke_*.json"), key=lambda p: p.stat().st_mtime, reverse=True)
        alert_report_path = candidates[0] if candidates else runtime / "reports" / "telegram_alert_smoke_latest.json"
    proof = assess_alert_proof(alert_report_path)
    preflight_path = runtime / "reports" / "preflight_evidence_latest.json"
    preflight = _load_json(preflight_path)
    preflight["telegram_alerts_tested"] = bool(proof["alerts_proven"])
    preflight["telegram_alert_proof"] = proof
    preflight_path.parent.mkdir(parents=True, exist_ok=True)
    preflight_path.write_text(json.dumps(preflight, indent=2, sort_keys=True, default=str), encoding="utf-8")
    return proof


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description="Assess Telegram alert smoke evidence and update preflight evidence.")
    parser.add_argument("--runtime-dir", default="runtime")
    parser.add_argument("--alert-report-path")
    parser.add_argument("--json", action="store_true")
    args = parser.parse_args(argv)
    proof = update_preflight_alert_evidence(runtime_dir=args.runtime_dir, alert_report_path=args.alert_report_path)
    if args.json:
        print(json.dumps(proof, indent=2, sort_keys=True))
    else:
        print(f"Alert Proof: proven={proof['alerts_proven']} blockers={proof['blockers'] or 'keine'}")
    return 0 if proof["alerts_proven"] else 2


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