import json
import os
import sys
from urllib.error import HTTPError, URLError
from urllib.parse import quote
from urllib.request import Request, urlopen


def required_env(name):
    value = os.environ.get(name)
    if not value:
        raise ValueError(f"Set {name} before running this example.")
    return value


def request_json(url, key, body=None):
    headers = {"Authorization": f"Bearer {key}"}
    data = None
    if body is not None:
        headers["Content-Type"] = "application/json"
        data = json.dumps(body).encode("utf-8")
    request = Request(url, data=data, headers=headers)
    with urlopen(request, timeout=60) as response:
        result = json.load(response)
    if not isinstance(result, dict):
        raise ValueError("Expected a JSON object response.")
    return result


def main():
    base_url = required_env("PROMPTLENS_RETRIEVAL_URL").rstrip("/")
    prompt_id = required_env("PROMPTLENS_PROMPT_ID")
    retrieval_key = required_env("PROMPTLENS_RETRIEVAL_KEY")
    provider_key = required_env("OPENROUTER_API_KEY")
    ticket = " ".join(sys.argv[1:]).strip()
    if not ticket:
        raise ValueError('Usage: python3 route_ticket.py "Your ticket"')

    prompt = request_json(
        f"{base_url}/api/v1/prompts/{quote(prompt_id, safe='')}", retrieval_key
    )
    if prompt.get("inputType") != "user_message" or "outputSchema" in prompt:
        raise ValueError("This example needs a User message prompt without an output schema.")
    route = prompt.get("modelRouteId")
    if not isinstance(route, str) or not route.startswith("openrouter:"):
        raise ValueError("Select and publish an OpenRouter model route for this example.")
    messages = prompt.get("messages")
    if not isinstance(messages, list) or not messages:
        raise ValueError("The saved prompt has no messages.")
    for message in messages:
        if (
            not isinstance(message, dict)
            or message.get("role") not in ("system", "user", "assistant")
            or not isinstance(message.get("content"), str)
        ):
            raise ValueError("Invalid saved message.")
    body = {
        "model": route[len("openrouter:"):],
        "messages": messages + [{"role": "user", "content": ticket}],
    }
    if "temperature" in prompt:
        body["temperature"] = prompt["temperature"]
    result = request_json(
        "https://openrouter.ai/api/v1/chat/completions", provider_key, body
    )
    choices = result.get("choices")
    choice = choices[0] if isinstance(choices, list) and choices else None
    message = choice.get("message") if isinstance(choice, dict) else None
    output = message.get("content") if isinstance(message, dict) else None
    if not isinstance(output, str):
        raise ValueError("The provider returned no text answer.")
    team = output.strip()
    if team not in ("billing", "technical", "account"):
        raise ValueError("The model did not return an allowed routing label.")
    print(json.dumps({"promptVersion": prompt["version"], "team": team}))


if __name__ == "__main__":
    try:
        main()
    except HTTPError as error:
        print(f"Request failed: HTTP {error.code}.", file=sys.stderr)
        sys.exit(1)
    except (URLError, TimeoutError, ValueError, KeyError) as error:
        print(str(error), file=sys.stderr)
        sys.exit(1)
