import sys_max30001
import interrupt
import ucollections


class MAX30001:
    def __init__(
        self,
        usb=False,
        bias=True,
        sample_rate=128,
        callback=None,
        sample_buffer_len=256,
    ):
        self.sample_rate = sample_rate
        self.callback = callback
        self.sample_buffer_len = sample_buffer_len
        self.interrupt_id = interrupt.MAX30001_ECG
        self.usb = usb
        self.bias = bias
        self._callback = callback
        self.enable_sensor()

    def enable_sensor(self):
        interrupt.disable_callback(self.interrupt_id)
        interrupt.set_callback(self.interrupt_id, self._interrupt)
        self.stream_id = sys_max30001.enable_sensor(
            self.usb, self.bias, self.sample_rate, self.sample_buffer_len
        )

        if self.stream_id < 0:
            raise ValueError("Enable sensor returned %i", self.stream_id)

        self.active = True

        if self._callback:
            interrupt.enable_callback(self.interrupt_id)

    def __enter__(self):
        return self

    def __exit__(self, _et, _ev, _t):
        self.close()

    def close(self):
        if self.active:
            self.active = False
            ret = sys_max30001.disable_sensor(self.sensor_id)

            if ret < 0:
                raise ValueError("Disable sensor returned %i", ret)

            interrupt.disable_callback(self.interrupt_id)
            interrupt.set_callback(self.interrupt_id, None)

    def read(self):
        if self.active:
            return sys_max30001.read_sensor(self.stream_id)
        return []

    def _interrupt(self, _):
        if self.active:
            data = self.read()
            if self._callback:
                self._callback(data)