import json
import secrets
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.views.decorators.csrf import csrf_exempt
from .models import ChatSession, ChatMessage
from .services import get_reply
from apps.leads.models import Lead
from apps.analytics.utils import stitch_visitor


def _get_or_create_session(request):
    key = request.session.get('chatbot_key')
    if not key:
        key = secrets.token_hex(16)
        request.session['chatbot_key'] = key
    session, _ = ChatSession.objects.get_or_create(session_key=key)
    return session


@csrf_exempt
@require_POST
def message(request):
    try:
        data = json.loads(request.body or '{}')
    except json.JSONDecodeError:
        return JsonResponse({'error': 'Invalid JSON'}, status=400)

    user_text = (data.get('message') or '').strip()
    if not user_text:
        return JsonResponse({'error': 'Message required'}, status=400)
    if len(user_text) > 2000:
        return JsonResponse({'error': 'Message too long'}, status=400)

    session = _get_or_create_session(request)
    # capture optional contact info from chat UI
    for field in ('name', 'email', 'phone'):
        v = (data.get(field) or '').strip()
        if v:
            setattr(session, f"visitor_{field}", v[:120])

    # save user message
    ChatMessage.objects.create(session=session, role='user', content=user_text)

    history = list(session.messages.exclude(content=user_text).order_by('created_at'))
    reply, provider = get_reply(history, user_text)

    ChatMessage.objects.create(session=session, role='assistant', content=reply)

    # convert to lead if we have contact info and not already converted
    if not session.converted_to_lead and (session.visitor_email or session.visitor_phone):
        lead = Lead.objects.create(
            name=session.visitor_name or 'Chatbot Visitor',
            email=session.visitor_email,
            phone=session.visitor_phone,
            message=user_text[:1000],
            source='chatbot',
        )
        stitch_visitor(request, lead)
        session.converted_to_lead = True

    session.save()
    return JsonResponse({'reply': reply, 'provider': provider, 'session': session.session_key})


def history(request):
    session = _get_or_create_session(request)
    msgs = [{'role': m.role, 'content': m.content, 'at': m.created_at.isoformat()}
            for m in session.messages.order_by('created_at')]
    return JsonResponse({'messages': msgs})
