##
#  A quick test
#   Unit one is a 128x64 matrix running on a matrix portal m3
#   Unit two is a 64x32 matrix running on a matrix portal m4
#
#   Both units are running circuit python 9.0 RC0

##

import time
import board
import busio
import displayio

# import terminalio
import json

# import mqtt_service
import time
import adafruit_esp32spi.adafruit_esp32spi_socket as socket
import adafruit_minimqtt.adafruit_minimqtt as MQTT
import adafruit_scd30
from adafruit_pm25.i2c import PM25_I2C

# import rgbmatrix
# import framebufferio

# from adafruit_display_text.label import Label
from adafruit_matrixportal.matrixportal import MatrixPortal
from adafruit_bitmap_font import bitmap_font

reset_pin = None
display_width = 128
display_height = 64
display_bit_depth = 4

# Create library object, use 'slow' 10KHz frequency! This was key to making it work
i2c = busio.I2C(board.SCL, board.SDA, frequency=10000)
#i2c = busio.I2C(board.SCL, board.SDA)

# Connect to the PM25 sensor over I2C
pm25 = PM25_I2C(i2c, reset_pin)

# Connect to the SCD-30 sensor over I2C
scd = adafruit_scd30.SCD30(i2c)

# optional info if you know it
# scd30.ambient_pressure = 1013.25
# Remember, altitude is in meters KORD = 207.3m
#scd.altitude = 207

FONT = "fonts/IBMPlexMono-Medium-24_jep.bdf"
small_font_Arial = "fonts/Arial-12.bdf"
med_font_Arial = "fonts/Arial-16.bdf"
med_font = "fonts/helvR10.bdf"
small_font = "fonts/6x10.bdf"
very_small_font = "fonts/4x6.bdf"
med_font_Sans = "fonts/OpenSans-9.bdf"
tiny_font = "fonts/tom-thumb.bdf"

# make it work before making it pretty.

# --- Content Setup ---
my_font = bitmap_font.load_font(tiny_font)
last_data = {}

# --- Display setup ---

# ok most likely you will not need this unless you have multiple
# panels, but here is the reminder just in case. This code started life on a Raspberry Pi


matrixportal = MatrixPortal(
    status_neopixel=board.NEOPIXEL,
    debug=True,
    bit_depth=display_bit_depth,
    width=display_width,
    height=display_height,
    color_order='RBG'
)
display = matrixportal.display
network = matrixportal.network
# network.connect()

group = displayio.Group()  # Create a Group
bitmap = displayio.Bitmap(display_width, display_height, display_bit_depth)  # Create a bitmap object,width, height, bit depth
color = displayio.Palette(14)  # Create a color palette

# Standard Colors
color[0] = 0x000000  # black background
color[1] = 0xFF0000  # red
color[2] = 0x00FF00  # green
color[3] = 0x0000FF  # blue
color[4] = 0x404040  # gray
color[5] = 0xFFFF00  # yellow
color[6] = 0x000080  # navy
color[7] = 0xFF00FF  # fuchsia
color[8] = 0x800080  # purple
color[9] = 0x008080  # teal
color[10] = 0x800000  # maroon
color[11] = 0x808000  # olive
color[12] = 0x00FFFF  # aqua
color[13] = 0xFFFFFF  # white

# lets define the range cutoffs
CO2_CUTOFFS = (1000, 2000, 4000) #5000?
color_names = ('black','red','green','blue','gray','yellow','navy','fuchsia','purple','teal','maroon','olive','aqua','white')

# Lets set up some labels

# Label 0 - CO2
matrixportal.add_text(
    #text_font=very_small_font,
    text_font=tiny_font ,
    text_position=(25, 3),
    text_color=color[9],
)

# Label 1 -  blank
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(2, 10),
    text_color=color[8],
    # scrolling=True,
)

# Label 2 - Temperature
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(2, 16),
    text_color=color[13],
)

# Label 3 - Humidity
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(2, 22),
    text_color=color[7],
)

# Label 4 - Blank
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(2, 28),
    text_color=color[5],
)


# Label 5 - Lable
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(2, 34),
    text_color=color[4],
)

# Label 6 - PTCL sizes
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(2, 40),
    text_color=color[13],
)

# Label 7 - Blank
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(2, 46),
    text_color=color[8],
)

