use std::fmt;

#[derive(Debug)]
pub struct ParseDurationError(String);

impl fmt::Display for ParseDurationError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "Invalid duration: {}", self.0)
    }
}

/// Parse a duration string like "10s", "500ms", "1m" into milliseconds.
pub fn parse_duration(s: &str) -> Result<u64, ParseDurationError> {
    let (num, unit) = if let Some(rest) = s.strip_suffix("ms") {
        (rest, "ms")
    } else if let Some(rest) = s.strip_suffix('s') {
        (rest, "s")
    } else if let Some(rest) = s.strip_suffix('m') {
        (rest, "m")
    } else {
        return Err(ParseDurationError(s.to_string()));
    };

    let value: f64 = num.parse().map_err(|_| ParseDurationError(s.to_string()))?;

    let ms = match unit {
        "ms" => value,
        "s" => value * 1000.0,
        "m" => value * 60_000.0,
        _ => unreachable!(),
    };

    Ok(ms as u64)
}
