#!/usr/bin/env python3
"""Strict JSON transport for the unified Claude/Codex pool selector."""

from __future__ import annotations

import json
import sys
from decimal import Decimal, DecimalException
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "lib"))

from selector_policy import select  # noqa: E402
from selector_primitives import SCHEMA, SELECTOR_VERSION  # noqa: E402


def _invalid_json() -> dict:
    return {"schema": SCHEMA, "selector_version": SELECTOR_VERSION, "ok": False,
            "error_code": "invalid_request", "error_detail": {"field": "$"}}


def _strict_object(pairs: list[tuple[str, object]]) -> dict:
    result: dict = {}
    for key, value in pairs:
        if key in result:
            raise ValueError("duplicate JSON object key")
        result[key] = value
    return result


def main() -> int:
    if sys.argv[1:] == ["--version"]:
        print(SELECTOR_VERSION)
        return 0
    if sys.argv[1:] != ["--request-json", "-", "--response-json", "-"]:
        print("usage: multiacc-select --request-json - --response-json -", file=sys.stderr)
        return 2
    try:
        raw = sys.stdin.buffer.read().decode("utf-8")
        request = json.loads(
            raw, object_pairs_hook=_strict_object, parse_float=Decimal,
            parse_constant=lambda value: (_ for _ in ()).throw(ValueError(value)))
        response = select(request)
    except (UnicodeDecodeError, ValueError, json.JSONDecodeError, DecimalException):
        response = _invalid_json()
    print(json.dumps(response, ensure_ascii=False, allow_nan=False, separators=(",", ":")))
    return 0


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