# Este proyecto es la base para la actividad Practica del modulo 2

# Importar librerias
import urequests
import network
import time
import ujson

# Conexion al servicio Wi-Fi Virtual de Wokwi para tener acceso a Internet
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
  print(".", end="")
  time.sleep(0.1)
print(" Connected!")


# Clase que define como conectarse a la Base de Datos y como enviar datos.
class DbConnection():

  ENDPOINT_DATA = '/api/data/'
  ENDPOINT_AUTH = '/api/auth/login/'

  BASE_HEADER = {
    "Content-Type": "application/json"
  }

  def __init__(self, ip, usuario, contrasenia, proyecto):
    self.url = f'http://{ip}'
    self.usuario = usuario
    self.proyecto = proyecto

    response = urequests.post(
      f'{self.url}{self.ENDPOINT_AUTH}', 
      json={'username':usuario, "password":contrasenia},
      headers=self.BASE_HEADER
    )
    self.token = response.json().get('token')

  def enviar_valor(self, magnitud, valor, log=True):
    header = self.BASE_HEADER.copy()
    header.update({
      'Authorization': f'Token {self.token}'
    })

    data = {
      'username': self.usuario,
      'project': self.proyecto,
      'data_type': magnitud,
      'value': str(valor)
    }

    response = urequests.post(
      f'{self.url}{self.ENDPOINT_DATA}', 
      json=data,
      headers=header
    )
    if log:
      if response.status_code == 201:
        print('Dato subido correctamente!')
      else:
        print(f'ERROR: {response.status_code}')


# Magnitudes admitidas en la Base de Datos. Estas son todas, pero las que podran
# enviar dependen de como hayan configurado el proyecto.

class Magnitudes:
  TEMPERATURA = 'temperatura'   # valores flotantes
  HUMEDAD = 'humedad'           # valores flotantes
  LUMINOSIDAD = 'luminosidad'   # valores flotantes
  ACELERACION = 'aceleracion'   # valores flotantes
  GRAVEDAD = 'gravedad'         # valores flotantes
  DISTANCIA = 'distancia'       # valores flotantes
  TENSION = 'tension'           # valores flotantes
  PESO = 'peso'                 # valores flotantes
  ENCENDIDO = 'encendido'       # valores True/False

# Variables para la conexion con la Base de Datos 
# Completar con sus datos:
IP = '181.29.156.5'
USUARIO = 'iot1'
CONTRASENIA = 'iiot1234'
NOMBRE_PROYECTO = 'PRUEBA'

# Ejemplo de como enviar datos a un proyecto creado con la configuracion anterior
# pueden borrar estas lineas y escribir su propio codigo a partir de aqui
db = DbConnection(IP, USUARIO, CONTRASENIA, NOMBRE_PROYECTO)

import dht
import time
from machine import Pin

sensor = dht.DHT22(Pin(15))
sensor.measure()
db.enviar_valor(Magnitudes.TEMPERATURA, sensor.temperature())
db.enviar_valor(Magnitudes.HUMEDAD, sensor.humidity())