import pandas as pd
import os
import openai
import json 
from json import loads, dumps
import gradio as gr

# API de OpenAI

openai.api_key = os.getenv("OPENAI_API_KEY")

# Cargar el archivo JSON #CNT-002-2007
with open("Concentraciones_NPL.json") as json_file:
    global data
    data = json.load(json_file)
#

#

#print( dumps( data, indent = 4 ) )

# Main OpenAI Function
def get_completion_from_messages( messages, model = "gpt-3.5-turbo-16k", 
                                  temperature = 0, max_tokens = 4000 ): ##Check max_tokens 
    response = openai.ChatCompletion.create(
               model = model,
               messages = messages,
               temperature = temperature, 
               max_tokens = max_tokens, 
    )
    return response.choices[0].message["content"]


# Get SECTOR
def get_sector(data, Sector):
    #
    # Realizar una búsqueda por valor de clave
    clave = "Sector"
    valor = Sector#"Servicios financieros y de seguros"
    #
    if valor == 'Todos':
        resultados = data
    else:
        resultados = [item for item in data.values() if item.get(clave) == valor]
    #
    #global resultados
    #
    return resultados

# Funcion que conversa sobre el contexto proporcionado
def chatear(user_message, Sector):
    #
    resultados = get_sector(data, Sector)
    #
    delimiter = "####"
    #
    system_message = f"""
    Eres un especialista en derecho y economía de la competencia económica \
    con actividad profesional en México. Se te formularán consultas o \
    preguntas que deberás responder exclusivamente con la información \
    delimitada con los caracteres {delimiter}.
    
    La información que se te proporcionará estará en formato JSON o en una \
    lista que contiene diccionarios en formato JSON. La información que \
    corresponde con características de las resoluciones de la Comisión \
    Federal de Competencia Económica de México en casos de concentraciones \
    (fusiones) resueltas por el Pleno de la Comisión durante el año 2023.
    
    La información proporcionada esta indexada o tiene como índice el número \
    de expediente. Las variables de que se incluyen para cada expediente son:
    Expediente: Indica el número de expediente 
    Empresas: Son los nombres de las empresas involucradas en la concentración
    Fecha_Inicio: Fecha en la que se presentó la notificación de concentración
    Fecha_Resolucion: Fecha en la que el Pleno de la Comisión resolvió el expediente
    Duration: Diferencia en días entre Fecha_Resolucion y Fecha_Inicio
    Decision: La decisión tomada por el Pleno de la Comisión en relación a la \
    cooncentración
    Clausula_No_Competencia: Descripción de sí la operación de concentración \
    incluye una cláusula de no competencia
    Sector: Corresponde con el sector afectado por la operación de concentración
    Multa_Total, Agentes_Multados y Detalle_Multa son variables con información \
    sí el Pleno impuso una multa a las empresas.
    
    Asegúrate de realizar preguntas de seguimiento.
    """
    
    messages =  [  
    {'role':'system',
     'content': system_message},   
    {'role':'user',
     'content': f"""
    Usa exclusivamente la información de los expedientes de concentraciones: \
    {delimiter}{resultados}{delimiter} para \
    responder sin límite de palabras lo siguiente. {user_message}
    """},   
    ]
    #
    final_response = get_completion_from_messages(messages)
    #
    return final_response

# 
with gr.Blocks() as demo:
    #
    sectores = gr.Dropdown( ["Todos", "Alojamiento temporal y preparación de alimentos y bebidas",
                             "Comercio al por mayor", "Construcción", 
                             "Electricidad, agua y suministro de gas",
                             "Industrias manufactureras", "Información en medios masivos",
                             "Minería", "Servicios de esparcimiento culturales y deportivos",
                             "Servicios financieros y de seguros", 
                             "Servicios inmobiliarios y alquiler de bienes muebles e intangibles",
                             "Transportes, correos y almacenamiento"], 
                             label = "Selecciona un Sector." )
    busqueda = gr.Textbox(label = "Escribe la pregunta o tarea para iniciar la conversación.")
    greet_btn = gr.Button("Preguntar")
    output = gr.Textbox(label = "Respuesta:")
    greet_btn.click(fn = chatear, inputs = [ busqueda, sectores ], outputs = output)
    #
#demo.launch( share = True )
demo.launch( )
#