from datetime import datetime
from grove.adc import ADC
from grove.button import Button
from grove.display.jhd1802 import JHD1802
from grove.grove_ryb_led_button import GroveLedButton
from math import ceil
from time import sleep, time

sensor_poort = 0
drempelwaarde = 500
interval = 15
uitschakeltijd = 10
wachttijd = 60

class GroveLightSensor:
    def __init__(self, channel):
        self.channel = channel
        self.adc = ADC()

    @property
    def light(self):
        return self.adc.read(self.channel)

def on_event(index, event, tm):
    global knop_kort
    global knop_lang
    if event & Button.EV_SINGLE_CLICK:
        knop_kort = True
    elif event & Button.EV_LONG_PRESS:
        knop_lang = True

def wis_scherm(tekst):
    lcd.clear()
    lcd.setCursor(0, 0)
    lcd.write(tekst)

# maak objecten aan voor elke component
lichtsensor = GroveLightSensor(sensor_poort)
lcd = JHD1802()
knop = GroveLedButton(5)
knop.on_event = on_event

# controleer elke 15 seconden de sensorwaarde
while True:
    # maak het scherm leeg en schakel het lampje uit
    knop.led.light(False)
    wis_scherm('Alarm aan')
    # sensorwaarde te hoog, start alarmprocedure
    if lichtsensor.light > drempelwaarde:
        knop.led.blink(True)
        knop_kort = False
        eindtijd = time() + uitschakeltijd
        wis_scherm('Alarm gaat af in:')
        while time() < eindtijd:
            timer = str((ceil(eindtijd - time())))
            lcd.setCursor(1, 0)
            lcd.write('{} seconden '.format(timer))
            # annuleer alarm indien knop kort ingedrukt wordt
            if knop_kort:
                knop.led.light(False)
                wis_scherm('Alarm {}s uit'.format(wachttijd))
                sleep(wachttijd)
                wis_scherm('Alarm aan')
                break
            else:
                sleep(1)
        # knop niet ingedrukt, alarm gaat af
        else:
            knop.led.light(True)
            tijdstip = datetime.today()
            wis_scherm(tijdstip.strftime("%d/%m/%Y"))
            lcd.setCursor(1, 0)
            lcd.write(tijdstip.strftime("%H:%M:%S"))
            knop_lang = False
            while True:
                # reset alarm indien knop lang ingedrukt wordt
                if knop_lang:
                    knop.led.light(False)
                    wis_scherm('Alarm {}s uit'.format(wachttijd * 5))
                    sleep(wachttijd * 5)
                    wis_scherm('Alarm aan')
                    break
                else:
                    sleep(1)
    # sensorwaarde ok, wacht op de volgende controle
    sleep(interval)