use cuda_types::nvml::*;
use std::{ffi::CStr, ptr};

#[cfg(debug_assertions)]
pub(crate) fn unimplemented() -> nvmlReturn_t {
    unimplemented!()
}

#[cfg(not(debug_assertions))]
pub(crate) fn unimplemented() -> nvmlReturn_t {
    nvmlReturn_t::ERROR_NOT_SUPPORTED
}

#[allow(non_snake_case)]
pub(crate) fn nvmlErrorString(
    _result: cuda_types::nvml::nvmlReturn_t,
) -> *const ::core::ffi::c_char {
    c"".as_ptr()
}

#[allow(non_snake_case)]
pub(crate) fn nvmlInit_v2() -> cuda_types::nvml::nvmlReturn_t {
    nvmlReturn_t::SUCCESS
}

const VERSION: &'static CStr = c"550.77";

#[allow(non_snake_case)]
pub(crate) fn nvmlSystemGetDriverVersion(
    result: *mut ::core::ffi::c_char,
    length: ::core::ffi::c_uint,
) -> cuda_types::nvml::nvmlReturn_t {
    if result == ptr::null_mut() {
        return nvmlReturn_t::ERROR_INVALID_ARGUMENT;
    }
    let version = VERSION.to_bytes_with_nul();
    let copy_length = usize::min(length as usize, version.len());
    let slice = unsafe { std::slice::from_raw_parts_mut(result.cast(), copy_length) };
    slice.copy_from_slice(&version[..copy_length]);
    if let Some(null) = slice.last_mut() {
        *null = 0;
    }
    nvmlReturn_t::SUCCESS
}
