from __future__ import annotations

import json
from pathlib import Path
from typing import Any

from operational_report_contract import (
    REPORT_SCHEMA_VERSION,
    REPORT_SECTION_ORDER,
    REPORT_SOURCE_JSON,
)


ROOT = Path(__file__).resolve().parents[1]
SCHEMA_PATH = ROOT / "schemas" / "operational_report.schema.json"


def load_json(path: Path) -> dict[str, Any]:
    payload = json.loads(path.read_text(encoding="utf-8"))
    return payload if isinstance(payload, dict) else {}


def main() -> int:
    if not SCHEMA_PATH.exists():
        print("OPERATIONAL_REPORT_CONTRACT_FAIL: missing schema file")
        return 1

    schema = load_json(SCHEMA_PATH)
    errors: list[str] = []

    if schema.get("properties", {}).get("schema_version", {}).get("const") != REPORT_SCHEMA_VERSION:
        errors.append("schema_version const mismatch")
    if schema.get("properties", {}).get("source_json", {}).get("const") != REPORT_SOURCE_JSON:
        errors.append("source_json const mismatch")

    section_count = schema.get("properties", {}).get("section_count", {})
    if section_count.get("type") != "integer":
        errors.append("section_count type must be integer")

    sections = schema.get("properties", {}).get("sections", {})
    if sections.get("type") != "array":
        errors.append("sections type must be array")

    section_items = sections.get("items", {})
    name_type = section_items.get("properties", {}).get("name", {}).get("type")
    if name_type != "string":
        errors.append("section item name type must be string")

    if len(REPORT_SECTION_ORDER) != len(set(REPORT_SECTION_ORDER)):
        errors.append("contract section order contains duplicates")

    if errors:
        for error in errors:
            print(error)
        print("OPERATIONAL_REPORT_CONTRACT_FAIL")
        return 1

    print("OPERATIONAL_REPORT_CONTRACT_OK")
    return 0


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