use serde::*;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct Notification {
    #[serde(rename = "EventID")]
    pub event_id: String,

    #[serde(rename = "GUID")]
    pub guid: String,

    #[serde(rename = "Type")]
    pub notification_type: NotificationType,

    #[serde(rename = "Message")]
    pub message: String,

    #[serde(rename = "Title")]
    pub title: String,
    #[serde(rename = "Category")]
    pub category: String,

    #[serde(rename = "EventData")]
    pub data: serde_json::Value,

    #[serde(rename = "Expires")]
    pub expires: u64,

    #[serde(rename = "State")]
    pub state: String,

    #[serde(rename = "AvailableActions")]
    pub actions: Vec<Action>,

    #[serde(rename = "SelectedActionID")]
    pub selected_action_id: String,

    #[serde(rename = "ShowOnSystem")]
    pub show_on_system: bool,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct Action {
    #[serde(rename = "ID")]
    pub id: String,

    #[serde(rename = "Text")]
    pub text: String,

    #[serde(rename = "Type")]
    pub action_type: String,

    #[serde(rename = "Payload")]
    pub payload: serde_json::Value,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct NotificationType(i32);

#[allow(dead_code)]
pub const INFO: NotificationType = NotificationType(0);

#[allow(dead_code)]
pub const WARN: NotificationType = NotificationType(1);

#[allow(dead_code)]
pub const PROMPT: NotificationType = NotificationType(2);

#[allow(dead_code)]
pub const ERROR: NotificationType = NotificationType(3);