"""ZYREX SHOP API client. No automatic retry of purchases. Python 3.9+, requests."""
import json
import os
import sys
import requests


class ZyrexAPI:
    def __init__(self, base_url=None, api_key=None):
        self.base_url = (base_url or os.environ.get('ZYREX_API_URL', '')).rstrip('/')
        self.api_key = api_key or os.environ.get('ZYREX_API_KEY', '')
        if not self.base_url.startswith(('https://', 'http://')) or not self.api_key:
            raise ValueError('Isi ZYREX_API_URL (hingga /api/v1) dan ZYREX_API_KEY di backend.')
        self.session = requests.Session()

    def request(self, method, path, payload=None, idempotency_key=None, params=None):
        if not path.startswith('/') or path.startswith('//') or '://' in path:
            raise ValueError('Gunakan path relatif, contoh /balance atau /order.')
        method = method.upper()
        headers = {'Authorization': 'Bearer ' + self.api_key, 'Accept': 'application/json'}
        if method == 'POST' and path in ('/order', '/smm/order'):
            if not idempotency_key or not 16 <= len(idempotency_key) <= 128:
                raise ValueError('Order memerlukan Idempotency-Key 16–128 karakter. Simpan dan pakai ulang saat retry.')
            headers['Idempotency-Key'] = idempotency_key
        try:
            response = self.session.request(method, self.base_url + path, params=params,
                                           json=payload, headers=headers, timeout=(5, 25), allow_redirects=False)
        except requests.RequestException:
            raise RuntimeError('Koneksi gagal atau timeout. Hasil POST mungkin belum pasti; jangan ulang dengan key berbeda.') from None
        try:
            body = response.json()
        except ValueError:
            body = {'success': False, 'message': 'Respons bukan JSON. Periksa status HTTP dan hubungi Admin.'}
        return {'http_status': response.status_code, 'body': body}


if __name__ == '__main__':
    # GET /balance is the safe default. Purchases require explicit POST + payload + key.
    method = sys.argv[1] if len(sys.argv) > 1 else 'GET'
    path = sys.argv[2] if len(sys.argv) > 2 else '/balance'
    payload = None
    if len(sys.argv) > 3:
        with open(sys.argv[3], encoding='utf-8') as source:
            payload = json.load(source)
        if not isinstance(payload, dict):
            raise ValueError('Payload harus objek JSON.')
    key = sys.argv[4] if len(sys.argv) > 4 else None
    try:
        print(json.dumps(ZyrexAPI().request(method, path, payload, key), indent=2, ensure_ascii=False))
    except (ValueError, RuntimeError) as error:
        sys.exit(str(error))
