import os
import json
from datetime import datetime, timedelta
from django.conf import settings
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

# Importaciones de LangChain y Gemini
from langchain_google_genai import GoogleGenerativeAIEmbeddings, ChatGoogleGenerativeAI
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv

# --- IMPORTANTE: Importamos tu modelo de Suscriptor ---
from home.models import Suscriptor 

# 1. Cargamos las variables de entorno (tu GOOGLE_API_KEY)
load_dotenv()

# 2. Ruta dinámica a tu base de datos Chroma
CHROMA_PATH = os.path.join(settings.BASE_DIR, 'ia_consultor', 'chroma_db')

# 3. Inicializamos el motor RAG de forma global
try:
    embeddings = GoogleGenerativeAIEmbeddings(model="models/gemini-embedding-001")
    vector_db = Chroma(persist_directory=CHROMA_PATH, embedding_function=embeddings)
    retriever = vector_db.as_retriever(search_kwargs={"k": 3})

    llm = ChatGoogleGenerativeAI(model="gemini-2.5-pro", temperature=0.3)

    template = """Eres 'El Compa' (o 'La Compa'), el asesor virtual institucional del sindicato UTRAU (Unión de Trabajadores Rurales y Agroindustriales del Uruguay).
    Responde la consulta del compañero utilizando exclusivamente la información del contexto legal provisto abajo.
    Usa un tono cercano, solidario y respetuoso, propio de un dirigente sindical hablando con un trabajador rural uruguayo.
    Si la información no se encuentra en el contexto, dile amablemente que no dispones de esa información en la guía actual y recomiéndale comunicarse con el WhatsApp gremial o su delegado.
    
    REGLA ESTRICTA DE COMPORTAMIENTO: NUNCA menciones sucursales, direcciones ni oficinas del MTSS (Ministerio de Trabajo). Si el trabajador debe hacer un reclamo o trámite, derívalo SIEMPRE a su delegado sindical o al WhatsApp oficial de UTRAU.

    Contexto:
    {context}

    Pregunta: {question}

    Respuesta:"""
    
    prompt = ChatPromptTemplate.from_template(template)

    def format_docs(docs):
        return "\n\n".join(doc.page_content for doc in docs)

    rag_chain = (
        {"context": retriever | format_docs, "question": RunnablePassthrough()}
        | prompt
        | llm
        | StrOutputParser()
    )
except Exception as e:
    print(f"ATENCIÓN: Error al cargar el cerebro de El Compa: {e}")
    rag_chain = None

# ==========================================
# VISTAS DE LA API (Endpoints)
# ==========================================
@csrf_exempt
def consultar_consultor_ia(request):
    if request.method == 'POST':
        if not rag_chain:
            return JsonResponse({'error': 'El consultor IA está temporalmente fuera de servicio.'}, status=500)
            
        try:
            data = json.loads(request.body)
            pregunta = data.get('pregunta', '').strip()
            
            if not pregunta:
                return JsonResponse({'error': 'La consulta está vacía.'}, status=400)
                
            respuesta_texto = rag_chain.invoke(pregunta)
            return JsonResponse({'respuesta': respuesta_texto})
            
        except Exception as e:
            return JsonResponse({'error': f'Hubo un problema de conexión: {str(e)}'}, status=500)
            
    return JsonResponse({'error': 'Método no permitido.'}, status=405)


@csrf_exempt
def suscribir_usuario(request):
    if request.method == 'POST':
        try:
            nombre = request.POST.get('nombre', '').strip()
            nacimiento_str = request.POST.get('nacimiento', '').strip()
            departamento = request.POST.get('departamento', '').strip()
            email = request.POST.get('email', '').strip()
            celular = request.POST.get('whatsapp_num', '').strip()
            recibir_mail = request.POST.get('recibir_mail') == 'si'
            recibir_wa = request.POST.get('recibir_wa') == 'si'

            if recibir_mail and not email:
                return JsonResponse({'status': 'error', 'message': 'Falta el correo electrónico para la opción Mail.'}, status=400)
            if recibir_wa and not celular:
                return JsonResponse({'status': 'error', 'message': 'Falta el número para la opción WhatsApp.'}, status=400)
            if not recibir_mail and not recibir_wa:
                return JsonResponse({'status': 'error', 'message': 'Elige al menos un medio de contacto.'}, status=400)

            if celular:
                celular = celular.replace(' ', '').replace('-', '')
                if celular.startswith('09') and len(celular) == 9: 
                    celular = '+598' + celular[1:]
                elif celular.startswith('9') and len(celular) == 8:
                    celular = '+598' + celular

            f_nacimiento = None
            if nacimiento_str:
                try:
                    f_nacimiento = datetime.strptime(nacimiento_str, '%d/%m/%Y').date()
                except ValueError:
                    pass

            hora_uruguay = (datetime.utcnow() - timedelta(hours=3)).strftime('%Y-%m-%d %H:%M:%S')

            suscriptor = None
            if email:
                suscriptor = Suscriptor.objects.filter(email=email).first()
            if not suscriptor and celular:
                suscriptor = Suscriptor.objects.filter(celular=celular).first()

            if suscriptor:
                suscriptor.nombre = nombre
                if f_nacimiento:
                    suscriptor.f_nacimiento = f_nacimiento
                if departamento:
                    suscriptor.departamento = departamento
                if email:
                    suscriptor.email = email
                if celular:
                    suscriptor.celular = celular
                suscriptor.recibir_mail = recibir_mail
                suscriptor.recibir_whatsapp = recibir_wa
                suscriptor.activo = True
                suscriptor.save()
                mensaje = '¡Compañero, vimos que ya estabas registrado! Hemos actualizado tus datos y preferencias con éxito.'
            else:
                Suscriptor.objects.create(
                    nombre=nombre,
                    f_nacimiento=f_nacimiento,
                    departamento=departamento,
                    email=email,
                    celular=celular,
                    recibir_mail=recibir_mail,
                    recibir_whatsapp=recibir_wa,
                    fecha_suscripcion=hora_uruguay,
                    activo=True
                )
                mensaje = '¡Compañero, gracias por sumarte a la Unión! Tu suscripción se ha guardado correctamente.'
            
            return JsonResponse({'status': 'success', 'message': mensaje})
            
        except Exception as e:
            return JsonResponse({'status': 'error', 'message': str(e)}, status=500)
            
    return JsonResponse({'status': 'error', 'message': 'Método no permitido.'}, status=405)


# --- LA NUEVA VISTA PARA GUARDAR LA PREFERENCIA DE ASISTENTE ---
@csrf_exempt
def guardar_preferencia_asistente(request):
    if request.method == 'POST':
        if not request.user.is_authenticated:
            return JsonResponse({'status': 'error', 'message': 'Usuario no logueado.'}, status=403)
        
        try:
            asistente_id = int(request.POST.get('asistente_id', 0))
            if asistente_id in [1, 2]:
                request.user.asistente_preferido = asistente_id
                request.user.save()
                return JsonResponse({'status': 'success'})
        except ValueError:
            pass
        return JsonResponse({'status': 'error', 'message': 'ID inválido.'}, status=400)
    return JsonResponse({'status': 'error', 'message': 'Método no permitido.'}, status=405)