/*
 * Copyright 2023 Signal Messenger, LLC
 * SPDX-License-Identifier: AGPL-3.0-only
 */

syntax = "proto3";

option java_multiple_files = true;

package org.signal.chat.device;

/**
 * Provides methods for working with devices attached to a Signal account.
 */
service Devices {
  /**
   * Returns a list of devices associated with the caller's account.
   */
  rpc GetDevices(GetDevicesRequest) returns (GetDevicesResponse) {}

  /**
   * Removes a linked device from the caller's account. This call will fail with
   * a status of `PERMISSION_DENIED` if not called from the primary device
   * associated with an account. It will also fail with a status of
   * `INVALID_ARGUMENT` if the targeted device is the primary device associated
   * with the account.
   */
  rpc RemoveDevice(RemoveDeviceRequest) returns (RemoveDeviceResponse) {}

  rpc SetDeviceName(SetDeviceNameRequest) returns (SetDeviceNameResponse) {}

  /**
   * Sets the token(s) the server should use to send new message notifications
   * to the authenticated device.
   */
  rpc SetPushToken(SetPushTokenRequest) returns (SetPushTokenResponse) {}

  /**
   * Removes any push tokens associated with the authenticated device. After
   * calling this method, the server will assume that the authenticated device
   * will periodically poll for new messages.
   */
  rpc ClearPushToken(ClearPushTokenRequest) returns (ClearPushTokenResponse) {}

  /**
   * Declares that the authenticated device supports certain features.
   */
  rpc SetCapabilities(SetCapabilitiesRequest) returns (SetCapabilitiesResponse) {}
}

message GetDevicesRequest {}

message GetDevicesResponse {
  message LinkedDevice {
    /**
     * The identifier for the device within an account.
     */
    uint32 id = 1;

    /**
     * A sequence of bytes that encodes an encrypted human-readable name for
     * this device.
     */
    bytes name = 2;

    /**
     * The time, in milliseconds since the epoch, at which this device was
     * attached to its parent account.
     */
    uint64 created = 3;

    /**
     * The approximate time, in milliseconds since the epoch, at which this
     * device last connected to the server.
     */
    uint64 last_seen = 4;
  }

  /**
   * A list of devices linked to the authenticated account.
   */
  repeated LinkedDevice devices = 1;
}

message RemoveDeviceRequest {
  /**
   * The identifier for the device to remove from the authenticated account.
   */
  uint32 id = 1;
}

message SetDeviceNameRequest {
  /**
   * A sequence of bytes that encodes an encrypted human-readable name for this
   * device.
   */
  bytes name = 1;
}

message SetDeviceNameResponse {}

message RemoveDeviceResponse {}

message SetPushTokenRequest {
  message ApnsTokenRequest {
    /**
     * A "standard" APNs device token.
     */
    string apns_token = 1;

    /**
     * A VoIP APNs device token. If present, the server will prefer to send
     * message notifications to the device using this token on a VOIP APNs
     * topic.
     */
    string apns_voip_token = 2;
  }

  message FcmTokenRequest {
    /**
     * An FCM push token.
     */
    string fcm_token = 1;
  }

  oneof token_request {
    /**
     * If present, specifies the APNs device token(s) the server will use to
     * send new message notifications to the authenticated device.
     */
    ApnsTokenRequest apns_token_request = 1;

    /**
     * If present, specifies the FCM push token the server will use to send new
     * message notifications to the authenticated device.
     */
    FcmTokenRequest fcm_token_request = 2;
  }
}

message SetPushTokenResponse {}

message ClearPushTokenRequest {}

message ClearPushTokenResponse {}

message SetCapabilitiesRequest {
  bool storage = 1;
  bool transfer = 2;
  bool paymentActivation = 3;
  bool deleteSync = 4;
}

message SetCapabilitiesResponse {}
