// Copyright 2026 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.chromeos.moblab.v1beta1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/chromeos/moblab/v1beta1/resources.proto";

option go_package = "google.golang.org/genproto/googleapis/chromeos/moblab/v1beta1;moblab";
option java_multiple_files = true;
option java_outer_classname = "TestServiceProto";
option java_package = "com.google.chromeos.moblab.v1beta1";
option optimize_for = SPEED;

// Manages test services for Satlab/Moblab.
service TestService {
  option (google.api.default_host) = "chromeosmoblab.googleapis.com";

  // Creates a session to run on-demand tests.
  rpc CreateSession(CreateSessionRequest) returns (Session) {
    option (google.api.http) = {
      post: "/v1beta1/sessions"
      body: "session"
    };
    option (google.api.method_signature) = "session,session_id";
  }

  // Lists test efforts.
  rpc ListTestEfforts(ListTestEffortsRequest)
      returns (ListTestEffortsResponse) {
    option (google.api.http) = {
      get: "/v1beta1/testEfforts"
    };
  }

  // Cancels a test effort.
  rpc CancelTestEffort(CancelTestEffortRequest)
      returns (CancelTestEffortResponse) {
    option (google.api.http) = {
      post: "/v1beta1/{name=testEfforts/*}:cancel"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a test effort.
  rpc CreateTestEffort(CreateTestEffortRequest) returns (TestEffort) {
    option (google.api.http) = {
      post: "/v1beta1/testEfforts"
      body: "test_effort"
    };
    option (google.api.method_signature) = "test_effort,test_effort_id";
  }
}

// Request message for creating a session.
// -- NEXT_TAG: 3 --
message CreateSessionRequest {
  // Required. The session to create.
  Session session = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. The ID to use for the session, which will become the final
  // component of the session's resource name.
  string session_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Request message for listing test efforts.
// Test efforts are queried in reverse chronological order.
message ListTestEffortsRequest {
  // Optional. The maximum number of test efforts to return. The service may
  // return fewer than this value.
  // If unspecified, at most 50 test efforts will be returned.
  // The maximum value is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `ListTestEfforts` call.
  // Provide this to retrieve the subsequent page.
  string page_token = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A filter string to restrict the results.
  // The following fields are supported:
  //   - satlab_id
  // For example: "satlab_id=12345"
  string filter = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for listing test efforts.
message ListTestEffortsResponse {
  // The list of test efforts.
  repeated TestEffort test_efforts = 1;

  // Token to retrieve the next page of test efforts. If this field
  // is omitted, there are no subsequent pages.
  string next_page_token = 2;

  // Total number of test efforts.
  int32 total_size = 3;
}

// Request message for cancelling a test effort.
message CancelTestEffortRequest {
  // Required. The resource name of the test effort to cancel.
  // Format: testEfforts/{test_effort}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "chromeosmoblab.googleapis.com/TestEffort"
    }
  ];
}

// Response message for cancelling a test effort.
message CancelTestEffortResponse {
  // The cancelled test effort.
  TestEffort test_effort = 1;
}

// Request message for creating a test effort.
message CreateTestEffortRequest {
  // Required. The test effort to create.
  TestEffort test_effort = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. The ID to use for the test effort, which will become the final
  // component of the test effort's resource name.
  string test_effort_id = 2 [(google.api.field_behavior) = OPTIONAL];
}
