use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::modules::status::models::destination_status::DestinationStatus;
use crate::modules::status::models::flags2::Flags2;
use crate::modules::status::models::fuel_status::FuelStatus;
use crate::modules::status::models::gui_focus::GuiFocus;
use crate::modules::status::models::legal_status::LegalStatus;
use crate::modules::status::models::planet_status::PlanetStatus;
use crate::status::Flags;
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct Status {
#[serde(rename = "timestamp")]
pub timestamp: DateTime<Utc>,
#[serde(rename = "event")]
pub event: String,
#[serde(flatten)]
pub contents: Option<StatusContents>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct StatusContents {
pub flags: Flags,
pub flags2: Flags2,
pub legal_state: LegalStatus,
pub balance: u64,
#[serde(flatten)]
pub planet_status: Option<PlanetStatus>,
#[serde(flatten)]
pub kind: StatusKind,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
#[serde(untagged)]
pub enum StatusKind {
Ship(ShipStatus),
OnFoot(OnFootStatus),
}
impl StatusKind {
pub fn is_ship_status(&self) -> bool {
matches!(self, StatusKind::Ship(_))
}
pub fn is_on_foot_status(&self) -> bool {
matches!(self, StatusKind::OnFoot(_))
}
pub fn ship_status(&self) -> Option<&ShipStatus> {
match self {
StatusKind::Ship(ship_status) => Some(ship_status),
_ => None,
}
}
pub fn on_foot_status(&self) -> Option<&OnFootStatus> {
match self {
StatusKind::OnFoot(on_foot_status) => Some(on_foot_status),
_ => None,
}
}
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct ShipStatus {
pub pips: [u8; 3],
pub fire_group: u8,
pub gui_focus: GuiFocus,
pub fuel: FuelStatus,
pub cargo: f32,
pub destination: Option<DestinationStatus>,
}
impl ShipStatus {
pub fn system_pips(&self) -> u8 {
self.pips[0]
}
pub fn engine_pips(&self) -> u8 {
self.pips[1]
}
pub fn weapon_pips(&self) -> u8 {
self.pips[2]
}
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct OnFootStatus {
pub oxygen: f32,
pub health: f32,
pub temperature: f32,
pub selected_weapon: String,
pub selected_weapon_localized: Option<String>,
}