import appdaemon.plugins.hass.hassapi as hass
import appdaemon

#
# Presence app
#
# Args:
#

class GentleWake(hass.Hass):

    def initialize(self):
        self.listen_event(self.wake_event, "GENTLE_WAKE")

    def wake_event(self, event_name, data, kwargs):
        entity_id = data.get('entity_id')
        states = self.get_state(entity_id, 'all')
        current_level = states.get('attributes').get('brightness') or 0
        current_level_pct = current_level / 2.55 or 0  # start_level_pct is optional
        start_level_pct = int(data.get('start_level_pct', current_level_pct))
        end_level_pct = int(data.get('end_level_pct'))
        transition = data.get('transition')

        ## CALCULATE PARAMETERS FOR LOOP, BASED ON TRANSITION TIME FOR FADE
        transition_secs = (int(transition[:2]) * 3600 + int(transition[3:5]) * 60
                           + int(transition[-2:]))  # convert string to total secs'
        step_pct = 1
        sleep_delay = abs(transition_secs / (end_level_pct - start_level_pct))

        # If fading out the step_pct will be negative (decrement each iteration)

        if end_level_pct < start_level_pct: step_pct = step_pct * -1

        ## DOES THE WORK ...

        # Since we check for equality of new_level_pct and current_level_pct
        # in each loop -  and break if !=, we must initialize new_level_pct
        # to equal start_level_pct, and then set actual light brightness_pct
        # (a.k.a. current_level_pct) to equal start_level_pct.

        new_level_pct = start_level_pct
        self.turn_on(entity_id, brightness_pct=round(start_level_pct))
        # without delay,'hass.states.get' would not get the new value
        self.run_in(self.run_dimmer, 1, s_delay=sleep_delay, new_level_pctn=new_level_pct,
                    end_level_pctn=end_level_pct, entity_id=entity_id, step_pct=step_pct)

    def run_dimmer(self, kwargs):
        delay = kwargs["s_delay"]
        new_level_pctn = kwargs["new_level_pctn"]
        end_level_pctn = kwargs["end_level_pctn"]
        entity_id = kwargs["entity_id"]
        step_pct = kwargs["step_pct"]
        if round(new_level_pctn) != end_level_pctn:
            states = self.get_state(entity_id, 'all')
            current_leveld = states.get('attributes').get('brightness') or 0
            current_level_pctn = current_leveld / 2.55 or 0
            if False: #(round(current_level_pctn) != round(new_level_pctn)):
                self.log('Exiting Fade In')  ## this indicates manual
                ## intervention, so exit
            else:
                new_level_pctn = new_level_pctn + step_pct
                self.log('Setting brightness of ' + str(entity_id) + ' from '
                            + str(current_level_pctn) + ' to ' + str(new_level_pctn))
                self.turn_on(entity_id, brightness_pct=round(new_level_pctn))
                self.run_in(self.run_dimmer, delay, s_delay=delay, new_level_pctn=new_level_pctn, end_level_pctn=end_level_pctn, entity_id=entity_id, step_pct=step_pct)
