o
    i&                     @   s  d dl mZ d dlmZ d dlmZ d dlZd dlZd dlmZm	Z	 ddl
mZ ddlmZ zd d	lmZ d d
lmZ d dlmZ W n1 eyU   ed dZdZdZY n eys Z zede  dZdZdZW Y dZ[ndZ[ww zd dlmZ ed W n* ey   zd dlmZ ed W n ey   ed G dd dZY nw Y nw zd dlmZ ed W n* ey   zd dlmZ ed W n ey   ed G dd dZY nw Y nw dd Zdd Zdd Z G d d! d!Z!G d"d# d#Z"ed$d% Z#d&d' Z$dS )(    render)JsonResponse)csrf_exemptN)datetime	timedelta   )GeminiClient)
RAGService)OpenAI)LLMChain)PromptTemplatezUWARNING: OpenAI dependencies could not be imported. OpenAI Agent will be unavailable.z.WARNING: Error importing OpenAI dependencies: )Empresaz*Usando modelo Empresa desde Models.Empresaz.Usando modelo Empresa desde api_empresa.modelsuA   No se pudo importar ningún modelo de Empresa, usando simulaciónc                   @      e Zd ZdZdS )r   N__name__
__module____qualname__objects r   r   +/var/www/html/crm_dreinet/ai_agent/views.pyr   &       r   )OportunidadDeVentaz-Usando modelo OportunidadDeVenta desde Modelsz*Usando modelo OportunidadDeVenta desde apiu3   No se pudo importar OportunidadDeVenta, simulaciónc                   @   r   )r   Nr   r   r   r   r   r   3   r   r   c               
   C   sr   t  j} t  j}ztjj| |dd}dd |D W S  ty8 } ztdt	|  g W  Y d }~S d }~ww )NT)fecha_creacion__monthfecha_creacion__yeardeleted_at__isnullc                 S   sh   g | ]0}|j |jd t|ddt|drt|jddndt|dr)t|jddndt|dddqS )%Y-%m-%dcuitzNo disponible	provincianombre	localidad	direccion)r   fecha_creacionr   r   r    r!   )r   r"   strftimegetattrhasattrr   r    ).0cr   r   r   
<listcomp>@   s    



z0get_new_companies_this_month.<locals>.<listcomp>zError al obtener empresas: )
r   nowmonthyearr   r   filter	Exceptionprintstr)current_monthcurrent_yearnew_companieser   r   r   get_new_companies_this_month7   s    

r4   c                  C   s   zMzddl m}  W n$ ty-   zddlm}  W n ty*   td g  Y  Y W S w Y nw t tdd }| jj	|dd
dd d	 }d
d |D W S  tyj } ztdt|  g W  Y d }~S d }~ww )Nr   )	Actividadz*No se pudo importar el modelo de Actividad   )daysT)
fecha__gter   z-fecha
   c              	   S   sX   g | ](}t |d dt|dr|jr|jjndt|dr!|jdndt |ddd	qS )
tipoGeneralempresazNo especificadafechar   zFecha no disponibledescripcionz	Sin notas)r:   r<   r=   notas)r$   r%   r<   r   r=   r#   )r&   ar   r   r   r(   ]   s    


z)get_recent_activities.<locals>.<listcomp>zError al obtener actividades: )api_actividad.modelsr5   ImportErrorModels.api_actividad_modelr.   r   r)   r   r   r,   order_byr-   r/   )r5   fecha_limiteactividadesr3   r   r   r   get_recent_activitiesL   s6   rG   c               
   C   s   z8t jjddd } t jjddd }ztjjdd }W n   d}Y | ||d|  d| d	| d
dW S  tyS } ztd|  i W  Y d}~S d}~ww )z0Retrieves real-time statistics from the databaseT   )r   tipo_empresar   )r   r   zEl sistema cuenta con z clientes activos, z datos potenciales y z$ oportunidades de venta registradas.)total_clientestotal_datos_potencialestotal_oportunidadesresumenzError stats: N)r   r   r,   countr   r-   r.   )rJ   total_datosrL   r3   r   r   r   get_system_statsg   s"   rP   c                   @      e Zd Zdd ZdddZdS )GeminiAgentc              
   C   sF   zt  | _t | _td W d S  ty" } ztd| d }~ww )Nz!Inicializando GeminiAgent con RAGzError inicializando Gemini: )r	   clientr
   ragr.   r-   selfr3   r   r   r   __init__~   s   zGeminiAgent.__init__Nc              
   C   s  |si }t  }|r||d< t }|r||d< t }|r||d< g }z7| j|}|D ](}|d}|rR|ddkrR|ddd	krRtd
