import time

import requests
from django.conf import settings

OPENROUTER_URL = 'https://openrouter.ai/api/v1/chat/completions'
GROQ_URL = 'https://api.groq.com/openai/v1/chat/completions'


def _try_provider(url, api_key, model, messages, temperature):
    try:
        resp = requests.post(
            url,
            headers={'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'},
            json={'model': model, 'messages': messages, 'temperature': temperature},
            timeout=25,
        )
        if resp.status_code != 200:
            return None
        data = resp.json()
        return data['choices'][0]['message']['content']
    except (requests.RequestException, KeyError, IndexError):
        return None


def call_llm(messages, temperature=0.4):
    """Tries Groq first (fast, generous free tier, mostly Llama models) using
    each configured key/model in turn. Falls back to OpenRouter's free-model
    chain (two passes with a short pause, since free models get intermittently
    rate-limited upstream — expected free-tier behavior, not a bug) only if
    every Groq attempt fails. Returns the reply text, or None if every
    provider failed."""
    for api_key in settings.GROQ_API_KEYS:
        for model in settings.GROQ_MODELS:
            result = _try_provider(GROQ_URL, api_key, model, messages, temperature)
            if result:
                return result

    if settings.OPENROUTER_API_KEY:
        for attempt in range(2):
            for model in settings.OPENROUTER_MODELS:
                result = _try_provider(OPENROUTER_URL, settings.OPENROUTER_API_KEY, model, messages, temperature)
                if result:
                    return result
            if attempt == 0:
                time.sleep(2)

    return None
