"""Минимальный непотоковый запрос TokenTool на стандартной библиотеке Python."""

from __future__ import annotations

import json
import os
import re
import sys
from typing import Any
from urllib.error import HTTPError, URLError
from urllib.request import Request, urlopen


BASE_URL = "https://api.tokentool.ru/api/v1"
PLACEHOLDER_KEY = "sk-tt-REPLACE_ME"
PLACEHOLDER_MODEL = "provider/model-id"
MODEL_PATTERN = re.compile(r"^[A-Za-z0-9._~:/-]+$")


def require_configuration() -> tuple[str, str]:
    api_key = os.environ.get("TOKEN_TOOL_API_KEY", PLACEHOLDER_KEY)
    model_id = os.environ.get("TOKEN_TOOL_MODEL_ID", PLACEHOLDER_MODEL)

    if api_key == PLACEHOLDER_KEY:
        raise RuntimeError(
            "Задайте TOKEN_TOOL_API_KEY в переменной окружения текущей сессии."
        )
    if not api_key.startswith("sk-tt-") or any(char.isspace() for char in api_key):
        raise RuntimeError("TOKEN_TOOL_API_KEY не похож на ключ TokenTool.")
    if model_id == PLACEHOLDER_MODEL:
        raise RuntimeError("Задайте актуальный TOKEN_TOOL_MODEL_ID.")
    if not MODEL_PATTERN.fullmatch(model_id):
        raise RuntimeError(
            "TOKEN_TOOL_MODEL_ID содержит неподдерживаемые символы."
        )

    return api_key, model_id


def extract_text(body: Any) -> str:
    try:
        content = body["choices"][0]["message"]["content"]
    except (KeyError, IndexError, TypeError) as error:
        raise ValueError("Ответ API не содержит choices[0].message.content.") from error
    if not isinstance(content, str):
        raise ValueError("Текст ответа API имеет неожиданный тип.")
    return content


def main() -> int:
    try:
        api_key, model_id = require_configuration()
    except RuntimeError as error:
        print(error, file=sys.stderr)
        return 2

    payload = {
        "model": model_id,
        "messages": [
            {
                "role": "user",
                "content": "Ответьте одним предложением: что такое API?",
            }
        ],
    }

    request = Request(
        f"{BASE_URL}/chat/completions",
        data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
        headers={
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json",
        },
        method="POST",
    )

    try:
        with urlopen(request, timeout=60) as response:
            body = json.load(response)
        print(extract_text(body))
    except HTTPError as error:
        print(f"TokenTool вернул HTTP {error.code}.", file=sys.stderr)
        return 1
    except URLError as error:
        print(f"Не удалось подключиться к TokenTool: {error.reason}", file=sys.stderr)
        return 1
    except (ValueError, json.JSONDecodeError) as error:
        print(str(error), file=sys.stderr)
        return 1

    return 0


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