syntax = "proto3";

package SpaceX.API.Device;

// Simplified Starlink protobuf definition
// Note: This is a basic structure based on reverse engineering
// The actual Starlink protobuf may have additional fields and different structure

service Device {
  rpc Handle(Request) returns (Response);
}

message Request {
  oneof request {
    GetStatusRequest getStatus = 1;
    GetStatsRequest dishGetStats = 2;
    GetLocationRequest getLocation = 3;
    GetHistoryRequest dishGetHistory = 4;
    RebootRequest reboot = 5;
    StowRequest dishStow = 6;
  }
}

message Response {
  oneof response {
    GetStatusResponse dishGetStatus = 1;
    GetStatsResponse dishGetStats = 2;
    GetLocationResponse getLocation = 3;
    GetHistoryResponse dishGetHistory = 4;
    RebootResponse reboot = 5;
    StowResponse dishStow = 6;
  }
}

message GetStatusRequest {}

message GetStatusResponse {
  DeviceInfo deviceInfo = 1;
  string state = 2;
  bool alertsEnabled = 3;
  ObstructionStats obstructionStats = 4;
  uint32 secondsUntilSwUpdate = 5;
  float popPingDropRate = 6;
  float downlinkThroughputBps = 7;
  float uplinkThroughputBps = 8;
  float popPingLatencyMs = 9;
}

message GetStatsRequest {}

message GetStatsResponse {
  float popPingLatencyMs = 1;
  float popPingDropRate = 2;
  float popPingJitterMs = 3;
  float downlinkThroughputBps = 4;
  float uplinkThroughputBps = 5;
  ObstructionStats obstructionStats = 6;
}

message GetLocationRequest {}

message GetLocationResponse {
  LLA lla = 1;
  ObstructionStats obstructionStats = 2;
}

message GetHistoryRequest {}

message GetHistoryResponse {
  HourlyStats currentHourlyStats = 1;
  PingStats popPingStats = 2;
}

message RebootRequest {}
message RebootResponse {}

message StowRequest {
  bool unstow = 1;
}
message StowResponse {}

message DeviceInfo {
  string id = 1;
  string hardwareVersion = 2;
  uint64 uptimeS = 3;
  int32 utcOffsetS = 4;
}

message ObstructionStats {
  float fractionObstructed = 1;
  uint32 validS = 2;
  repeated float wedgeFractionObstructed = 3;
  repeated float wedgeAbsFractionObstructed = 4;
  uint32 timeObstructed = 5;
}

message LLA {
  double lat = 1;
  double lon = 2;
  double alt = 3;
}

message HourlyStats {
  repeated float downloadThroughputBps = 1;
  repeated float uploadThroughputBps = 2;
  repeated float pingLatencyMs = 3;
  repeated float pingDropRate = 4;
  repeated uint32 obstructedS = 5;
}

message PingStats {
  repeated float latencyMs = 1;
  repeated float dropRate = 2;
}