# Label 8 - PTCL sizes > 0.3
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(2, 52),
    text_color=color[1],
)

# Label 9 - Time
matrixportal.add_text(
    text_font=tiny_font,
    text_position=(25, 58),
    text_color=color[13],
)

matrixportal.set_text("Connecting to IOT-HOME", 0)
#matrixportal.set_text(network.ip_address, 1) #only seem to work on the M4 portal

#   lets grab the local time while we are here
net_time = network.get_local_time()
print(net_time)
#matrixportal.set_text(network.ip_address, 2)
# print(rtime.rtime)

current_time = time.time()
print("Seconds since Jan 1, 1970: {} seconds".format(current_time))


def convert_fahrenheit_to_celsius(fahrenheit):
    celsius = float(fahrenheit - 32) * (5 / 9)
    return celsius

def convert_celsius_to_fahrenheit(celsius):
    fahrenheit = float(celsius) * 9 / 5 + 32
    return fahrenheit

def testthedisplay():
    # A quick check of display

    matrixportal.set_text("Printer 9 0x008080  # teal", 0)
    matrixportal.set_text("line 1  8 0x800080  # purple", 1)
    matrixportal.set_text("line 2  7 0xFF00FF  # fuchsia", 2)
    matrixportal.set_text("line 3  6 0x000080  # navy", 3)
    matrixportal.set_text("line 4  5 0xFFFF00  # yellow", 4)
    matrixportal.set_text("line 5  4 0x404040  # gray", 5)
    matrixportal.set_text("line 6  3 0x0000FF  # blue", 6)
    matrixportal.set_text("line 7  2 0x008000  # green", 7)
    matrixportal.set_text("line 8  1 0xFF0000  # red", 8)
    matrixportal.set_text("line 9  0 0xFFFFFF  # white", 9)

    time.sleep(5)

    matrixportal.set_text("Black", 0)

    matrixportal.set_text_color(color[13], 0)
    matrixportal.set_text_color(color[0], 1)
    matrixportal.set_text_color(color[0], 2)
    matrixportal.set_text_color(color[0], 3)
    matrixportal.set_text_color(color[0], 4)
    matrixportal.set_text_color(color[0], 5)
    matrixportal.set_text_color(color[0], 6)
    matrixportal.set_text_color(color[0], 7)
    matrixportal.set_text_color(color[0], 8)
    matrixportal.set_text_color(color[0], 9)

    time.sleep(5)

    matrixportal.set_text("maroon", 0)

    matrixportal.set_text_color(color[10], 0)
    matrixportal.set_text_color(color[10], 1)
    matrixportal.set_text_color(color[10], 2)
    matrixportal.set_text_color(color[10], 3)
    matrixportal.set_text_color(color[10], 4)
    matrixportal.set_text_color(color[10], 5)
    matrixportal.set_text_color(color[10], 6)
    matrixportal.set_text_color(color[10], 7)
    matrixportal.set_text_color(color[10], 8)
    matrixportal.set_text_color(color[10], 9)


    matrixportal.set_text("Printer 1 I should have changed", 0)
    matrixportal.set_text("abcdefghijklmnopqrstuvwxyz 0123456789", 1)
    matrixportal.set_text("ABCEDEFGHIJKLMNOPQRSTUVWXYZ 0123456789", 2)
    matrixportal.set_text("The quick brown fox jumped over the lazy dog.", 3)
    matrixportal.set_text("*-+,.?<>{}[]", 4)
    matrixportal.set_text("line 5", 5)
    matrixportal.set_text("line 6", 6)
    matrixportal.set_text("line 7", 7)
    matrixportal.set_text("line 8", 8)
    matrixportal.set_text("line 9 Me too", 9)

    time.sleep(5)

    matrixportal.set_text_color(color[5], 0)
    matrixportal.set_text_color(color[4], 1)
    matrixportal.set_text_color(color[5], 2)
    matrixportal.set_text_color(color[4], 3)
    matrixportal.set_text_color(color[5], 4)
    matrixportal.set_text_color(color[4], 5)
    matrixportal.set_text_color(color[5], 6)
    matrixportal.set_text_color(color[4], 7)
    matrixportal.set_text_color(color[5], 8)
    matrixportal.set_text_color(color[13], 9)

    time.sleep(5)

    matrixportal.set_text_color(color[13], 0)
    matrixportal.set_text_color(color[13], 1)
    matrixportal.set_text_color(color[13], 2)
    matrixportal.set_text_color(color[13], 3)
    matrixportal.set_text_color(color[13], 4)
    matrixportal.set_text_color(color[13], 5)
    matrixportal.set_text_color(color[13], 6)
    matrixportal.set_text_color(color[13], 7)
    matrixportal.set_text_color(color[13], 8)
    matrixportal.set_text_color(color[13], 9)

    matrixportal.set_text("", 0)
    matrixportal.set_text("", 1)
    matrixportal.set_text("", 2)
    matrixportal.set_text("", 3)
    matrixportal.set_text("", 4)
    matrixportal.set_text("", 5)
    matrixportal.set_text("", 6)
    matrixportal.set_text("", 7)
    matrixportal.set_text("", 8)
    matrixportal.set_text("", 9)

    return

