/**
 * Copyright © 2016-2022 The Thingsboard Authors
 *
 * 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 transport;

option java_package = "org.thingsboard.server.gen.transport";
option java_outer_classname = "TransportProtos";

/**
 * Service Discovery Data Structures;
 */
message ServiceInfo {
  string serviceId = 1;
  repeated string serviceTypes = 2;
  repeated string transports = 6;
}

/**
 * Transport Service Data Structures;
 */
message SessionInfoProto {
  string nodeId = 1;
  int64 sessionIdMSB = 2;
  int64 sessionIdLSB = 3;
  int64 tenantIdMSB = 4;
  int64 tenantIdLSB = 5;
  int64 deviceIdMSB = 6;
  int64 deviceIdLSB = 7;
  string deviceName = 8;
  string deviceType = 9;
  int64 gwSessionIdMSB = 10;
  int64 gwSessionIdLSB = 11;
  int64 deviceProfileIdMSB = 12;
  int64 deviceProfileIdLSB = 13;
  int64 customerIdMSB = 14;
  int64 customerIdLSB = 15;
}

enum SessionEvent {
  OPEN = 0;
  CLOSED = 1;
}

enum SessionType {
  SYNC = 0;
  ASYNC = 1;
}

enum KeyValueType {
  BOOLEAN_V = 0;
  LONG_V = 1;
  DOUBLE_V = 2;
  STRING_V = 3;
  JSON_V = 4;
}

enum CredentialsType {
  ACCESS_TOKEN = 0;
  X509_CERTIFICATE = 1;
  MQTT_BASIC = 2;
  LWM2M_CREDENTIALS = 3;
}

message KeyValueProto {
  string key = 1;
  KeyValueType type = 2;
  bool bool_v = 3;
  int64 long_v = 4;
  double double_v = 5;
  string string_v = 6;
  string json_v = 7;
}

message TsKvProto {
  int64 ts = 1;
  KeyValueProto kv = 2;
}

message TsKvListProto {
  int64 ts = 1;
  repeated KeyValueProto kv = 2;
}

message DeviceInfoProto {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  int64 deviceIdMSB = 3;
  int64 deviceIdLSB = 4;
  string deviceName = 5;
  string deviceType = 6;
  string additionalInfo = 7;
  int64 deviceProfileIdMSB = 8;
  int64 deviceProfileIdLSB = 9;
  int64 customerIdMSB = 10;
  int64 customerIdLSB = 11;
  string powerMode = 12;
  int64 edrxCycle = 13;
  int64 psmActivityTimer = 14;
  int64 pagingTransmissionWindow = 15;
}

/**
 * Transport Service Messages;
 */
message SessionEventMsg {
  SessionType sessionType = 1;
  SessionEvent event = 2;
}

message PostTelemetryMsg {
  repeated TsKvListProto tsKvList = 1;
}

message PostAttributeMsg {
  repeated KeyValueProto kv = 1;
}

message GetAttributeRequestMsg {
  int32 requestId = 1;
  repeated string clientAttributeNames = 2;
  repeated string sharedAttributeNames = 3;
  bool onlyShared = 4;
}

message GetAttributeResponseMsg {
  int32 requestId = 1;
  repeated TsKvProto clientAttributeList = 2;
  repeated TsKvProto sharedAttributeList = 3;
  bool isMultipleAttributesRequest = 4;
  string error = 5;
  bool sharedStateMsg = 6;
}

message AttributeUpdateNotificationMsg {
  repeated TsKvProto sharedUpdated = 1;
  repeated string sharedDeleted = 2;
}

message ValidateDeviceTokenRequestMsg {
  string token = 1;
}

message ValidateDeviceX509CertRequestMsg {
  string hash = 1;
}

message ValidateBasicMqttCredRequestMsg {
  string clientId = 1;
  string userName = 2;
  string password = 3;
}

message ValidateDeviceCredentialsResponseMsg {
  DeviceInfoProto deviceInfo = 1;
  string credentialsBody = 2;
  bytes profileBody = 3;
}

