"""One server-side request, stdlib only. No automatic retries."""
import json
import os
import sys
import urllib.error
import urllib.request
from urllib.parse import urlsplit


class RequestError(Exception):
    pass


def settings():
    key = os.environ.get('NV_API_KEY', '').strip()
    base = os.environ.get('NV_API_BASE_URL', 'http://127.0.0.1:4175/v1').rstrip('/')
    url = urlsplit(base)
    local = url.scheme == 'http' and url.hostname in ('127.0.0.1', 'localhost', '::1')
    if not (url.scheme == 'https' or local) or url.username or url.password or url.query or url.fragment:
        raise RequestError('Use your HTTPS API base URL or local loopback gateway.')
    if not key or '\r' in key or '\n' in key:
        raise RequestError('Set NV_API_KEY on your server; never put it in browser code.')
    return base, key


def request(model, prompt, maximum=512):
    base, key = settings()
    data = json.dumps({'model': model, 'messages': [{'role': 'user', 'content': prompt}],
                       'max_tokens': maximum, 'temperature': 0.2, 'stream': False}).encode('utf-8')
    req = urllib.request.Request(base + '/chat/completions', data=data,
                                 headers={'Authorization': 'Bearer ' + key,
                                          'Content-Type': 'application/json'})
    # Do not follow a redirect carrying an API credential to a different host.
    class NoRedirect(urllib.request.HTTPRedirectHandler):
        def redirect_request(self, *args):
            return None
    try:
        with urllib.request.build_opener(NoRedirect()).open(req, timeout=60) as response:
            return json.load(response)
    except urllib.error.HTTPError as error:
        status = error.code
        with error:
            try:
                code = json.loads(error.read(8192)).get('error', {}).get('code', 'http_error')
            except (ValueError, AttributeError):
                code = 'http_error'
        raise RequestError(f'HTTP {status}: {code}. Check request history before repeating.') from None
    except (urllib.error.URLError, TimeoutError, OSError, ValueError):
        raise RequestError('Connection or response error. Check history before repeating; no retry was sent.') from None


if __name__ == '__main__':
    try:
        payload = request(os.environ.get('NV_MODEL', 'gpt-mini'),
                          ' '.join(sys.argv[1:]) or 'Придумай три названия кофейни.')
        print(payload['choices'][0]['message']['content'])
        print('Usage:', json.dumps(payload.get('usage', {}), ensure_ascii=False))
    except (RequestError, KeyError, IndexError, TypeError) as error:
        print(str(error), file=sys.stderr)
        sys.exit(1)
