import datetime
import time
from threading import Thread
import numpy as np

from . import hardware, helpers


class ClockFace:
    """Actual functions one might need for a clock"""

    def __init__(self):
        """"""
        # added by the launcher, we have self.modules (dict)

        self.IO = hardware.led.get_handler()
        self.shape = self.IO.shape # (16,32) for now
        # TODO handle differently!
        self.MOP = helpers.computations.MatrixOperations()
        
        self.kill_output = False

    def start(self):
        Thread(target = self.clock_loop).start()


    def clock_loop(self):
        while True: # TODO: allow this to be exited gracefully

            t_start = datetime.datetime.now()

            self.set_brightness()

            has_queue, data = self.modules["receive"].fetch_data()
            tnext = 1 if has_queue else 30

            if data == {}:
                matrices = self.MOP.get_fallback()
                matrices[0][0,0] = [255, 0, 0] # red dot on the top left
            else:
                matrices = [np.asarray(d).astype(int) for d in data["matrices"]]
                matrices[0][0,0] = [0, 255, 0] # green dot on the top left
            
            if not self.kill_output:
                self.IO.put(matrices)
            else:
                z = np.zeros((16,16,3))
                self.IO.put([z,z,z])
            

            t_end = datetime.datetime.now()
            delta_planned = datetime.timedelta(seconds = tnext)
            delta = delta_planned - (t_end - t_start)
            
            time.sleep(max(delta.total_seconds(), 0))


    def set_brightness(self):
        """Kill the brightness at night"""

        is_WE = datetime.datetime.now().weekday() > 4
        now = int(datetime.datetime.now().strftime("%H%M"))

        self.kill_output = (now < 1000 or now > 2200) if is_WE else (now < 830 or now > 2130)