use crate::connection_config::*;
use crate::ffi::helpers::*;
use std::fmt;
use std::os::raw::c_char;

#[repr(C)]
#[derive(Clone, Copy, PartialEq)]
pub enum ConnectionType {
    Usb,
    Serial,
    Tcp,
    Udp,
    Bluetooth,
    File,
    Mux,
}

impl From<&ConnectionConfig> for ConnectionType {
    fn from(config: &ConnectionConfig) -> Self {
        match config {
            ConnectionConfig::UsbConnectionConfig(_) => Self::Usb,
            ConnectionConfig::SerialConnectionConfig(_) => Self::Serial,
            ConnectionConfig::TcpConnectionConfig(_) => Self::Tcp,
            ConnectionConfig::UdpConnectionConfig(_) => Self::Udp,
            ConnectionConfig::BluetoothConnectionConfig(_) => Self::Bluetooth,
            ConnectionConfig::FileConnectionConfig(_) => Self::File,
            ConnectionConfig::MuxConnectionConfig(_) => Self::Mux,
        }
    }
}

impl fmt::Display for ConnectionType {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::Usb => write!(formatter, "USB"),
            Self::Serial => write!(formatter, "Serial"),
            Self::Tcp => write!(formatter, "TCP"),
            Self::Udp => write!(formatter, "UDP"),
            Self::Bluetooth => write!(formatter, "Bluetooth"),
            Self::File => write!(formatter, "File"),
            Self::Mux => write!(formatter, "Mux"),
        }
    }
}

#[no_mangle]
pub extern "C" fn XIMU3_connection_type_to_string(connection_type: ConnectionType) -> *const c_char {
    str_to_char_ptr(&connection_type.to_string())
}