from hw.sensor.bmp180 import BMP180
from machine import I2C, Pin

from lib.Unit import TemperatureUnit, PressureUnit, AltitudeUnit
from lib.toolkit import log, convert_C_to_F


class BMPType:
    BMP180 = 0
    BMP280 = 1

    def __init__(self):
        pass

class BMP:
    type = ""
    sensor = ""


    # @timed_function
    def __init__(self, type, scl, sda):
        self.type = type

        if self.type == 0:
            i2c_bus = I2C(scl=Pin(scl), sda=Pin(sda), freq=100000)
            self.sensor = BMP180.BMP180(i2c_bus)
            self.sensor.oversample_sett = 2
            self.sensor.baseline = 101325

        elif self.type == 1:
             pass #TODO

        else:
            log.error("Unknown sensor type '{}'. Cannot instantiate it.".format(self.type))

    # @timed_function
    def get_temperature(self, unit=TemperatureUnit.CELSIUS, show_unit=False):
        result = self.sensor.temperature if unit == TemperatureUnit.CELSIUS else convert_C_to_F("%.1f" % self.sensor.temperature)
        if show_unit :
            result = str(result) + TemperatureUnit.get_unit_initial(TemperatureUnit(), unit)
        return result

    # @timed_function
    def get_pressure(self, unit=PressureUnit.HECTOPASCAL, show_unit=False):
        result = ("%.2f" % (self.sensor.pressure / 100))
        if show_unit:
            result = str(result) + PressureUnit.get_unit_initial(PressureUnit(), unit)
        return result

    # @timed_function
    def get_altitude(self, unit=AltitudeUnit.METERS, show_unit=False):
        result = ("%.2f" % self.sensor.pressure)
        if show_unit:
            result = str(result) + AltitudeUnit.get_unit_initial(AltitudeUnit(), unit)
        return result