use crate::result::TockResult;
use crate::syscalls::command;
use core::marker::PhantomData;

const DRIVER_NUMBER: usize = 0x00002;

mod command_nr {
    pub const COUNT: usize = 0;
    pub const ON: usize = 1;
    pub const OFF: usize = 2;
    pub const TOGGLE: usize = 3;
}

#[non_exhaustive]
pub struct LedsDriverFactory;

impl LedsDriverFactory {
    pub fn init_driver(&mut self) -> TockResult<LedsDriver> {
        let driver = LedsDriver {
            num_leds: command(DRIVER_NUMBER, command_nr::COUNT, 0, 0)?,
            lifetime: PhantomData,
        };
        Ok(driver)
    }
}

pub struct LedsDriver<'a> {
    num_leds: usize,
    lifetime: PhantomData<&'a ()>,
}

impl<'a> LedsDriver<'a> {
    pub fn num_leds(&self) -> usize {
        self.num_leds
    }

    pub fn leds(&self) -> Leds {
        Leds {
            num_leds: self.num_leds,
            curr_led: 0,
            lifetime: PhantomData,
        }
    }

    pub fn get(&self, led_num: usize) -> Option<Led> {
        if led_num < self.num_leds {
            Some(Led {
                led_num,
                lifetime: PhantomData,
            })
        } else {
            None
        }
    }
}

pub struct Leds<'a> {
    num_leds: usize,
    curr_led: usize,
    lifetime: PhantomData<&'a ()>,
}

impl<'a> Iterator for Leds<'a> {
    type Item = Led<'a>;

    fn next(&mut self) -> Option<Self::Item> {
        if self.curr_led < self.num_leds {
            let item = Led {
                led_num: self.curr_led,
                lifetime: PhantomData,
            };
            self.curr_led += 1;
            Some(item)
        } else {
            None
        }
    }
}

pub struct Led<'a> {
    led_num: usize,
    lifetime: PhantomData<&'a ()>,
}

impl<'a> Led<'a> {
    pub fn led_num(&self) -> usize {
        self.led_num
    }

    pub fn set(&self, state: impl Into<LedState>) -> TockResult<()> {
        match state.into() {
            LedState::On => self.on(),
            LedState::Off => self.off(),
        }
    }

    pub fn on(&self) -> TockResult<()> {
        command(DRIVER_NUMBER, command_nr::ON, self.led_num, 0)?;
        Ok(())
    }

    pub fn off(&self) -> TockResult<()> {
        command(DRIVER_NUMBER, command_nr::OFF, self.led_num, 0)?;
        Ok(())
    }

    pub fn toggle(&self) -> TockResult<()> {
        command(DRIVER_NUMBER, command_nr::TOGGLE, self.led_num, 0)?;
        Ok(())
    }
}

#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum LedState {
    On,
    Off,
}

impl From<bool> for LedState {
    fn from(from_value: bool) -> Self {
        if from_value {
            LedState::On
        } else {
            LedState::Off
        }
    }
}