message GetOrCreateDeviceFromGatewayRequestMsg {
  int64 gatewayIdMSB = 1;
  int64 gatewayIdLSB = 2;
  string deviceName = 3;
  string deviceType = 4;
}

message GetOrCreateDeviceFromGatewayResponseMsg {
  DeviceInfoProto deviceInfo = 1;
  bytes profileBody = 2;
}

message GetEntityProfileRequestMsg {
  string entityType = 1;
  int64 entityIdMSB = 2;
  int64 entityIdLSB = 3;
}

message GetAllQueueRoutingInfoRequestMsg {
}

message GetQueueRoutingInfoResponseMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  int64 queueIdMSB = 3;
  int64 queueIdLSB = 4;
  string queueName = 5;
  string queueTopic = 6;
  int32 partitions = 7;
}

message QueueUpdateMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  int64 queueIdMSB = 3;
  int64 queueIdLSB = 4;
  string queueName = 5;
  string queueTopic = 6;
  int32 partitions = 7;
}

message QueueDeleteMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  int64 queueIdMSB = 3;
  int64 queueIdLSB = 4;
  string queueName = 5;
}

message LwM2MRegistrationRequestMsg {
  string tenantId = 1;
  string endpoint = 2;
}

message LwM2MRegistrationResponseMsg {
  DeviceInfoProto deviceInfo = 1;
}

message LwM2MRequestMsg {
  LwM2MRegistrationRequestMsg registrationMsg = 1;
}

message LwM2MResponseMsg {
  LwM2MRegistrationResponseMsg registrationMsg = 1;
}

message GetResourceRequestMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  string resourceType = 3;
  string resourceKey = 4;
}

message GetResourceResponseMsg {
  bytes resource = 1;
}

message ValidateDeviceLwM2MCredentialsRequestMsg {
  string credentialsId = 1;
}

message ToTransportUpdateCredentialsProto {
  repeated string credentialsId = 1;
  repeated string credentialsValue = 2;
}

message GetTenantRoutingInfoRequestMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
}

message GetTenantRoutingInfoResponseMsg {
  bool isolatedTbCore = 1;
  bool isolatedTbRuleEngine = 2;
}

message GetDeviceProfileRequestMsg {
  int64 profileIdMSB = 1;
  int64 profileIdLSB = 2;
}

message GetEntityProfileResponseMsg {
  string entityType = 1;
  bytes data = 2;
  bytes apiState = 3;
}

message GetDeviceRequestMsg {
  int64 deviceIdMSB = 1;
  int64 deviceIdLSB = 2;
}

message GetDeviceResponseMsg {
  int64 deviceProfileIdMSB = 1;
  int64 deviceProfileIdLSB = 2;
  bytes deviceTransportConfiguration = 3;
}

message GetDeviceCredentialsRequestMsg {
  int64 deviceIdMSB = 1;
  int64 deviceIdLSB = 2;
}

message GetDeviceCredentialsResponseMsg {
  bytes deviceCredentialsData = 1;
}

message GetSnmpDevicesRequestMsg {
  int32 page = 1;
  int32 pageSize = 2;
}

message GetSnmpDevicesResponseMsg {
  repeated string ids = 1;
  bool hasNextPage = 2;
}

message EntityUpdateMsg {
  string entityType = 1;
  bytes data = 2;
}

message EntityDeleteMsg {
  string entityType = 1;
  int64 entityIdMSB = 2;
  int64 entityIdLSB = 3;
}

message ResourceUpdateMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  string resourceType = 3;
  string resourceKey = 4;
}

message ResourceDeleteMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  string resourceType = 3;
  string resourceKey = 4;
}

message SessionCloseNotificationProto {
  string message = 1;
}

message SubscribeToAttributeUpdatesMsg {
  bool unsubscribe = 1;
  SessionType sessionType = 2;
}

