{"file_name":"veil_coupon_box_client.py","path":"/app/client_kits/veil_coupon_box_client.py","content":"from __future__ import annotations\n\nimport hashlib\nimport hmac\nimport json\nimport os\nfrom typing import Any\n\nimport requests\n\n\nclass VeilCouponBoxClient:\n    \"\"\"HTTP client limpo para operadores externos do VEIL Coupon Box Engine.\"\"\"\n\n    def __init__(\n        self,\n        *,\n        base_url: str | None = None,\n        api_key: str | None = None,\n        client_secret: str | None = None,\n        timeout: float | None = None,\n    ) -> None:\n        self.base_url = (base_url or os.getenv(\"VEIL_COUPON_BOX_BASE_URL\", \"https://ia-arte-veil.onrender.com/veil-coupon-box-engine\")).rstrip(\"/\")\n        self.api_key = api_key or os.getenv(\"VEIL_COUPON_BOX_API_KEY\", \"\")\n        self.client_secret = client_secret or os.getenv(\"VEIL_COUPON_BOX_CLIENT_SECRET\", \"\")\n        self.timeout = timeout if timeout is not None else max(3.0, float(os.getenv(\"VEIL_OUTBOUND_TIMEOUT_SECONDS\", \"12\")))\n\n    def _signature(self, payload: dict[str, Any]) -> str:\n        body = json.dumps(self._canonicalize(payload), sort_keys=True, separators=(\",\", \":\")).encode(\"utf-8\")\n        return hmac.new(self.client_secret.encode(\"utf-8\"), body, hashlib.sha256).hexdigest()\n\n    def _canonicalize(self, value: Any) -> Any:\n        if isinstance(value, dict):\n            return {key: self._canonicalize(item) for key, item in value.items()}\n        if isinstance(value, list):\n            return [self._canonicalize(item) for item in value]\n        if isinstance(value, float) and value.is_integer():\n            return int(value)\n        return value\n\n    def process_purchase(self, payload: dict[str, Any]) -> dict[str, Any]:\n        response = requests.post(\n            f\"{self.base_url}/purchases/process\",\n            json=payload,\n            headers={\n                \"X-API-Key\": self.api_key,\n                \"X-Client-Signature\": self._signature(payload),\n            },\n            timeout=self.timeout,\n        )\n        response.raise_for_status()\n        return response.json()\n\n    def weekly_ranking(self) -> dict[str, Any]:\n        response = requests.get(f\"{self.base_url}/ranking/weekly\", timeout=self.timeout)\n        response.raise_for_status()\n        return response.json()\n\n\nif __name__ == \"__main__\":\n    client = VeilCouponBoxClient(\n        api_key=os.getenv(\"VEIL_COUPON_BOX_API_KEY\", \"VEIL-COUPON-BOX-CLIENT-2026\"),\n        client_secret=os.getenv(\"VEIL_COUPON_BOX_CLIENT_SECRET\", \"VEIL-COUPON-BOX-SECRET-2026\"),\n    )\n    result = client.process_purchase(\n        {\n            \"ref_code\": \"AURORA26\",\n            \"purchase_value\": 1500,\n            \"coupon_count\": 180,\n            \"buyer_id\": \"buyer_demo_001\",\n            \"fingerprint\": \"fp-demo-001\",\n            \"ip_hint\": \"177.10.10.10\",\n            \"device_label\": \"web_checkout\",\n        }\n    )\n    print(json.dumps(result, ensure_ascii=False, indent=2))\n"}