|d   |d   W S q*||d< W n tyu }	 ztd|	  g |d< W Y d }	~	nd }	~	ww tj	|ddd}
d|
 d| d}| j
| S )Nempresas_nuevas_mesactividades_recientesestadisticas_sistemametadatatypeanswer_bankscorer   g333333?zUsing Cached Answer: contentknowledge_basezRAG Error: FrH   ensure_asciiindentu  
        Eres un asistente experto para el CRM Dreinet.
        
        INSTRUCCIONES CRÍTICAS:
        1. Tu objetivo es responder preguntas sobre el ESTADO ACTUAL del negocio usando los datos proporcionados.
        2. Si te preguntan "cuántos", "reporte", o "estado", TIENES QUE USAR los datos de 'estadisticas_sistema' o 'empresas_nuevas_mes'.
        3. NO describas capacidades. RESPONDE CON NÚMEROS.
        4. Si el usuario pregunta algo que ya está en 'knowledge_base' (como un reporte anterior guardado), úsalo.
        5. IMPORTANTE: SIEMPRE menciona los números exactos de clientes, datos y oportunidades si te piden un resumen.
        
        DATOS EN TIEMPO REAL:
        z(
        
        PREGUNTA DEL USUARIO: z%
        
        Respuesta:
        )r4   rG   rP   rT   searchgetr.   r-   jsondumpsrS   generate_contentstrip)rV   querycontext_datar2   
activitiesstatsrag_resultsresultmetar3   formatted_contextpromptr   r   r   process_query   s<   
"zGeminiAgent.process_queryNr   r   r   rW   rs   r   r   r   r   rR   }   s    rR   c                   @   rQ   )OpenAIAgentc              
   C   sh   t d u rtdd| _ztdtjd< t dd| _td W d S  ty3 } ztd| d }~ww )Nz<OpenAI libraries are not available due to dependency issues.FOPENAI_API_KEYgffffff?)temperaturezInicializando OpenAIAgentzError inicializando OpenAI: )r   r-   use_simulationosgetenvenvironllmr.   rU   r   r   r   rW      s   zOpenAIAgent.__init__Nc           	      C   sp   |si }t  }|r||d< t }|r||d< d}tddg|d}t| j|d}tj|dd	d
}|j||d S )NrX   rY   u   
        Eres un asistente para un sistema CRM llamado Dreinet CRM.
        Información disponible (formato JSON):
        {context}
        Pregunta del usuario: {query}
        Responde de manera profesional.
        contextrj   )input_variablestemplate)r}   rr   FrH   ra   )r~   rj   )	r4   rG   r   r   r}   rf   rg   runri   )	rV   rj   rk   r2   rl   r   rr   chainrq   r   r   r   rs      s   zOpenAIAgent.process_queryrt   ru   r   r   r   r   rv      s    rv   c              
   C   s   | j dkr[z6t| j}|dd}|stddiddW S tdd	 }|d
kr-t	 }nt
 }||}td|iW S  tyZ } ztddt| iddW  Y d }~S d }~ww tddiddS )NPOSTrj    erroru   Consulta vacíai  )statusAI_PROVIDERgeminiopenairesponsezError: i  zMethod not allowedi  )methodrf   loadsbodyre   r   rz   r{   lowerrv   rR   rs   r-   r/   )requestdatarj   provideragentr   r3   r   r   r   agent_query   s    

&r   c                 C   s
   t | dS )Nzai_agent/chat.htmlr   )r   r   r   r   	chat_view   s   
r   )%django.shortcutsr   django.httpr   django.views.decorators.csrfr   rf   rz   r   r   gemini_clientr	   rag_servicer
   langchain_community.llmsr   langchain.chainsr   langchain.promptsr   rB   r.   r-   r3   Models.Empresar   api_empresa.models!Models.oportunidad_de_venta_modelr   api_oportunidad_de_venta.modelsr4   rG   rP   rR   rv   r   r   r   r   r   r   <module>   st    

=!