message SubscribeToRPCMsg {
  bool unsubscribe = 1;
  SessionType sessionType = 2;
}

message SendPendingRPCMsg {
}

message ToDeviceRpcRequestMsg {
  int32 requestId = 1;
  string methodName = 2;
  string params = 3;
  int64 expirationTime = 4;
  int64 requestIdMSB = 5;
  int64 requestIdLSB = 6;
  bool oneway = 7;
  bool persisted = 8;
}

message ToDeviceRpcResponseMsg {
  int32 requestId = 1;
  string payload = 2;
  string error = 3;
}

message UplinkNotificationMsg {
  int64 uplinkTs = 1;
}

message ToDeviceRpcResponseStatusMsg {
  int32 requestId = 1;
  int64 requestIdMSB = 2;
  int64 requestIdLSB = 3;
  string status = 4;
}

message ToServerRpcRequestMsg {
  int32 requestId = 1;
  string methodName = 2;
  string params = 3;
}

message ToServerRpcResponseMsg {
  int32 requestId = 1;
  string payload = 2;
  string error = 3;
}

message ClaimDeviceMsg {
  int64 deviceIdMSB = 1;
  int64 deviceIdLSB = 2;
  string secretKey = 3;
  int64 durationMs = 4;
}

message DeviceCredentialsProto {
  int64 deviceIdMSB = 1;
  int64 deviceIdLSB = 2;
  CredentialsType credentialsType = 3;
  string credentialsId = 4;
  string credentialsValue = 5;
}

message CredentialsDataProto {
  ValidateDeviceTokenRequestMsg validateDeviceTokenRequestMsg = 1;
  ValidateDeviceX509CertRequestMsg validateDeviceX509CertRequestMsg = 2;
  ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 3;
}

message ProvisionDeviceRequestMsg {
  string deviceName = 1;
  CredentialsType credentialsType = 2;
  ProvisionDeviceCredentialsMsg provisionDeviceCredentialsMsg = 3;
  CredentialsDataProto credentialsDataProto = 4;
}

message ProvisionDeviceCredentialsMsg {
  string provisionDeviceKey = 1;
  string provisionDeviceSecret = 2;
}

message ProvisionDeviceResponseMsg {
  ResponseStatus status = 1;
  CredentialsType credentialsType = 2;
  string credentialsValue = 3;
}

enum ResponseStatus {
  UNKNOWN = 0;
  SUCCESS = 1;
  NOT_FOUND = 2;
  FAILURE = 3;
}

message GetOtaPackageRequestMsg {
  int64 deviceIdMSB = 1;
  int64 deviceIdLSB = 2;
  int64 tenantIdMSB = 3;
  int64 tenantIdLSB = 4;
  string type = 5;
}

message GetOtaPackageResponseMsg {
  ResponseStatus responseStatus = 1;
  int64 otaPackageIdMSB = 2;
  int64 otaPackageIdLSB = 3;
  string type = 4;
  string title = 5;
  string version = 6;
  string contentType = 7;
  string fileName = 8;
}

//Used to report session state to tb-Service and persist this state in the cache on the tb-Service level.
message SubscriptionInfoProto {
  int64 lastActivityTime = 1;
  bool attributeSubscription = 2;
  bool rpcSubscription = 3;
}

message SessionSubscriptionInfoProto {
  SessionInfoProto sessionInfo = 1;
  SubscriptionInfoProto subscriptionInfo = 2;
}

message DeviceSessionsCacheEntry {
  repeated SessionSubscriptionInfoProto sessions = 1;
}

message TransportToDeviceActorMsg {
  SessionInfoProto sessionInfo = 1;
  SessionEventMsg sessionEvent = 2;
  GetAttributeRequestMsg getAttributes = 3;
  SubscribeToAttributeUpdatesMsg subscribeToAttributes = 4;
  SubscribeToRPCMsg subscribeToRPC = 5;
  ToDeviceRpcResponseMsg toDeviceRPCCallResponse = 6;
  SubscriptionInfoProto subscriptionInfo = 7;
  ClaimDeviceMsg claimDevice = 8;
  ProvisionDeviceRequestMsg provisionDevice = 9;
  ToDeviceRpcResponseStatusMsg rpcResponseStatusMsg = 10;
  SendPendingRPCMsg sendPendingRPC = 11;
  UplinkNotificationMsg uplinkNotificationMsg = 12;
}

