use {crate::logger::TERMINAL_LOGGER, core::fmt::Write, spin::Mutex};
pub static SERIAL_CONSOLE: Mutex<SerialConsole> = Mutex::new(SerialConsole {
    uart: 0x09000000 as *mut u8,
});

pub struct SerialConsole {
    uart: *mut u8,
}

impl core::fmt::Write for SerialConsole {
    fn write_str(&mut self, s: &str) -> core::fmt::Result {
        for c in s.chars() {
            unsafe { *self.uart = c as u8 }
        }

        Ok(())
    }
}

unsafe impl Sync for SerialConsole {}
unsafe impl Send for SerialConsole {}

pub fn log(args: core::fmt::Arguments<'_>) -> core::fmt::Result {
    SERIAL_CONSOLE.lock().write_fmt(args)?;
    // TERMINAL_LOGGER.lock().write_fmt(args)?;

    Ok(())
}