#!/usr/bin/env python3
"""Validate the generated P2HS Cloud contract projection without network access."""

from __future__ import annotations

import json
import sys
from pathlib import Path


ROOT = Path.cwd()
CONTRACT_PATH = ROOT / "p2hs" / "cloud-contract.json"
LOCK_PATH = ROOT / "p2hs" / "platform-ports.lock.json"


def fail(message: str) -> int:
    print(f"P2HS_CLOUD_CONTRACT_INVALID: {message}", file=sys.stderr)
    return 1


def main() -> int:
    try:
        contract = json.loads(CONTRACT_PATH.read_text(encoding="utf-8"))
        lock = json.loads(LOCK_PATH.read_text(encoding="utf-8"))
    except (OSError, json.JSONDecodeError) as exc:
        return fail(str(exc))

    if contract.get("schema_version") != 1:
        return fail("unsupported schema_version")
    if contract.get("catalog_version") != lock.get("catalog_version"):
        return fail("catalog_version does not match platform-ports.lock.json")

    ports = contract.get("ports")
    if not isinstance(ports, list) or not ports:
        return fail("ports must be a non-empty list")
    port_ids = [port.get("port_id") for port in ports if isinstance(port, dict)]
    if len(port_ids) != len(set(port_ids)):
        return fail("duplicate port_id")
    if set(port_ids) != set(lock.get("ports") or []):
        return fail("contract ports do not match the installed port lock")

    routes: set[tuple[str, str]] = set()
    for port in ports:
        if not isinstance(port, dict):
            return fail("port entry must be an object")
        bff = port.get("bff") or {}
        cloud = port.get("cloud") or {}
        schema = port.get("schema") or {}
        route_key = (str(bff.get("method", "")), str(bff.get("path", "")))
        if route_key in routes:
            return fail(f"duplicate BFF route: {route_key[0]} {route_key[1]}")
        routes.add(route_key)
        if not bff.get("method") or not bff.get("path"):
            return fail(f"{port.get('port_id')} missing BFF method/path")
        if cloud.get("transport") not in {"http", "queue", "runtime"}:
            return fail(f"{port.get('port_id')} has invalid Cloud transport")
        if not isinstance(schema.get("request_body"), dict):
            return fail(f"{port.get('port_id')} missing request_body schema")
        if not isinstance(schema.get("response"), dict):
            return fail(f"{port.get('port_id')} missing response schema")

    print(
        f"P2HS_CLOUD_CONTRACT_OK catalog={contract['catalog_version']} "
        f"ports={len(ports)} routes={len(routes)}"
    )
    return 0


if __name__ == "__main__":
    sys.exit(main())