message TransportToRuleEngineMsg {
  SessionInfoProto sessionInfo = 1;
  PostTelemetryMsg postTelemetry = 2;
  PostAttributeMsg postAttributes = 3;
  ToDeviceRpcResponseMsg toDeviceRPCCallResponse = 4;
  ToServerRpcRequestMsg toServerRPCCallRequest = 5;
}

/**
 * TB Core Data Structures
 */

message TbSubscriptionProto {
  string serviceId = 1;
  string sessionId = 2;
  int32 subscriptionId = 3;
  string entityType = 4;
  int64 tenantIdMSB = 5;
  int64 tenantIdLSB = 6;
  int64 entityIdMSB = 7;
  int64 entityIdLSB = 8;
}

message TbTimeSeriesSubscriptionProto {
  TbSubscriptionProto sub = 1;
  bool allKeys = 2;
  repeated TbSubscriptionKetStateProto keyStates = 3;
  int64 startTime = 4;
  int64 endTime = 5;
  bool latestValues = 6;
}

message TbAttributeSubscriptionProto {
  TbSubscriptionProto sub = 1;
  bool allKeys = 2;
  repeated TbSubscriptionKetStateProto keyStates = 3;
  string scope = 4;
}

message TbAlarmSubscriptionProto {
  TbSubscriptionProto sub = 1;
  int64 ts = 2;
}

message TbSubscriptionUpdateProto {
  string sessionId = 1;
  int32 subscriptionId = 2;
  int32 errorCode = 3;
  string errorMsg = 4;
  repeated TbSubscriptionUpdateValueListProto data = 5;
}

message TbAlarmSubscriptionUpdateProto {
  string sessionId = 1;
  int32 subscriptionId = 2;
  int32 errorCode = 3;
  string errorMsg = 4;
  string alarm = 5;
  bool deleted = 6;
}

message TbAttributeUpdateProto {
  string entityType = 1;
  int64 entityIdMSB = 2;
  int64 entityIdLSB = 3;
  int64 tenantIdMSB = 4;
  int64 tenantIdLSB = 5;
  string scope = 6;
  repeated TsKvProto data = 7;
}

message TbAlarmUpdateProto {
  string entityType = 1;
  int64 entityIdMSB = 2;
  int64 entityIdLSB = 3;
  int64 tenantIdMSB = 4;
  int64 tenantIdLSB = 5;
  string alarm = 6;
}

message TbAlarmDeleteProto {
  string entityType = 1;
  int64 entityIdMSB = 2;
  int64 entityIdLSB = 3;
  int64 tenantIdMSB = 4;
  int64 tenantIdLSB = 5;
  string alarm = 6;
}

message TbAttributeDeleteProto {
  string entityType = 1;
  int64 entityIdMSB = 2;
  int64 entityIdLSB = 3;
  int64 tenantIdMSB = 4;
  int64 tenantIdLSB = 5;
  string scope = 6;
  repeated string keys = 7;
}

message TbTimeSeriesDeleteProto {
  string entityType = 1;
  int64 entityIdMSB = 2;
  int64 entityIdLSB = 3;
  int64 tenantIdMSB = 4;
  int64 tenantIdLSB = 5;
  repeated string keys = 6;
}

message TbTimeSeriesUpdateProto {
  string entityType = 1;
  int64 entityIdMSB = 2;
  int64 entityIdLSB = 3;
  int64 tenantIdMSB = 4;
  int64 tenantIdLSB = 5;
  repeated TsKvProto data = 6;
}

message TbSubscriptionCloseProto {
  string sessionId = 1;
  int32 subscriptionId = 2;
}

