import time

import adafruit_CCS811
import board
import busio
import neopixel

# i2c interface for the gas sensor
i2c_bus = busio.I2C(board.SCL, board.SDA)
ccs = adafruit_CCS811.CCS811(i2c_bus)

# Three Different NeoPixel 8 LED Lengths for Output:
# 1 - Temperature - Circuit Playground Built-In LEDs
# 2 - Total Volatile Organic Compounds [strip]
# 3 - Co2 Output - NeoPixel [strip]
num_leds = 8
temperature_pix = neopixel.NeoPixel(board.NEOPIXEL, num_leds, brightness=.1)
tvoc_pix = neopixel.NeoPixel(board.A1, num_leds, bpp=4, brightness=.1)
co2_pix = neopixel.NeoPixel(board.A2, num_leds, bpp=4, brightness=.1)
led_draw = .05  # delay for LED pixel turn on/off

# wait for the sensor to be ready and calibrate the thermistor
while not ccs.data_ready:
    pass
temp = ccs.temperature
ccs.temp_offset = temp - 25.0


def clear_pix(delay):
    # clear all LEDs for breathing effect
    for i in range(0, num_leds):
        temperature_pix[i] = (0, 0, 0)
        co2_pix[i] = (0, 0, 0, 0)
        tvoc_pix[i] = (0, 0, 0, 0)
        time.sleep(delay)


def co2_led_meter():
    # Show Carbon Dioxide on a NeoPixel Strip
    co2_floor = 400
    co2_ceiling = 8192

    # Map CO2 range to 8 LED NeoPixel Stick
    co2_range = co2_ceiling - co2_floor
    co2_led_steps = co2_range / num_leds
    co2_leds = int((ccs.eCO2 - co2_floor) / co2_led_steps)

    # Insert Colors
    for i in range(0, (co2_leds - 1)):
        co2_pix[i] = (255, 0, 255, 0)
        time.sleep(led_draw)


def tvoc_led_meter():
    # Show Total Volatile Organic Compounds on a NeoPixel Strip
    tvoc_floor = 0
    tvoc_ceiling = 1187

    # Map CO2 range to 8 LED NeoPixel Stick
    tvoc_range = tvoc_ceiling - tvoc_floor
    tvoc_led_steps = tvoc_range / num_leds
    tvoc_leds = int(ccs.TVOC / tvoc_led_steps)

    # Insert Colors
    for i in range(0, (tvoc_leds - 1)):
        tvoc_pix[i] = (0, 0, 255, 0)
        time.sleep(led_draw)


def temp_led_meter():
    # Show Temperature on Circuit Playground built-in NeoPixels
    temp_floor = 23
    temp_ceiling = 36

    # Map temperature range to 8 LEDs on Circuit Playground
    temp_range = temp_ceiling - temp_floor
    temp_led_steps = temp_range / num_leds
    temp_leds = int((ccs.temperature - temp_floor) / temp_led_steps)

    # Insert Colors
    for i in range(0, (temp_leds - 1)):
        temperature_pix[i] = (255, 255, 0)
        time.sleep(led_draw)


while True:
    # print to console
    # - co2
    # - total voltatile organic compounds
    # - temperature in celsius
    print("CO2: ", ccs.eCO2, " TVOC:", ccs.TVOC, " temp:", ccs.temperature)

    co2_led_meter()
    tvoc_led_meter()
    temp_led_meter()

    time.sleep(.5)
    clear_pix(led_draw)
