use crate::callback::CallbackSubscription;
use crate::callback::Consumer;
use crate::result::TockResult;
use crate::syscalls;
use core::marker::PhantomData;
use core::ops::Deref;
use core::ops::DerefMut;
use libtock_core::shared_memory::SharedMemory;

const DRIVER_NUMBER: usize = 0x40003;

pub const KEY_BUFFER_SIZE: usize = 32;
pub const DATA_BUFFER_SIZE: usize = 256;
pub const DEST_BUFFER_SIZE: usize = 32;

mod command_nr {
    pub const SET_ALGORITHM: usize = 0;
    pub const RUN: usize = 1;
}

mod subscribe_nr {
    pub const SUBSCRIBE_CALLBACK: usize = 0;
}

mod allow_nr {
    pub const KEY: usize = 0;
    pub const DATA: usize = 1;
    pub const DEST: usize = 2;
}

#[non_exhaustive]
pub struct HmacDriverFactory;

impl HmacDriverFactory {
    pub fn init_driver(&mut self) -> TockResult<HmacDriver> {
        let hmac = HmacDriver {
            lifetime: PhantomData,
        };
        Ok(hmac)
    }
}

struct HmacEventConsumer;

impl<CB: FnMut(usize, usize)> Consumer<CB> for HmacEventConsumer {
    fn consume(callback: &mut CB, result: usize, digest: usize, _: usize) {
        callback(result, digest);
    }
}

pub struct HmacKeyBuffer {
    buffer: [u8; KEY_BUFFER_SIZE],
}

impl Default for HmacKeyBuffer {
    fn default() -> Self {
        HmacKeyBuffer {
            buffer: [0; KEY_BUFFER_SIZE],
        }
    }
}

impl Deref for HmacKeyBuffer {
    type Target = [u8; KEY_BUFFER_SIZE];

    fn deref(&self) -> &Self::Target {
        &self.buffer
    }
}

impl DerefMut for HmacKeyBuffer {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.buffer
    }
}

pub struct HmacDataBuffer {
    buffer: [u8; DATA_BUFFER_SIZE],
}

impl Default for HmacDataBuffer {
    fn default() -> Self {
        HmacDataBuffer {
            buffer: [0; DATA_BUFFER_SIZE],
        }
    }
}

impl Deref for HmacDataBuffer {
    type Target = [u8; DATA_BUFFER_SIZE];

    fn deref(&self) -> &Self::Target {
        &self.buffer
    }
}

impl DerefMut for HmacDataBuffer {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.buffer
    }
}

pub struct HmacDestBuffer {
    buffer: [u8; DEST_BUFFER_SIZE],
}

impl Default for HmacDestBuffer {
    fn default() -> Self {
        HmacDestBuffer {
            buffer: [0; DEST_BUFFER_SIZE],
        }
    }
}

impl Deref for HmacDestBuffer {
    type Target = [u8; DEST_BUFFER_SIZE];

    fn deref(&self) -> &Self::Target {
        &self.buffer
    }
}

impl DerefMut for HmacDestBuffer {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.buffer
    }
}

pub struct HmacDriver<'a> {
    lifetime: PhantomData<&'a ()>,
}

impl<'a> HmacDriver<'a> {
    pub fn init_key_buffer(&self, buffer: &'a mut HmacKeyBuffer) -> TockResult<SharedMemory> {
        syscalls::allow(DRIVER_NUMBER, allow_nr::KEY, &mut buffer.buffer).map_err(Into::into)
    }

    pub fn init_data_buffer(&self, buffer: &'a mut HmacDataBuffer) -> TockResult<SharedMemory> {
        syscalls::allow(DRIVER_NUMBER, allow_nr::DATA, &mut buffer.buffer).map_err(Into::into)
    }

    pub fn init_dest_buffer(&self, buffer: &'a mut HmacDestBuffer) -> TockResult<SharedMemory> {
        syscalls::allow(DRIVER_NUMBER, allow_nr::DEST, &mut buffer.buffer).map_err(Into::into)
    }

    pub fn subscribe<CB: FnMut(usize, usize)>(
        &self,
        callback: &'a mut CB,
    ) -> TockResult<CallbackSubscription> {
        syscalls::subscribe::<HmacEventConsumer, _>(
            DRIVER_NUMBER,
            subscribe_nr::SUBSCRIBE_CALLBACK,
            callback,
        )
        .map_err(Into::into)
    }

    pub fn set_algorithm(&self, hash: usize) -> TockResult<()> {
        syscalls::command(DRIVER_NUMBER, command_nr::SET_ALGORITHM, hash, 0)?;
        Ok(())
    }

    pub fn run(&self) -> TockResult<()> {
        syscalls::command(DRIVER_NUMBER, command_nr::RUN, 0, 0)?;
        Ok(())
    }
}
