pub use crate::prelude::*;

/// The entity object represents a single known object within the Lattice operational environment. It contains
/// all data associated with the entity, such as its name, ID, and other relevant components.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Entity {
    /// A Globally Unique Identifier (GUID) for your entity. If this field is empty, the Entity Manager API
    /// automatically generates an ID when it creates the entity.
    #[serde(rename = "entityId")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub entity_id: Option<String>,
    /// A human-readable entity description that's helpful for debugging purposes and human
    /// traceability. If this field is empty, the Entity Manager API generates one for you.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    /// Indicates the entity is active and should have a lifecycle state of CREATE or UPDATE.
    /// Set this field to true when publishing an entity.
    #[serde(rename = "isLive")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_live: Option<bool>,
    /// The time when the entity was first known to the entity producer. If this field is empty, the Entity Manager API uses the
    /// current timestamp of when the entity is first received.
    /// For example, when a drone is first powered on, it might report its startup time as the created time.
    /// The timestamp doesn't change for the lifetime of an entity.
    #[serde(rename = "createdTime")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub created_time: Option<DateTime<Utc>>,
    /// Future time that expires an entity and updates the is_live flag.
    /// For entities that are constantly updating, the expiry time also updates.
    /// In some cases, this may differ from is_live.
    /// Example: Entities with tasks exported to an external system must remain
    /// active even after they expire.
    /// This field is required when publishing a prepopulated entity.
    /// The expiry time must be in the future, but less than 30 days from the current time.
    #[serde(rename = "expiryTime")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expiry_time: Option<DateTime<Utc>>,
    /// Use noExpiry only when the entity contains information that should be available to other
    /// tasks or integrations beyond its immediate operational context. For example, use noExpiry
    /// for long-living geographical entities that maintain persistent relevance across multiple
    /// operations or tasks.
    #[serde(rename = "noExpiry")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub no_expiry: Option<bool>,
    /// Human-readable descriptions of what the entity is currently doing.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub status: Option<Status>,
    /// Geospatial data related to the entity, including its position, kinematics, and orientation.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub location: Option<Location>,
    /// Indicates uncertainty of the entity's position and kinematics.
    #[serde(rename = "locationUncertainty")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub location_uncertainty: Option<LocationUncertainty>,
    /// Geospatial representation of the entity, including entities that cover an area rather than a fixed point.
    #[serde(rename = "geoShape")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub geo_shape: Option<GeoShape>,
    /// Additional details on what the geospatial area or point represents, along with visual display details.
    #[serde(rename = "geoDetails")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub geo_details: Option<GeoDetails>,
    /// Entity name displayed in the Lattice UI side panel. Also includes identifiers that other systems can use to reference the same entity.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub aliases: Option<Aliases>,
    /// If this entity is tracked by another entity, this component contains data related to how it's being tracked.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tracked: Option<Tracked>,
    /// If this entity has been correlated or decorrelated to another one, this component contains information on the correlation or decorrelation.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub correlation: Option<Correlation>,
    /// View of the entity.
    #[serde(rename = "milView")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub mil_view: Option<MilView>,
    /// Ontology defines an entity's categorization in Lattice, and improves data retrieval and integration. Builds a standardized representation of the entity.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ontology: Option<Ontology>,
    /// Details an entity's available sensors.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sensors: Option<Sensors>,
    /// Details an entity's available payloads.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub payloads: Option<Payloads>,
    /// Details the entity's power source.
    #[serde(rename = "powerState")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub power_state: Option<PowerState>,
    /// The primary data source provenance for this entity.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub provenance: Option<Provenance>,
    /// Provenance of override data.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub overrides: Option<Box<Overrides>>,
    /// Describes an entity's specific characteristics and the operations that can be performed on the entity.
    /// For example, "simulated" informs the operator that the entity is from a simulation, and "deletable"
    /// informs the operator (and system) that the delete operation is valid against the entity.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub indicators: Option<Indicators>,
    /// The prioritization associated with an entity, such as if it's a threat or a high-value target.
    #[serde(rename = "targetPriority")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub target_priority: Option<TargetPriority>,
    /// Describes an entity's signal characteristics, primarily used when an entity is a signal of interest.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub signal: Option<Signal>,
    /// A message describing any transponder codes associated with Mode 1, 2, 3, 4, 5, S interrogations. These are related to ADS-B modes.
    #[serde(rename = "transponderCodes")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub transponder_codes: Option<TransponderCodes>,
    /// Describes an entity's security classification levels at an overall classification level and on a per
    /// field level.
    #[serde(rename = "dataClassification")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub data_classification: Option<Classification>,
    /// A catalog of tasks that can be performed by an entity.
    #[serde(rename = "taskCatalog")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub task_catalog: Option<TaskCatalog>,
    /// Media associated with an entity, such as videos, images, or thumbnails.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub media: Option<Media>,
    /// The relationships between this entity and other entities in the common operational picture (COP).
    #[serde(skip_serializing_if = "Option::is_none")]
    pub relationships: Option<Relationships>,
    /// Visual details associated with the display of an entity in the client.
    #[serde(rename = "visualDetails")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub visual_details: Option<VisualDetails>,
    /// Physical dimensions of the entity.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dimensions: Option<Dimensions>,
    /// Additional information about an entity's route.
    #[serde(rename = "routeDetails")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub route_details: Option<RouteDetails>,
    /// Schedules associated with this entity.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub schedules: Option<Schedules>,
    /// Health metrics or connection status reported by the entity.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub health: Option<Health>,
    /// Details for the group associated with this entity.
    #[serde(rename = "groupDetails")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub group_details: Option<GroupDetails>,
    /// Contains relevant supply information for the entity, such as fuel.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub supplies: Option<Supplies>,
    /// Orbit information for space objects.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub orbit: Option<Orbit>,
}
