"""Build and validate the machine-readable project-runtime release report."""

from __future__ import annotations

from datetime import datetime, timezone
from typing import Any

REPORT_VERSION = 1
MANDATORY_GATES = ("A", "B", "C", "Security", "Rollback")


def build_release_report(
    *,
    core_commit: str,
    cloud_commit: str,
    gateway_version: str,
    dispatcher_version: str | None,
    worker_version: str,
    port_catalog_fingerprint: str,
    test_project: str,
    test_environment: str,
    gates: dict[str, dict[str, Any]],
    blocking_conditions: list[str] | None = None,
) -> dict[str, Any]:
    blockers = list(blocking_conditions or [])
    for gate in MANDATORY_GATES:
        result = gates.get(gate)
        if not result or result.get("status") != "passed":
            blockers.append(f"gate_{gate}_not_passed")
    if not dispatcher_version:
        blockers.append("dispatcher_version_unverified")

    return {
        "report_version": REPORT_VERSION,
        "generated_at": datetime.now(timezone.utc).isoformat(),
        "versions": {
            "core_commit": core_commit,
            "cloud_commit": cloud_commit,
            "gateway_version": gateway_version,
            "dispatcher_version": dispatcher_version,
            "worker_version": worker_version,
            "port_catalog_fingerprint": port_catalog_fingerprint,
        },
        "fixture": {"project": test_project, "environment": test_environment},
        "gates": gates,
        "blocking_conditions": sorted(set(blockers)),
        "release_ready": not blockers,
    }


def validate_release_report(report: dict[str, Any]) -> None:
    if report.get("report_version") != REPORT_VERSION:
        raise ValueError("unsupported_report_version")
    if report.get("release_ready") is True and report.get("blocking_conditions"):
        raise ValueError("release_ready_with_blockers")
    versions = report.get("versions") or {}
    if report.get("release_ready") is True and not versions.get("dispatcher_version"):
        raise ValueError("dispatcher_version_unverified")

