/*
 * Copyright (C) 2019 Open Source Robotics Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

syntax = "proto3";

package ignition.msgs;
option java_package = "com.ignition.msgs";

import "ignition/msgs/header.proto";
import "ignition/msgs/world_stats.proto";

/// \brief Holds all the information needed to reconstruct a component.
message SerializedComponent
{
  /// \brief Unique ID that represents a component's type.
  uint64 type = 1;

  /// \brief Component's serialized data.
  bytes component = 2;

  /// \brief Whether the component should be removed at the current state.
  bool remove = 3;
};

/// \brief Holds all the information needed to reconstruct an entity and its
/// components.
message SerializedEntity
{
  /// \brief The entity is uniquely identified by its ID.
  uint64 id = 1;

  /// \brief All the components belonging to the entity.
  repeated SerializedComponent components = 2;

  /// \brief Whether the entity and all its components should be removed at the
  /// current state.
  bool remove = 3;
};

/// \brief Holds all the information needed to reconstruct the state of an
/// entity-component-system (ECS) architecture at a given time.
/// An ECS's state consists of several entities, each with an arbitrary number
/// of components tied to them.
message SerializedState
{
  /// \brief Header data, which contains the simulation time.
  ignition.msgs.Header header = 1;

  /// \brief All the entities currently in the simulation.
  repeated SerializedEntity entities = 2;
};

/// \brief All the data needed to step an ECS system, such as current
/// simulation time and entity states.
message SerializedStep
{
  /// \brief Iteration information, such as sim time and paused state.
  WorldStatistics stats = 1;

  /// \brief State of entities and components.
  SerializedState state = 2;
};
