import os
import json
from openai import OpenAI
from dotenv import load_dotenv

# Cargar variables de entorno
load_dotenv()

# Instanciar el cliente OpenAI asegurando que se tenga la API KEY
api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)

def analizar_cliente(user_data: dict) -> dict:
    """
    Toma los datos completos de un cliente y utiliza OpenAI (gpt-4o-mini) en Modo JSON
    para generar inteligencia comercial y devolver un dashboard estructurado.
    """
    
    system_prompt = (
        "Eres el motor de Inteligencia Comercial con IA para el CRM avanzado de la empresa TWS2. "
        "Tu objetivo es analizar los datos de compras, interacciones de marketing, carritos abandonados "
        "y comportamiento financiero del cliente para generar un perfil y scores precisos.\n\n"
        
        "REGLAS ESTRÍCTAS:\n"
        "1. Debes evaluar automáticamente al cliente y detectar oportunidades de venta.\n"
        "2. Identifica riesgo de abandono (basado en mora o sentimientos negativos).\n"
        "3. Debes proveer un JSON VÁLIDO exactamente con la siguiente estructura y tipos de datos, sin texto adicional.\n\n"
        
        "ESTRUCTURA JSON ESPERADA:\n"
        "{\n"
        "  \"perfilamiento\": \"(Elige UNA: Cliente Potencial | Cliente Activo | Cliente Premium | Cliente Inactivo | Cliente en Riesgo | Cliente Conflictivo)\",\n"
        "  \"dashboard\": {\n"
        "    \"score_comercial\": (Número 0-100 calculando valor y frecuencia de compra),\n"
        "    \"score_riesgo\": (Número 0-100 donde 100 es alto riesgo de mora o abandono, basado en comportamiento financiero/interacciones),\n"
        "    \"score_afinidad\": (Número 0-100 midiendo interés en productos usando carritos y campañas),\n"
        "    \"nivel_satisfaccion\": \"(Alto | Medio | Bajo)\"\n"
        "  },\n"
        "  \"recomendacion_accion\": \"(Ej: Cliente con alta probabilidad de recompra. Recomendar campaña de PS5.)\",\n"
        "  \"resumen_analisis\": \"(Una breve explicación de por qué asignaste esos scores)\"\n"
        "}"
    )

    user_context = json.dumps(user_data, ensure_ascii=False)

    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            response_format={"type": "json_object"},
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": f"Analiza este cliente y devuelve el JSON:\n{user_context}"}
            ],
            temperature=0.2, # Baja temperatura para mayor consistencia en los scores
            max_tokens=500
        )
        
        # Parsear el string JSON a un diccionario de Python
        resultado_str = response.choices[0].message.content
        resultado_json = json.loads(resultado_str)
        
        return resultado_json
        
    except json.JSONDecodeError:
        return {"error": "La IA no devolvió un JSON válido."}
    except Exception as e:
        return {"error": f"Error de OpenAI: {str(e)}"}

def chatear_sobre_cliente(user_data: dict, pregunta: str) -> dict:
    """
    Toma los datos de un cliente y permite al usuario del CRM hacerle preguntas directas 
    a la IA sobre ese cliente específico (texto natural, no JSON estructurado).
    """
    
    system_prompt = (
        "Eres un experto analista de CRM y asesor comercial para la empresa TWS2. "
        "Basándote EXCLUSIVAMENTE en los datos que se te proporcionen del cliente, "
        "responde a la pregunta del usuario del CRM de forma analítica, comercial y directa. "
        "Si te preguntan por métricas o acciones, justifica tu respuesta usando los datos."
    )

    user_context = json.dumps(user_data, ensure_ascii=False)

    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": f"DATOS DEL CLIENTE:\n{user_context}\n\nPREGUNTA DEL ASESOR CRM:\n{pregunta}"}
            ],
            temperature=0.7, 
            max_tokens=600
        )
        
        respuesta_ia = response.choices[0].message.content
        return {"respuesta": respuesta_ia}
        
    except Exception as e:
        return {"error": f"Error de OpenAI en chat: {str(e)}"}
