use heapless::{String, Vec};

/// internal supporting structures for CtrlMsg

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct ScanResult {
    #[noproto(tag = "1")]
    pub ssid: String<32>,
    #[noproto(tag = "2")]
    pub chnl: u32,
    #[noproto(tag = "3")]
    pub rssi: u32,
    #[noproto(tag = "4")]
    pub bssid: String<32>,
    #[noproto(tag = "5")]
    pub sec_prot: CtrlWifiSecProt,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct ConnectedStaList {
    #[noproto(tag = "1")]
    pub mac: String<32>,
    #[noproto(tag = "2")]
    pub rssi: u32,
}
/// * Req/Resp structure *

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqGetMacAddress {
    #[noproto(tag = "1")]
    pub mode: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespGetMacAddress {
    #[noproto(tag = "1")]
    pub mac: String<32>,
    #[noproto(tag = "2")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqGetMode {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespGetMode {
    #[noproto(tag = "1")]
    pub mode: u32,
    #[noproto(tag = "2")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqSetMode {
    #[noproto(tag = "1")]
    pub mode: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespSetMode {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqGetStatus {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespGetStatus {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqSetMacAddress {
    #[noproto(tag = "1")]
    pub mac: String<32>,
    #[noproto(tag = "2")]
    pub mode: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespSetMacAddress {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqGetApConfig {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespGetApConfig {
    #[noproto(tag = "1")]
    pub ssid: String<32>,
    #[noproto(tag = "2")]
    pub bssid: String<32>,
    #[noproto(tag = "3")]
    pub rssi: u32,
    #[noproto(tag = "4")]
    pub chnl: u32,
    #[noproto(tag = "5")]
    pub sec_prot: CtrlWifiSecProt,
    #[noproto(tag = "6")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqConnectAp {
    #[noproto(tag = "1")]
    pub ssid: String<32>,
    #[noproto(tag = "2")]
    pub pwd: String<32>,
    #[noproto(tag = "3")]
    pub bssid: String<32>,
    #[noproto(tag = "4")]
    pub is_wpa3_supported: bool,
    #[noproto(tag = "5")]
    pub listen_interval: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespConnectAp {
    #[noproto(tag = "1")]
    pub resp: u32,
    #[noproto(tag = "2")]
    pub mac: String<32>,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqGetSoftApConfig {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespGetSoftApConfig {
    #[noproto(tag = "1")]
    pub ssid: String<32>,
    #[noproto(tag = "2")]
    pub pwd: String<32>,
    #[noproto(tag = "3")]
    pub chnl: u32,
    #[noproto(tag = "4")]
    pub sec_prot: CtrlWifiSecProt,
    #[noproto(tag = "5")]
    pub max_conn: u32,
    #[noproto(tag = "6")]
    pub ssid_hidden: bool,
    #[noproto(tag = "7")]
    pub bw: u32,
    #[noproto(tag = "8")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqStartSoftAp {
    #[noproto(tag = "1")]
    pub ssid: String<32>,
    #[noproto(tag = "2")]
    pub pwd: String<32>,
    #[noproto(tag = "3")]
    pub chnl: u32,
    #[noproto(tag = "4")]
    pub sec_prot: CtrlWifiSecProt,
    #[noproto(tag = "5")]
    pub max_conn: u32,
    #[noproto(tag = "6")]
    pub ssid_hidden: bool,
    #[noproto(tag = "7")]
    pub bw: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespStartSoftAp {
    #[noproto(tag = "1")]
    pub resp: u32,
    #[noproto(tag = "2")]
    pub mac: String<32>,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqScanResult {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespScanResult {
    #[noproto(tag = "1")]
    pub count: u32,
    #[noproto(repeated, tag = "2")]
    pub entries: Vec<ScanResult, 16>,
    #[noproto(tag = "3")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqSoftApConnectedSta {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespSoftApConnectedSta {
    #[noproto(tag = "1")]
    pub num: u32,
    #[noproto(repeated, tag = "2")]
    pub stations: Vec<ConnectedStaList, 16>,
    #[noproto(tag = "3")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqOtaBegin {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespOtaBegin {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqOtaWrite {
    #[noproto(tag = "1")]
    pub ota_data: Vec<u8, 1024>,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespOtaWrite {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqOtaEnd {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespOtaEnd {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqVendorIeData {
    #[noproto(tag = "1")]
    pub element_id: u32,
    #[noproto(tag = "2")]
    pub length: u32,
    #[noproto(tag = "3")]
    pub vendor_oui: Vec<u8, 8>,
    #[noproto(tag = "4")]
    pub vendor_oui_type: u32,
    #[noproto(tag = "5")]
    pub payload: Vec<u8, 64>,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqSetSoftApVendorSpecificIe {
    #[noproto(tag = "1")]
    pub enable: bool,
    #[noproto(tag = "2")]
    pub r#type: CtrlVendorIeType,
    #[noproto(tag = "3")]
    pub idx: CtrlVendorIeid,
    #[noproto(optional, tag = "4")]
    pub vendor_ie_data: Option<CtrlMsgReqVendorIeData>,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespSetSoftApVendorSpecificIe {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqSetWifiMaxTxPower {
    #[noproto(tag = "1")]
    pub wifi_max_tx_power: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespSetWifiMaxTxPower {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqGetWifiCurrTxPower {}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespGetWifiCurrTxPower {
    #[noproto(tag = "1")]
    pub wifi_curr_tx_power: u32,
    #[noproto(tag = "2")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgReqConfigHeartbeat {
    #[noproto(tag = "1")]
    pub enable: bool,
    #[noproto(tag = "2")]
    pub duration: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgRespConfigHeartbeat {
    #[noproto(tag = "1")]
    pub resp: u32,
}
/// * Event structure *

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgEventEspInit {
    #[noproto(tag = "1")]
    pub init_data: Vec<u8, 64>,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgEventHeartbeat {
    #[noproto(tag = "1")]
    pub hb_num: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgEventStationDisconnectFromAp {
    #[noproto(tag = "1")]
    pub resp: u32,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsgEventStationDisconnectFromEspSoftAp {
    #[noproto(tag = "1")]
    pub resp: u32,
    #[noproto(tag = "2")]
    pub mac: String<32>,
}

#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) struct CtrlMsg {
    /// msg_type could be req, resp or Event
    #[noproto(tag = "1")]
    pub msg_type: CtrlMsgType,
    /// msg id
    #[noproto(tag = "2")]
    pub msg_id: CtrlMsgId,
    /// union of all msg ids
    #[noproto(
        oneof,
        tags = "101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 301, 302, 303, 304"
    )]
    pub payload: Option<CtrlMsgPayload>,
}

/// union of all msg ids
#[derive(Debug, Clone, Eq, PartialEq, noproto::Oneof)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlMsgPayload {
    /// * Requests *
    #[noproto(tag = "101")]
    ReqGetMacAddress(CtrlMsgReqGetMacAddress),
    #[noproto(tag = "102")]
    ReqSetMacAddress(CtrlMsgReqSetMacAddress),
    #[noproto(tag = "103")]
    ReqGetWifiMode(CtrlMsgReqGetMode),
    #[noproto(tag = "104")]
    ReqSetWifiMode(CtrlMsgReqSetMode),
    #[noproto(tag = "105")]
    ReqScanApList(CtrlMsgReqScanResult),
    #[noproto(tag = "106")]
    ReqGetApConfig(CtrlMsgReqGetApConfig),
    #[noproto(tag = "107")]
    ReqConnectAp(CtrlMsgReqConnectAp),
    #[noproto(tag = "108")]
    ReqDisconnectAp(CtrlMsgReqGetStatus),
    #[noproto(tag = "109")]
    ReqGetSoftapConfig(CtrlMsgReqGetSoftApConfig),
    #[noproto(tag = "110")]
    ReqSetSoftapVendorSpecificIe(CtrlMsgReqSetSoftApVendorSpecificIe),
    #[noproto(tag = "111")]
    ReqStartSoftap(CtrlMsgReqStartSoftAp),
    #[noproto(tag = "112")]
    ReqSoftapConnectedStasList(CtrlMsgReqSoftApConnectedSta),
    #[noproto(tag = "113")]
    ReqStopSoftap(CtrlMsgReqGetStatus),
    #[noproto(tag = "114")]
    ReqSetPowerSaveMode(CtrlMsgReqSetMode),
    #[noproto(tag = "115")]
    ReqGetPowerSaveMode(CtrlMsgReqGetMode),
    #[noproto(tag = "116")]
    ReqOtaBegin(CtrlMsgReqOtaBegin),
    #[noproto(tag = "117")]
    ReqOtaWrite(CtrlMsgReqOtaWrite),
    #[noproto(tag = "118")]
    ReqOtaEnd(CtrlMsgReqOtaEnd),
    #[noproto(tag = "119")]
    ReqSetWifiMaxTxPower(CtrlMsgReqSetWifiMaxTxPower),
    #[noproto(tag = "120")]
    ReqGetWifiCurrTxPower(CtrlMsgReqGetWifiCurrTxPower),
    #[noproto(tag = "121")]
    ReqConfigHeartbeat(CtrlMsgReqConfigHeartbeat),
    /// * Responses *
    #[noproto(tag = "201")]
    RespGetMacAddress(CtrlMsgRespGetMacAddress),
    #[noproto(tag = "202")]
    RespSetMacAddress(CtrlMsgRespSetMacAddress),
    #[noproto(tag = "203")]
    RespGetWifiMode(CtrlMsgRespGetMode),
    #[noproto(tag = "204")]
    RespSetWifiMode(CtrlMsgRespSetMode),
    #[noproto(tag = "205")]
    RespScanApList(CtrlMsgRespScanResult),
    #[noproto(tag = "206")]
    RespGetApConfig(CtrlMsgRespGetApConfig),
    #[noproto(tag = "207")]
    RespConnectAp(CtrlMsgRespConnectAp),
    #[noproto(tag = "208")]
    RespDisconnectAp(CtrlMsgRespGetStatus),
    #[noproto(tag = "209")]
    RespGetSoftapConfig(CtrlMsgRespGetSoftApConfig),
    #[noproto(tag = "210")]
    RespSetSoftapVendorSpecificIe(CtrlMsgRespSetSoftApVendorSpecificIe),
    #[noproto(tag = "211")]
    RespStartSoftap(CtrlMsgRespStartSoftAp),
    #[noproto(tag = "212")]
    RespSoftapConnectedStasList(CtrlMsgRespSoftApConnectedSta),
    #[noproto(tag = "213")]
    RespStopSoftap(CtrlMsgRespGetStatus),
    #[noproto(tag = "214")]
    RespSetPowerSaveMode(CtrlMsgRespSetMode),
    #[noproto(tag = "215")]
    RespGetPowerSaveMode(CtrlMsgRespGetMode),
    #[noproto(tag = "216")]
    RespOtaBegin(CtrlMsgRespOtaBegin),
    #[noproto(tag = "217")]
    RespOtaWrite(CtrlMsgRespOtaWrite),
    #[noproto(tag = "218")]
    RespOtaEnd(CtrlMsgRespOtaEnd),
    #[noproto(tag = "219")]
    RespSetWifiMaxTxPower(CtrlMsgRespSetWifiMaxTxPower),
    #[noproto(tag = "220")]
    RespGetWifiCurrTxPower(CtrlMsgRespGetWifiCurrTxPower),
    #[noproto(tag = "221")]
    RespConfigHeartbeat(CtrlMsgRespConfigHeartbeat),
    /// * Notifications *
    #[noproto(tag = "301")]
    EventEspInit(CtrlMsgEventEspInit),
    #[noproto(tag = "302")]
    EventHeartbeat(CtrlMsgEventHeartbeat),
    #[noproto(tag = "303")]
    EventStationDisconnectFromAp(CtrlMsgEventStationDisconnectFromAp),
    #[noproto(tag = "304")]
    EventStationDisconnectFromEspSoftAp(CtrlMsgEventStationDisconnectFromEspSoftAp),
}

/// Enums similar to ESP IDF
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlVendorIeType {
    #[default]
    Beacon = 0,
    ProbeReq = 1,
    ProbeResp = 2,
    AssocReq = 3,
    AssocResp = 4,
}

#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlVendorIeid {
    #[default]
    Id0 = 0,
    Id1 = 1,
}

#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlWifiMode {
    #[default]
    None = 0,
    Sta = 1,
    Ap = 2,
    Apsta = 3,
}

#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlWifiBw {
    #[default]
    BwInvalid = 0,
    Ht20 = 1,
    Ht40 = 2,
}

#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlWifiPowerSave {
    #[default]
    PsInvalid = 0,
    MinModem = 1,
    MaxModem = 2,
}

/// Wifi Security Settings
#[allow(missing_docs)]
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum CtrlWifiSecProt {
    #[default]
    Open = 0,
    Wep = 1,
    WpaPsk = 2,
    Wpa2Psk = 3,
    WpaWpa2Psk = 4,
    Wpa2Enterprise = 5,
    Wpa3Psk = 6,
    Wpa2Wpa3Psk = 7,
}

/// enums for Control path
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlStatus {
    #[default]
    Connected = 0,
    NotConnected = 1,
    NoApFound = 2,
    ConnectionFail = 3,
    InvalidArgument = 4,
    OutOfRange = 5,
}

#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlMsgType {
    #[default]
    MsgTypeInvalid = 0,
    Req = 1,
    Resp = 2,
    Event = 3,
    MsgTypeMax = 4,
}

#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
#[repr(u32)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub(crate) enum CtrlMsgId {
    #[default]
    MsgIdInvalid = 0,
    /// * Request Msgs *
    ReqBase = 100,
    ReqGetMacAddress = 101,
    ReqSetMacAddress = 102,
    ReqGetWifiMode = 103,
    ReqSetWifiMode = 104,
    ReqGetApScanList = 105,
    ReqGetApConfig = 106,
    ReqConnectAp = 107,
    ReqDisconnectAp = 108,
    ReqGetSoftApConfig = 109,
    ReqSetSoftApVendorSpecificIe = 110,
    ReqStartSoftAp = 111,
    ReqGetSoftApConnectedStaList = 112,
    ReqStopSoftAp = 113,
    ReqSetPowerSaveMode = 114,
    ReqGetPowerSaveMode = 115,
    ReqOtaBegin = 116,
    ReqOtaWrite = 117,
    ReqOtaEnd = 118,
    ReqSetWifiMaxTxPower = 119,
    ReqGetWifiCurrTxPower = 120,
    ReqConfigHeartbeat = 121,
    /// Add new control path command response before Req_Max
    /// and update Req_Max
    ReqMax = 122,
    /// * Response Msgs *
    RespBase = 200,
    RespGetMacAddress = 201,
    RespSetMacAddress = 202,
    RespGetWifiMode = 203,
    RespSetWifiMode = 204,
    RespGetApScanList = 205,
    RespGetApConfig = 206,
    RespConnectAp = 207,
    RespDisconnectAp = 208,
    RespGetSoftApConfig = 209,
    RespSetSoftApVendorSpecificIe = 210,
    RespStartSoftAp = 211,
    RespGetSoftApConnectedStaList = 212,
    RespStopSoftAp = 213,
    RespSetPowerSaveMode = 214,
    RespGetPowerSaveMode = 215,
    RespOtaBegin = 216,
    RespOtaWrite = 217,
    RespOtaEnd = 218,
    RespSetWifiMaxTxPower = 219,
    RespGetWifiCurrTxPower = 220,
    RespConfigHeartbeat = 221,
    /// Add new control path command response before Resp_Max
    /// and update Resp_Max
    RespMax = 222,
    /// * Event Msgs *
    EventBase = 300,
    EventEspInit = 301,
    EventHeartbeat = 302,
    EventStationDisconnectFromAp = 303,
    EventStationDisconnectFromEspSoftAp = 304,
    /// Add new control path command notification before Event_Max
    /// and update Event_Max
    EventMax = 305,
}
