"""教学订单工具：标准库、固定数据、明确授权范围；不访问真实订单。"""
from dataclasses import dataclass
import re


@dataclass(frozen=True)
class Principal:
    # 生产从认证中间件生成，不能让模型填写这两个字段。
    tenant: str
    user: str


DEMO_USER = Principal("shop-a", "user-417")
_ORDERS = {
    "A1042": {"tenant": "shop-a", "user": "user-417", "days_since_delivery": 10,
              "quality_verified": False, "source_revision": 12},
    "A2000": {"tenant": "shop-a", "user": "user-800", "days_since_delivery": 3,
              "quality_verified": True, "source_revision": 2},
}
ORDER_SCHEMA = {"type": "object", "properties": {
    "order_id": {"type": "string", "pattern": "^A[0-9]{4}$"}},
    "required": ["order_id"], "additionalProperties": False}
TOOL_DEFINITIONS = [
    {"name": "get_order", "description": "读取当前获准订单的签收天数和核实状态，不修改订单。",
     "input_schema": ORDER_SCHEMA},
    {"name": "get_refund_policy", "description": "读取该获准订单适用的教学政策，不批准或提交退款。",
     "input_schema": ORDER_SCHEMA},
]


class ToolFailure(ValueError):
    """允许向模型返回的有限故障码，不包含内部堆栈和秘密。"""


def validate_order_args(args: dict) -> str:
    # 拒绝租户、角色等未知字段，阻止参数扩大查询范围。
    if not isinstance(args, dict) or set(args) != {"order_id"}:
        raise ToolFailure("invalid_arguments: only order_id is allowed")
    value = args["order_id"]
    if not isinstance(value, str) or re.fullmatch(r"A[0-9]{4}", value) is None:
        raise ToolFailure("invalid_order_id")
    return value


def get_order(order_id: str, principal: Principal) -> dict:
    row = _ORDERS.get(order_id)
    if row is None or (row["tenant"], row["user"]) != (principal.tenant, principal.user):
        # 对外统一不可用，避免通过错误区别探测其他用户订单是否存在。
        raise ToolFailure("order_unavailable")
    return {"order_id": order_id, "days_since_delivery": row["days_since_delivery"],
            "quality_verified": row["quality_verified"], "source_revision": row["source_revision"]}


def get_refund_policy(order_id: str, principal: Principal) -> dict:
    get_order(order_id, principal)  # 先确认本次主体可访问目标订单。
    # 固定教学政策，真实服务需要按订单类别和时间选择适用版本。
    return {"policy_id": "P7-v2", "max_days": 30, "requires_quality_verification": True,
            "shipping_payer_if_eligible": "merchant"}


def dispatch(name: str, arguments: dict, principal: Principal) -> dict:
    # 显式注册表，绝不 eval 模型生成的名称或代码。
    registry = {"get_order": get_order, "get_refund_policy": get_refund_policy}
    if name not in registry:
        raise ToolFailure("unknown_tool")
    order_id = validate_order_args(arguments)
    return registry[name](order_id, principal)


if __name__ == "__main__":
    print(dispatch("get_order", {"order_id": "A1042"}, DEMO_USER))