message TbSubscriptionKetStateProto {
  string key = 1;
  int64 ts = 2;
}

message TbSubscriptionUpdateValueListProto {
  string key = 1;
  repeated TbSubscriptionUpdateTsValue tsValue = 2;
}

message TbSubscriptionUpdateTsValue {
   int64 ts = 1;
   optional string value = 2;
}

/**
 * TB Core to TB Core messages
 */

message DeviceStateServiceMsgProto {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  int64 deviceIdMSB = 3;
  int64 deviceIdLSB = 4;
  bool added = 5;
  bool updated = 6;
  bool deleted = 7;
}

message SubscriptionMgrMsgProto {
  TbTimeSeriesSubscriptionProto telemetrySub = 1;
  TbAttributeSubscriptionProto attributeSub = 2;
  TbSubscriptionCloseProto subClose = 3;
  TbTimeSeriesUpdateProto tsUpdate = 4;
  TbAttributeUpdateProto attrUpdate = 5;
  TbAttributeDeleteProto attrDelete = 6;
  TbAlarmSubscriptionProto alarmSub = 7;
  TbAlarmUpdateProto alarmUpdate = 8;
  TbAlarmDeleteProto alarmDelete = 9;
  TbTimeSeriesDeleteProto tsDelete = 10;
}

message LocalSubscriptionServiceMsgProto {
  TbSubscriptionUpdateProto subUpdate = 1;
  TbAlarmSubscriptionUpdateProto alarmSubUpdate = 2;
}

message FromDeviceRPCResponseProto {
  int64 requestIdMSB = 1;
  int64 requestIdLSB = 2;
  string response = 3;
  int32 error = 4;
}

message EdgeNotificationMsgProto {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  int64 edgeIdMSB = 3;
  int64 edgeIdLSB = 4;
  string type = 5;
  string action = 6;
  int64 entityIdMSB = 7;
  int64 entityIdLSB = 8;
  string entityType = 9;
  string body = 10;
  PostTelemetryMsg postTelemetryMsg = 11;
  PostAttributeMsg postAttributesMsg = 12;
}

/**
 * Main messages;
 */

/* Request from Transport Service to ThingsBoard Core Service */
message TransportApiRequestMsg {
  ValidateDeviceTokenRequestMsg validateTokenRequestMsg = 1;
  ValidateDeviceX509CertRequestMsg validateX509CertRequestMsg = 2;
  GetOrCreateDeviceFromGatewayRequestMsg getOrCreateDeviceRequestMsg = 3;
  GetEntityProfileRequestMsg entityProfileRequestMsg = 4;
  LwM2MRequestMsg lwM2MRequestMsg = 5;
  ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 6;
  ProvisionDeviceRequestMsg provisionDeviceRequestMsg = 7;
  ValidateDeviceLwM2MCredentialsRequestMsg validateDeviceLwM2MCredentialsRequestMsg = 8;
  GetResourceRequestMsg resourceRequestMsg = 9;
  GetOtaPackageRequestMsg otaPackageRequestMsg = 10;
  GetSnmpDevicesRequestMsg snmpDevicesRequestMsg = 11;
  GetDeviceRequestMsg deviceRequestMsg = 12;
  GetDeviceCredentialsRequestMsg deviceCredentialsRequestMsg = 13;
  GetAllQueueRoutingInfoRequestMsg getAllQueueRoutingInfoRequestMsg = 14;
}

/* Response from ThingsBoard Core Service to Transport Service */
message TransportApiResponseMsg {
  ValidateDeviceCredentialsResponseMsg validateCredResponseMsg = 1;
  GetOrCreateDeviceFromGatewayResponseMsg getOrCreateDeviceResponseMsg = 2;
  GetEntityProfileResponseMsg entityProfileResponseMsg = 3;
  ProvisionDeviceResponseMsg provisionDeviceResponseMsg = 4;
  GetSnmpDevicesResponseMsg snmpDevicesResponseMsg = 5;
  LwM2MResponseMsg lwM2MResponseMsg = 6;
  GetResourceResponseMsg resourceResponseMsg = 7;
  GetOtaPackageResponseMsg otaPackageResponseMsg = 8;
  GetDeviceResponseMsg deviceResponseMsg = 9;
  GetDeviceCredentialsResponseMsg deviceCredentialsResponseMsg = 10;
  repeated GetQueueRoutingInfoResponseMsg getQueueRoutingInfoResponseMsgs = 11;
}

