use core::time::Duration;
pub const DEFAULT_DEBOUNCE: Duration = Duration::from_micros(900);
pub const DEFAULT_RELEASE: Duration = Duration::from_millis(150);
pub const DEFAULT_HOLD: Duration = Duration::from_millis(500);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ButtonConfig<D = Duration> {
    pub debounce: D,
    pub release: D,
    pub hold: D,
    pub mode: Mode,
}
impl<D> ButtonConfig<D> {
    pub fn new(debounce: D, release: D, hold: D, mode: Mode) -> Self {
        Self {
            debounce,
            release,
            hold,
            mode,
        }
    }
}
impl Default for ButtonConfig<Duration> {
    fn default() -> Self {
        Self {
            debounce: DEFAULT_DEBOUNCE,
            release: DEFAULT_RELEASE,
            hold: DEFAULT_HOLD,
            mode: Mode::default(),
        }
    }
}
#[cfg(feature = "embassy")]
impl Default for ButtonConfig<embassy_time::Duration> {
    fn default() -> Self {
        use embassy_time::Duration;
        Self {
            debounce: Duration::from_micros(DEFAULT_DEBOUNCE.as_micros() as u64),
            release: Duration::from_millis(DEFAULT_RELEASE.as_millis() as u64),
            hold: Duration::from_millis(DEFAULT_HOLD.as_millis() as u64),
            mode: Mode::default(),
        }
    }
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Mode {
    #[default]
    PullUp,
    PullDown,
}
impl Mode {
    pub const fn is_pullup(&self) -> bool {
        matches!(self, Mode::PullUp)
    }
    pub const fn is_pulldown(&self) -> bool {
        !self.is_pullup()
    }
}