import network
import machine
import time
import dht
import urequests as requests
import LDR
import i2c_lcd

ldr_pin: int = 32
dht_pin: int = 33
led_temperature_red_pin = 22
led_temperature_blue_pin = 21
led_humidity_pin = 23
led_illumination_pin = 19

temperature_upper_limit = 38
temperature_lower_limit = 28
humidity_upper_limit = 60
humidity_lower_limit = 40
illumination_lower_limit = 400 # in lux

wifi_ssid = 'Wokwi-GUEST'
wifi_password = ''
thingspeak_api_key = 'F2HE1FDVQOMEZU50'

# Display
I2C_ADDR = 0x27
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16
FREQ = 800000

class SensorsData:
    def __init__(
        self,
        humidity: float = 0.0,
        temperature: float = 0.0,
        illumination: float = 0.0,
    ):
        self.humidity = humidity
        self.temperature = temperature
        self.illumination = illumination

def connect_to_wifi(ssid: str, password: str) -> network.WLAN:
    print("Connecting to WiFi", end="")

    wlan_sta = network.WLAN(network.STA_IF)
    
    if not wlan_sta.isconnected():
        wlan_sta.active(True)
        wlan_sta.connect(wifi_ssid, wifi_password)

        while not wlan_sta.isconnected():
            print(".", end="")
            time.sleep(0.1)

    print(" Connected!")

    return wlan_sta

def collect_data_from_sensors(dht_sensor: dht.DHT22, ldr_sensor: LDR.LDR) -> SensorsData:
    dht_sensor.measure()
        
    return SensorsData(
        temperature=dht_sensor.temperature(),
        humidity=dht_sensor.humidity(),
        illumination=ldr_sensor.value(),
    )

def send_data_to_thingspeak(data: SensorsData) -> None:
    url = 'http://api.thingspeak.com/update?api_key={}&field1={}&field2={}&field3={}'.format(
        thingspeak_api_key,
        data.temperature,
        data.humidity,
        data.illumination,
    )

    requests.request('GET', url)

def main() -> None:
    wlan_sta: network.WLAN = connect_to_wifi(wifi_ssid, wifi_password)
    dht_sensor: dht.DHT22 = dht.DHT22(machine.Pin(dht_pin))
    ldr_sensor: LDR.LDR = LDR.LDR(machine.Pin(ldr_pin))

    # led_temperature_red = machine.Pin(led_temperature_red_pin, machine.Pin.OUT)
    # led_temperature_blue = machine.Pin(led_temperature_blue_pin, machine.Pin.OUT)

    # led_humidity = machine.Pin(led_humidity_pin, machine.Pin.OUT)
    # led_illumination = machine.Pin(led_illumination_pin, machine.Pin.OUT)


    while True:
        sensors_data = collect_data_from_sensors(dht_sensor, ldr_sensor)

        print(sensors_data.temperature)

        if wlan_sta.isconnected():
            #send_data_to_thingspeak(sensors_data)
            pass

        # if sensors_data.temperature >= temperature_upper_limit:
        #     led_temperature_red.value(1)
        #     led_temperature_blue.value(0)
        # elif sensors_data.temperature <= temperature_lower_limit:
        #     led_temperature_red.value(0)
        #     led_temperature_blue.value(1)
        # else:
        #     led_temperature_red.value(0)
        #     led_temperature_blue.value(0)

        
        # if sensors_data.humidity < humidity_lower_limit:
        #     led_humidity.value(1)
        # else:
        #     led_humidity.value(0)

        # if sensors_data.illumination < 400:
        #     led_illumination.value(1)
        # else:
        #     led_illumination.value(0)

        time.sleep(0.5)


if __name__ == '__main__':
    main()