use crate::ffi_types::{c_char, c_int};

pub enum botan_hotp_struct {}
pub type botan_hotp_t = *mut botan_hotp_struct;

pub enum botan_totp_struct {}
pub type botan_totp_t = *mut botan_totp_struct;

unsafe extern "C" {

    pub fn botan_hotp_init(
        hotp: *mut botan_hotp_t,
        key: *const u8,
        key_len: usize,
        hash_algo: *const c_char,
        digits: usize,
    ) -> c_int;

    pub fn botan_hotp_destroy(hotp: botan_hotp_t) -> c_int;

    pub fn botan_hotp_generate(hotp: botan_hotp_t, hotp_code: *mut u32, hotp_counter: u64)
    -> c_int;

    pub fn botan_hotp_check(
        hotp: botan_hotp_t,
        next_counter: *mut u64,
        hotp_code: u32,
        hotp_counter: u64,
        resync_range: usize,
    ) -> c_int;

    pub fn botan_totp_init(
        totp: *mut botan_totp_t,
        key: *const u8,
        key_len: usize,
        hash_algo: *const c_char,
        digits: usize,
        time_step: usize,
    ) -> c_int;

    pub fn botan_totp_destroy(totp: botan_totp_t) -> c_int;

    pub fn botan_totp_generate(totp: botan_totp_t, totp_code: *mut u32, timestamp: u64) -> c_int;

    pub fn botan_totp_check(
        totp: botan_totp_t,
        totp_code: u32,
        timestamp: u64,
        acceptable_drift: usize,
    ) -> c_int;

}
