from machine import Pin, ADC, I2C
import network, time
from utime import sleep, sleep_ms
import ujson
import urequests
# OPENROUTER_API_KEY = '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'
OPENROUTER_API_KEY = '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'
led = Pin(7, Pin.OUT)
pot = ADC(Pin(16))
def conectaWifi (red, password):
      global miRed
      miRed = network.WLAN(network.STA_IF)     
      if not miRed.isconnected():              #Si no está conectado…
          miRed.active(True)                   #activa la interface
          miRed.connect(red, password)         #Intenta conectar con la red
          print('Conectando a la red', red +"…")
          timeout = time.time ()
          while not miRed.isconnected():           #Mientras no se conecte..
              if (time.ticks_diff (time.time (), timeout) > 10):
                  return False
      return True
if conectaWifi ("Wokwi-GUEST", ""):
    print ("Conexión exitosa!")
    print('Datos de la red (IP/netmask/gw/DNS):', miRed.ifconfig())
    def chat_with_openrouter(prompt, model="openai/gpt-3.5-turbo"):
        # URL de la API de OpenRouter
        url = "https://openrouter.ai/api/v1/chat/completions"
        
        # Encabezados de la solicitud
        headers = {
            "Authorization": f"Bearer {OPENROUTER_API_KEY}",
            "Content-Type": "application/json"
        }
        
        # Cuerpo de la solicitud
        data = {
            "model": model,  # Modelo que deseas utilizar
            "messages": [{"role": "user", "content": prompt}]
        }
            
        # Convertir el cuerpo a JSON
        json_data = ujson.dumps(data)
        
        # Enviar la solicitud POST a la API
        response = urequests.post(url, headers=headers, data=json_data)
        
        # Verificar si la solicitud fue exitosa
        if response.status_code == 200:
            # Extraer y devolver la respuesta del chatbot
            response_json = response.json()
            response.close()  # Cerrar la conexión
            print("**************************")
            print (response_json)
            print("**************************")
            return response_json['choices'][0]['message']['content']
        else:
            # Si la solicitud falla, devolver un mensaje de error
            error_message = f"Error: {response.status_code}, {response.text}"
            response.close()  # Cerrar la conexión
            return error_message
    def main():
        print("Bienvenido ESP_Bot_AI. Inteligencia Artificial en Microcontroladores.")
    
        while True:
            dato= pot.read()
            temperatura = int((dato * 100)/4096)
            
            
            user_input ='''Eres el cerebro de un microcontrolador que controla temperatura en una
                         planta que mide la temperatura de 0 a 100 grados centigrados;
                         si el siguente valor ''' + str(temperatura) + ''' es superior a 40 indicar mediante 
                         una respuesta muy corta realizarla  evacuacion que obligatoriamente contenga la palabra alarma en minuscula dentro del
                         texto y el valor de temperatura obtenido en grados centigrado;si el valor es inferior a 39
                         dar un mensaje de tranquilidad e indicar medidas de cuidado ante emergencias en
                         frases muy cortas donde no se incluya la palabra alarma'''
                          
            if user_input.lower() == 'salir':
                print("ESP_Bot_AI: ¡Hasta luego!")
                break
            
            # Obtener la respuesta del chatbot
            response = chat_with_openrouter(user_input, model="openai/gpt-3.5-turbo")
            
            if "alarma" in response:
                led.on()
            else:
                led.off()
            # Mostrar la respuesta del chatbot
            print(f"ESP_Bot_AI: {response}")
            sleep(1)
    if __name__ == "__main__":
        main()
    
else:
       print ("Imposible conectar")
       miRed.active (False)