use crate::backend::c;
use crate::fd::BorrowedFd;

/// `CLOCK_*` constants for use with [`clock_gettime`].
///
/// These constants are always supported at runtime, so `clock_gettime` never
/// has to fail with `INVAL` due to an unsupported clock. See
/// [`DynamicClockId`] for a greater set of clocks, with the caveat that not
/// all of them are always supported.
///
/// [`clock_gettime`]: crate::time::clock_gettime
#[cfg(not(any(apple, target_os = "wasi")))]
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[cfg_attr(not(any(target_os = "aix", target_os = "dragonfly")), repr(i32))]
#[cfg_attr(target_os = "dragonfly", repr(u64))]
#[cfg_attr(target_os = "aix", repr(i64))]
#[non_exhaustive]
pub enum ClockId {
    /// `CLOCK_REALTIME`
    #[doc(alias = "CLOCK_REALTIME")]
    Realtime = bitcast!(c::CLOCK_REALTIME),

    /// `CLOCK_MONOTONIC`
    #[doc(alias = "CLOCK_MONOTONIC")]
    Monotonic = bitcast!(c::CLOCK_MONOTONIC),

    /// `CLOCK_UPTIME`
    #[cfg(any(freebsdlike, target_os = "openbsd"))]
    #[doc(alias = "CLOCK_UPTIME")]
    Uptime = c::CLOCK_UPTIME,

    /// `CLOCK_PROCESS_CPUTIME_ID`
    #[cfg(not(any(
        solarish,
        target_os = "netbsd",
        target_os = "redox",
        target_os = "vita"
    )))]
    #[doc(alias = "CLOCK_PROCESS_CPUTIME_ID")]
    ProcessCPUTime = c::CLOCK_PROCESS_CPUTIME_ID,

    /// `CLOCK_THREAD_CPUTIME_ID`
    #[cfg(not(any(
        solarish,
        target_os = "netbsd",
        target_os = "redox",
        target_os = "vita"
    )))]
    #[doc(alias = "CLOCK_THREAD_CPUTIME_ID")]
    ThreadCPUTime = c::CLOCK_THREAD_CPUTIME_ID,

    /// `CLOCK_REALTIME_COARSE`
    #[cfg(any(linux_kernel, target_os = "freebsd"))]
    #[doc(alias = "CLOCK_REALTIME_COARSE")]
    RealtimeCoarse = c::CLOCK_REALTIME_COARSE,

    /// `CLOCK_MONOTONIC_COARSE`
    #[cfg(any(linux_kernel, target_os = "freebsd"))]
    #[doc(alias = "CLOCK_MONOTONIC_COARSE")]
    MonotonicCoarse = c::CLOCK_MONOTONIC_COARSE,

    /// `CLOCK_MONOTONIC_RAW`
    #[cfg(linux_kernel)]
    #[doc(alias = "CLOCK_MONOTONIC_RAW")]
    MonotonicRaw = c::CLOCK_MONOTONIC_RAW,

    /// `CLOCK_REALTIME_ALARM`
    #[cfg(linux_kernel)]
    #[doc(alias = "CLOCK_REALTIME_ALARM")]
    RealtimeAlarm = bitcast!(c::CLOCK_REALTIME_ALARM),

    /// `CLOCK_TAI`, available on Linux >= 3.10
    #[cfg(all(linux_kernel, feature = "linux_4_11"))]
    #[doc(alias = "CLOCK_TAI")]
    Tai = bitcast!(c::CLOCK_TAI),

    /// `CLOCK_BOOTTIME`
    ///
    /// On FreeBSD, use [`Self::Uptime`], as `CLOCK_BOOTTIME` is an alias for
    /// `CLOCK_UPTIME`.
    ///
    /// [`Self::Uptime`]: https://docs.rs/rustix/*/x86_64-unknown-freebsd/rustix/time/enum.ClockId.html#variant.Uptime
    #[cfg(any(linux_kernel, target_os = "fuchsia", target_os = "openbsd"))]
    #[doc(alias = "CLOCK_BOOTTIME")]
    Boottime = bitcast!(c::CLOCK_BOOTTIME),

    /// `CLOCK_BOOTTIME_ALARM`
    #[cfg(any(linux_kernel, target_os = "fuchsia"))]
    #[doc(alias = "CLOCK_BOOTTIME_ALARM")]
    BoottimeAlarm = bitcast!(c::CLOCK_BOOTTIME_ALARM),
}

/// `CLOCK_*` constants for use with [`clock_gettime`].
///
/// These constants are always supported at runtime, so `clock_gettime` never
/// has to fail with `INVAL` due to an unsupported clock. See
/// [`DynamicClockId`] for a greater set of clocks, with the caveat that not
/// all of them are always supported.
///
/// [`clock_gettime`]: crate::time::clock_gettime
#[cfg(apple)]
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[repr(u32)]
#[non_exhaustive]
pub enum ClockId {
    /// `CLOCK_REALTIME`
    #[doc(alias = "CLOCK_REALTIME")]
    Realtime = c::CLOCK_REALTIME,

    /// `CLOCK_MONOTONIC`
    #[doc(alias = "CLOCK_MONOTONIC")]
    Monotonic = c::CLOCK_MONOTONIC,

    /// `CLOCK_PROCESS_CPUTIME_ID`
    #[doc(alias = "CLOCK_PROCESS_CPUTIME_ID")]
    ProcessCPUTime = c::CLOCK_PROCESS_CPUTIME_ID,

    /// `CLOCK_THREAD_CPUTIME_ID`
    #[doc(alias = "CLOCK_THREAD_CPUTIME_ID")]
    ThreadCPUTime = c::CLOCK_THREAD_CPUTIME_ID,
}

/// `CLOCK_*` constants for use with [`clock_gettime_dynamic`].
///
/// These constants may be unsupported at runtime, depending on the OS version,
/// and `clock_gettime_dynamic` may fail with `INVAL`. See [`ClockId`] for
/// clocks which are always supported at runtime.
///
/// [`clock_gettime_dynamic`]: crate::time::clock_gettime_dynamic
#[cfg(not(target_os = "wasi"))]
#[derive(Debug, Copy, Clone)]
#[non_exhaustive]
pub enum DynamicClockId<'a> {
    /// `ClockId` values that are always supported at runtime.
    Known(ClockId),

    /// Linux dynamic clocks.
    Dynamic(BorrowedFd<'a>),

    /// `CLOCK_REALTIME_ALARM`
    #[cfg(linux_kernel)]
    #[doc(alias = "CLOCK_REALTIME_ALARM")]
    RealtimeAlarm,

    /// `CLOCK_TAI`, available on Linux >= 3.10
    #[cfg(linux_kernel)]
    #[doc(alias = "CLOCK_TAI")]
    Tai,

    /// `CLOCK_BOOTTIME`
    #[cfg(any(
        linux_kernel,
        target_os = "freebsd",
        target_os = "fuchsia",
        target_os = "openbsd"
    ))]
    #[doc(alias = "CLOCK_BOOTTIME")]
    Boottime,

    /// `CLOCK_BOOTTIME_ALARM`
    #[cfg(any(linux_kernel, target_os = "fuchsia"))]
    #[doc(alias = "CLOCK_BOOTTIME_ALARM")]
    BoottimeAlarm,
}