/* Messages that are handled by ThingsBoard Core Service */
message ToCoreMsg {
  TransportToDeviceActorMsg toDeviceActorMsg = 1;
  DeviceStateServiceMsgProto deviceStateServiceMsg = 2;
  SubscriptionMgrMsgProto toSubscriptionMgrMsg = 3;
  bytes toDeviceActorNotificationMsg = 4;
  EdgeNotificationMsgProto edgeNotificationMsg = 5;
}

/* High priority messages with low latency are handled by ThingsBoard Core Service separately */
message ToCoreNotificationMsg {
  LocalSubscriptionServiceMsgProto toLocalSubscriptionServiceMsg = 1;
  FromDeviceRPCResponseProto fromDeviceRpcResponse = 2;
  bytes componentLifecycleMsg = 3;
  bytes edgeEventUpdateMsg = 4;
  QueueUpdateMsg queueUpdateMsg = 5;
  QueueDeleteMsg queueDeleteMsg = 6;
}

/* Messages that are handled by ThingsBoard RuleEngine Service */
message ToRuleEngineMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  bytes tbMsg = 3;
  repeated string relationTypes = 4;
  string failureMessage = 5;
}

message ToRuleEngineNotificationMsg {
  bytes componentLifecycleMsg = 1;
  FromDeviceRPCResponseProto fromDeviceRpcResponse = 2;
  QueueUpdateMsg queueUpdateMsg = 3;
  QueueDeleteMsg queueDeleteMsg = 4;
}

/* Messages that are handled by ThingsBoard Transport Service */
message ToTransportMsg {
  int64 sessionIdMSB = 1;
  int64 sessionIdLSB = 2;
  SessionCloseNotificationProto sessionCloseNotification = 3;
  GetAttributeResponseMsg getAttributesResponse = 4;
  AttributeUpdateNotificationMsg attributeUpdateNotification = 5;
  ToDeviceRpcRequestMsg toDeviceRequest = 6;
  ToServerRpcResponseMsg toServerResponse = 7;
  EntityUpdateMsg entityUpdateMsg = 8;
  EntityDeleteMsg entityDeleteMsg = 9;
  ProvisionDeviceResponseMsg provisionResponse = 10;
  ToTransportUpdateCredentialsProto toTransportUpdateCredentialsNotification = 11;
  ResourceUpdateMsg resourceUpdateMsg = 12;
  ResourceDeleteMsg resourceDeleteMsg = 13;
  UplinkNotificationMsg uplinkNotificationMsg = 14;
  QueueUpdateMsg queueUpdateMsg = 15;
  QueueDeleteMsg queueDeleteMsg = 16;
}

message UsageStatsKVProto{
  string key = 1;
  int64 value = 2;
}

message ToUsageStatsServiceMsg {
  int64 tenantIdMSB = 1;
  int64 tenantIdLSB = 2;
  int64 entityIdMSB = 3;
  int64 entityIdLSB = 4;
  repeated UsageStatsKVProto values = 5;
  int64 customerIdMSB = 6;
  int64 customerIdLSB = 7;
}

message ToOtaPackageStateServiceMsg {
  int64 ts = 1;
  int64 tenantIdMSB = 2;
  int64 tenantIdLSB = 3;
  int64 deviceIdMSB = 4;
  int64 deviceIdLSB = 5;
  int64 otaPackageIdMSB = 6;
  int64 otaPackageIdLSB = 7;
  string type = 8;
}
