// Copyright 2020 Google LLC
//
// 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 google.home.enterprise.sdm.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/home/enterprise/sdm/v1/device.proto";
import "google/home/enterprise/sdm/v1/site.proto";
import "google/protobuf/struct.proto";

option csharp_namespace = "Google.Home.Enterprise.Sdm.V1";
option go_package = "google.golang.org/genproto/googleapis/home/enterprise/sdm/v1;sdm";
option java_multiple_files = true;
option java_package = "com.google.home.enterprise.sdm.v1";
option objc_class_prefix = "GHENTSDM";
option php_namespace = "Google\\Home\\Enterprise\\Sdm\\V1";

// core::0122 is getting triggered by adding fields custom_name.
// though, 0122 has exception for such field name as display_name. Due to
// historical reasons we use custom_name for exactly same purpose, so it is
// covered by that exception.

// A service that allows API consumers to provision and manage Google
// Home structures and devices for enterprise use cases.
service SmartDeviceManagementService {
  option (google.api.default_host) = "smartdevicemanagement.googleapis.com";
  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/sdm.service";

  // Gets a device managed by the enterprise.
  rpc GetDevice(GetDeviceRequest) returns (Device) {
    option (google.api.http) = {
      get: "/v1/{name=enterprises/*/devices/*}"
    };
  }

  // Lists devices managed by the enterprise.
  rpc ListDevices(ListDevicesRequest) returns (ListDevicesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=enterprises/*}/devices"
    };
  }

  // Executes a command to device managed by the enterprise.
  rpc ExecuteDeviceCommand(ExecuteDeviceCommandRequest) returns (ExecuteDeviceCommandResponse) {
    option (google.api.http) = {
      post: "/v1/{name=enterprises/*/devices/*}:executeCommand"
      body: "*"
    };
  }

  // Gets a structure managed by the enterprise.
  rpc GetStructure(GetStructureRequest) returns (Structure) {
    option (google.api.http) = {
      get: "/v1/{name=enterprises/*/structures/*}"
    };
  }

  // Lists structures managed by the enterprise.
  rpc ListStructures(ListStructuresRequest) returns (ListStructuresResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=enterprises/*}/structures"
    };
  }

  // Gets a room managed by the enterprise.
  rpc GetRoom(GetRoomRequest) returns (Room) {
    option (google.api.http) = {
      get: "/v1/{name=enterprises/*/structures/*/rooms/*}"
    };
  }

  // Lists rooms managed by the enterprise.
  rpc ListRooms(ListRoomsRequest) returns (ListRoomsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=enterprises/*/structures/*}/rooms"
    };
  }
}

// Request message for SmartDeviceManagementService.GetDevice
message GetDeviceRequest {
  // The name of the device requested. For example:
  // "enterprises/XYZ/devices/123"
  string name = 1;
}

// Request message for SmartDeviceManagementService.ListDevices
message ListDevicesRequest {
  // The parent enterprise to list devices under. E.g. "enterprises/XYZ".
  string parent = 1;

  // Optional requested page size. Server may return fewer devices than
  // requested. If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // Optional token of the page to retrieve.
  string page_token = 3;

  // Optional filter to list devices.
  //
  // Filters can match the exact parent (could be a structure or a room):
  // 'parent=enterprises/XYZ/structures/jkl'
  // or filter by device custom name (substring match):
  // 'customName=wing'
  string filter = 4;
}

// Response message for SmartDeviceManagementService.ListDevices
message ListDevicesResponse {
  // The list of devices.
  repeated Device devices = 1;

  // The pagination token to retrieve the next page of results.
  string next_page_token = 2;
}

// Request message for SmartDeviceManagementService.ExecuteDeviceCommand
message ExecuteDeviceCommandRequest {
  // The name of the device requested. For example:
  // "enterprises/XYZ/devices/123"
  string name = 1;

  // The command name to execute, represented by the fully qualified protobuf
  // message name.
  string command = 2;

  // The command message to execute, represented as a Struct.
  google.protobuf.Struct params = 3;
}

// Response message for SmartDeviceManagementService.ExecuteDeviceCommand
message ExecuteDeviceCommandResponse {
  // The results of executing the command.
  google.protobuf.Struct results = 1;
}

// Request message for SmartDeviceManagementService.GetStructure
message GetStructureRequest {
  // The name of the structure requested. For example:
  // "enterprises/XYZ/structures/ABC".
  string name = 1;
}

// Request message for SmartDeviceManagementService.ListStructures
message ListStructuresRequest {
  // The parent enterprise to list structures under. E.g. "enterprises/XYZ".
  string parent = 1;

  // Requested page size. Server may return fewer structures than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // The token of the page to retrieve.
  string page_token = 3;

  // Optional filter to list structures.
  string filter = 4;
}

// Response message for SmartDeviceManagementService.ListStructures
message ListStructuresResponse {
  // The list of structures.
  repeated Structure structures = 1;

  // The pagination token to retrieve the next page of results.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for SmartDeviceManagementService.GetRoom
message GetRoomRequest {
  // The name of the room requested. For example:
  // "enterprises/XYZ/structures/ABC/rooms/123".
  string name = 1;
}

// Request message for SmartDeviceManagementService.ListRooms
message ListRoomsRequest {
  // The parent resource name of the rooms requested. For example:
  // "enterprises/XYZ/structures/ABC".
  string parent = 1;

  // Requested page size. Server may return fewer rooms than requested.
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 2;

  // The token of the page to retrieve.
  string page_token = 3;
}

// Response message for SmartDeviceManagementService.ListRooms
message ListRoomsResponse {
  // The list of rooms.
  repeated Room rooms = 1;

  // The pagination token to retrieve the next page of results.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}