def update_display_CO2(value):

    value = abs(round(value))

    # smiley and label
    if value < CO2_CUTOFFS[0]:
        matrixportal.set_text_color(color[1], 0)
    elif value < CO2_CUTOFFS[1]:
        matrixportal.set_text_color(color[2], 0)
    elif value < CO2_CUTOFFS[2]:
        matrixportal.set_text_color(color[3], 0)
    else:
        matrixportal.set_text_color(color[4], 0)

# display test goes here
# testthedisplay()

# --- MQTT setup ---
# This is a leftover from the Octoprint intigration
# queue = mqtt_service.subscribe(socket, network)
# queue.on_message = message_received

# --- main loop ---
while True:
    now = time.localtime()

    try:
        aqdata = pm25.read()
        # print(aqdata)
    except RuntimeError:
        print("Unable to read from sensor, retrying...")
        continue

    print()
    print("Concentration Units (standard)")
    print("---------------------------------------")
    print(
        "PM 1.0: %d\tPM2.5: %d\tPM10: %d"
        % (aqdata["pm10 standard"], aqdata["pm25 standard"], aqdata["pm100 standard"])
    )
    print("Concentration Units (environmental)")
    print("---------------------------------------")
    print(
        "PM 1.0: %d\tPM2.5: %d\tPM10: %d"
        % (aqdata["pm10 env"], aqdata["pm25 env"], aqdata["pm100 env"])
    )
    print("---------------------------------------")
    print("Particles > 0.3um / 0.1L air:", aqdata["particles 03um"])
    print("Particles > 0.5um / 0.1L air:", aqdata["particles 05um"])
    print("Particles > 1.0um / 0.1L air:", aqdata["particles 10um"])
    print("Particles > 2.5um / 0.1L air:", aqdata["particles 25um"])
    print("Particles > 5.0um / 0.1L air:", aqdata["particles 50um"])
    print("Particles > 10 um / 0.1L air:", aqdata["particles 100um"])
    print("---------------------------------------")

    if scd.data_available:
        print("Data Available!")
        update_display_CO2(scd.CO2)
        print("CO2: %d PPM" % scd.CO2)
        print("Temperature: %0.2f degrees C" % scd.temperature)
        print("Humidity: %0.2f %% rH" % scd.relative_humidity)
        print("")
        print("Waiting for new data...")
        print("")

        matrixportal.set_text("  CO2: %d PPM" % scd.CO2, 0)
        matrixportal.set_text("Temperature: %0.2f degrees C" % scd.temperature, 2)
        matrixportal.set_text("Humidity: %0.2f %% rH" % scd.relative_humidity, 3)
        matrixportal.set_text("PTCL > 0.3um / 0.1L air: %d" % (aqdata["particles 03um"]), 8) #was 3
    else:
        print("CO2 Data NOT Available!")
        matrixportal.set_text("No new CO2 Data", 0)

    matrixportal.set_text("0.3um 0.5um 1.0um 2.5um 5.0um 10.0um ", 5)
    matrixportal.set_text(
        "%5d %5d %5d %5d %5d %5d"
        % (
            aqdata["particles 03um"],
            aqdata["particles 05um"],
            aqdata["particles 10um"],
            aqdata["particles 25um"],
            aqdata["particles 50um"],
            aqdata["particles 100um"],
        ),
        6,
    )
    matrixportal.set_text("The time is %d:%02d" % (now.tm_hour, now.tm_min), 9)

    time.sleep(5)
