use rppal::gpio::{Gpio, OutputPin};

use crate::drivers::RelayDriver;
use crate::errors::EmgauwaError;

pub struct GpioDriver {
	pub gpio: OutputPin,
	pub inverted: bool,
}

impl GpioDriver {
	pub fn new(pin: u8, inverted: bool) -> Result<Self, EmgauwaError> {
		let gpio = Gpio::new()?.get(pin)?.into_output();
		Ok(Self { gpio, inverted })
	}
}

impl RelayDriver for GpioDriver {
	fn set(&mut self, value: bool) -> Result<(), EmgauwaError> {
		if self.get_high(value) {
			self.gpio.set_high();
		} else {
			self.gpio.set_low();
		}
		Ok(())
	}

	fn get_pin(&self) -> u8 {
		self.gpio.pin()
	}

	fn get_inverted(&self) -> bool {
		self.inverted
	}
}