"""
OpenAI GPT-4o mini integration for the AI Chat widget.

Security:
- API key loaded from env, never logged
- All messages sanitised before sending
- Max tokens capped per request
- Rate limiting applied per session in views.py
"""
import logging
from django.conf import settings

logger = logging.getLogger(__name__)

MODEL = 'gpt-4o-mini'   # roughly 15x cheaper than gpt-4o for this workload
LABEL_MODEL = 'gpt-4o-mini'   # two word topic labels, cheap and fast
MAX_TOKENS = 600       # enough for helpful answers with product links
TEMPERATURE = 0.7


def get_ai_response(messages_history: list, tenant) -> dict:
    """
    Send conversation history to OpenAI and return the assistant reply.

    Args:
        messages_history: list of {'role': ..., 'content': ...} dicts
        tenant: Tenant instance (for system prompt context)

    Returns:
        {
            'content': str,       # assistant reply
            'tokens': int,        # total tokens used
            'error': str | None,  # error message if failed
        }
    """
    from apps.pages.api_keys import get_openai_api_key
    api_key = get_openai_api_key(tenant)
    if not api_key:
        return {
            'content': 'Our AI assistant is currently unavailable. Please use the contact form.',
            'tokens': 0,
            'error': 'No OpenAI key set. Add one under Settings.',
        }

    try:
        # Import here so the module loads even without openai installed
        import openai
        client = openai.OpenAI(api_key=api_key)

        response = client.chat.completions.create(
            model=MODEL,
            messages=messages_history,
            max_tokens=MAX_TOKENS,
            temperature=TEMPERATURE,
        )

        content = response.choices[0].message.content.strip()
        tokens  = response.usage.total_tokens

        return {'content': content, 'tokens': tokens, 'error': None}

    except Exception as exc:
        logger.error('OpenAI chat error for tenant %s: %s', tenant.name if tenant else '?', exc)
        return {
            'content': 'Sorry, I encountered an issue. Please try again or use the contact form.',
            'tokens': 0,
            'error': str(exc),
        }


def get_short_label(prompt: str, tenant) -> str:
    """
    Ask for a very short topic label. Uses the cheaper mini model and a tiny
    token cap, since the answer is two words. Returns '' on any failure.
    """
    from apps.pages.api_keys import get_openai_api_key
    api_key = get_openai_api_key(tenant)
    if not api_key:
        return ''

    try:
        import openai
        client = openai.OpenAI(api_key=api_key)
        response = client.chat.completions.create(
            model=LABEL_MODEL,
            messages=[{'role': 'user', 'content': prompt}],
            max_tokens=12,
            temperature=0.2,
        )
        label = (response.choices[0].message.content or '').strip()
        label = label.strip('.\'"').replace(chr(10), ' ')
        words = label.split()
        return ' '.join(words[:2]) if words else ''
    except Exception as exc:
        logger.warning('Topic label failed for tenant %s: %s', tenant.name if tenant else '?', exc)
        return ''


def detect_handoff_intent(message: str, trigger_keywords: str) -> str | None:
    """
    Check if the user message contains any WhatsApp handoff trigger keywords.
    Uses whole-word matching so 'order' doesn't fire on 'in order to',
    'consult' doesn't fire on 'consulting', etc.
    Returns the matched keyword, or None.
    """
    import re
    if not trigger_keywords:
        return None

    message_lower = message.lower()
    for keyword in trigger_keywords.split(','):
        keyword = keyword.strip().lower()
        if keyword and re.search(r'\b' + re.escape(keyword) + r'\b', message_lower):
            return keyword

    return None
