syntax = "proto3";

package app.grapheneos.networklocation.proto;

option java_outer_classname = "AppleWpsProtos";

message ALSLocationRequest {
  repeated GsmCellTower gsm_cell_towers = 1;
  repeated WirelessAP wireless_aps = 2;
  optional int32 number_of_surrounding_gsm_cells = 3;
  optional int32 number_of_surrounding_wifis = 4;

  optional string app_bundle_id = 5;

  repeated CdmaCellTower cdma_cell_towers = 21;
  repeated CdmaEvdoTower cdma_evdo_towers = 22;
  optional int32 number_of_surrounding_cdma_cells = 23;
  optional int32 number_of_surrounding_cdma_evdo_cells = 24;

  repeated LteCellTower lte_cell_towers = 25;
  optional int32 number_of_surrounding_lte_cells = 26;

  repeated ScdmaCellTower scdma_cell_towers = 27;
  optional int32 number_of_surrounding_scdma_cells = 28;

  repeated Nr5GCellTower nr5g_cell_towers = 29;
  optional int32 number_of_surrounding_nr5g_cells = 30;

  repeated WifiBand surrounding_wifi_bands = 31;
  optional WifiAltitudeScale wifi_altitude_scale = 32;

  optional ALSMeta meta = 33;

  message ALSMeta {
    optional string software_build = 1;
    optional string product_id = 2;
  }

  enum WifiBand {
    WIFI_BAND_UNKNOWN = 0;
    K2DOT4GHZ = 1;
    K5GHZ = 2;
  }

  enum WifiAltitudeScale {
    WIFI_ALTITUDE_SCALE_UNKNOWN = 0;
    KWIFI_ALTITUDE_SCALE_NONE = 1;
    KWIFI_ALTITUDE_SCALE_10_TO_THE_2 = 2;
  }
}

message ALSLocationResponse {
  repeated GsmCellTower gsm_cell_towers = 1;
  repeated WirelessAP wireless_aps = 2;

  repeated CdmaCellTower cdma_cell_towers = 21;
  repeated LteCellTower lte_cell_towers = 22;
  repeated ScdmaCellTower scdma_cell_towers = 23;
  repeated Nr5GCellTower nr5g_cell_towers = 24;
}

message ALSLocation {
  int64 latitude = 1;
  int64 longitude = 2;
  int32 accuracy = 3;
  optional int32 location_type = 4;
  optional int32 altitude = 5;
  optional int32 vertical_accuracy = 6;
  optional int32 confidence = 7;

  optional uint32 score = 11;
  optional int32 reach = 12;
  optional uint32 info_mask = 13;
}

message GsmCellTower {
  int32 mcc = 1;
  int32 mnc = 2;
  int32 cell_id = 3;
  int32 lac_id = 4;
  optional ALSLocation location = 5;

  optional int32 arcfn = 11;
  optional int32 psc = 12;
}

message WirelessAP {
  string mac_id = 1;
  optional ALSLocation location = 2;

  optional uint32 channel = 21;
  optional uint32 num_zaxis_harvest_traces = 22;
}

message CdmaCellTower {
  optional int32 mcc = 1;

  optional int32 sid = 3;
  optional int32 nid = 4;
  optional int32 bsid = 5;
  optional ALSLocation location = 6;
  optional int32 zoneid = 7;
  optional int32 bandclass = 8;
  optional int32 channel = 9;
  optional int32 pnoffset = 10;
}

message CdmaEvdoTower {
  string sectorid = 1;
  optional int32 bandclass = 2;
  optional int32 channel = 3;
  optional int32 pnoffset = 4;
  optional ALSLocation location = 5;
}

message LteCellTower {
  optional int32 mcc = 1;
  optional int32 mnc = 2;
  optional int32 cell_id = 3;
  optional int32 tac_id = 4;
  optional ALSLocation location = 5;
  optional int32 uarfcn = 6;
  optional int32 pid = 7;
}

message ScdmaCellTower {
  int32 mcc = 1;
  int32 mnc = 2;
  int32 cell_id = 3;
  int32 lac_id = 4;
  optional ALSLocation location = 5;

  optional int32 arfcn = 11;
  optional int32 psc = 12;
}

message Nr5GCellTower {
  optional int32 mcc = 1;
  optional int32 mnc = 2;
  optional int64 cell_id = 3;
  optional int32 tac_id = 4;
  optional ALSLocation location = 5;
  optional int32 nrarfcn = 6;
}
