syntax = "proto3";

package serialized_shot;

message Box {
  float left = 1;
  float top = 2;
  float width = 3;
  float height = 4;
}

message Point {
  float x = 1;
  float y = 2;
}

message BallDetection {
  Point plane_position = 1;
  Box annotation = 2;
  bool interpolated = 3;
}

message RLEBallDetection {
  BallDetection detection = 1;
  uint32 count = 2;
}

message RLEDetectionHistory { repeated RLEBallDetection detections = 1; }

message DetectionHistory { repeated BallDetection detections = 1; }

message CollisionInfo {
  uint32 source = 1;
  map<uint32, Point> ball_identifiers = 2;
  uint32 wall_identifier = 3;
  uint32 frame_index = 4;
  bool static = 5;
}

message Path {
  uint32 start_frame = 1;
  uint32 end_frame = 2;
  oneof detection_history {
    DetectionHistory detections = 3;
    RLEDetectionHistory rle_detections = 4;
    bool not_present = 5;
  }
  bool is_static = 6;
  CollisionInfo start_info = 7;
  CollisionInfo end_info = 8;
}

message IdentifierHistory {
  uint32 ball_identifier = 1;
  repeated Path paths = 2;
}
message KeyBallIdentifiers {
  uint32 cue_ball = 1;
  uint32 object_ball = 2;
  uint32 target_ball = 3;

  // For now this will just be cue->object/target->target
  // Long term this will potentially represent a linked list
  // of all balls in a shot.
  repeated uint32 contact_sequence = 4;

  optional uint32 cue_ball_id = 5;
  optional uint32 object_ball_id = 6;
  optional uint32 target_ball_id = 7;
}

message Shot {
  repeated IdentifierHistory identifier_histories = 3;
  KeyBallIdentifiers key_balls = 4;
  uint32 start_index = 5;
  uint32 end_index = 6;
}