import time

from . import logger, background_task
try:
    import adafruit_dht
except ImportError:
    logger.warning("Could not import adafruit_dht. DEBUG set to True")
    DEBUG = True
else:
    from . import DEBUG

class dht_22(background_task):
    RUN_SLEEP_TIME = 2.0
    MIN_REFRESH_RATE = RUN_SLEEP_TIME
    KEY_TEMPERATURE = 'temperature'
    KEY_HUMIDITY = 'humidity'
    KEY_TIME = 'time'

    def __init__(self, gpio, data_callback=None):
        self.__data_callback__ = data_callback
        # Initial the dht device, with data pin connected to:
        if not DEBUG:
            self.__dht_device__ = adafruit_dht.DHT22(gpio, use_pulseio=False)
        # Initialise background_task
        background_task.__init__(self)

    def __run__(self):
        data = self.__dht_data_transmission__()
        if data is not None:
            logger.debug('DHT-Communication: Successfully: %s', repr(data))
            if self.__data_callback__ is not None:
                self.__data_callback__(**data)

    def __dht_data_transmission__(self):
        if not DEBUG:
            while self.__active__:
                try:
                    # Store the values
                    data = {}
                    data[self.KEY_TEMPERATURE] = self.__dht_device__.temperature
                    data[self.KEY_HUMIDITY] = self.__dht_device__.humidity
                    data[self.KEY_TIME] = int(time.time())
                    if data[self.KEY_TEMPERATURE] is not None and data[self.KEY_HUMIDITY] is not None:
                        return data
                    time.sleep(2.0)
                except RuntimeError as error:
                    # Errors happen fairly often, DHT's are hard to read, just keep going
                    logger.info('DHT-Communication: ' + error.args[0])
                    time.sleep(0.1)
                except Exception as error:
                    self.__dht_device__.exit()
                    raise error
        else:
            return {
                self.KEY_TEMPERATURE: -17.17,
                self.KEY_HUMIDITY: 1.7,
                self.KEY_TIME: int(time.time()),
            }
