// Copyright 2021 Woodpecker Authors
// Copyright 2011 Drone.IO Inc.
//
// 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";

option go_package = "go.woodpecker-ci.org/woodpecker/v3/rpc/proto";
package proto;

// !IMPORTANT!
// Increased Version in version.go by 1 if you change something here!
// !IMPORTANT!

// Woodpecker Server Service
service Woodpecker {
  rpc Version         (Empty)                returns (VersionResponse) {}
  rpc Next            (NextRequest)          returns (NextResponse) {}
  rpc Init            (InitRequest)          returns (Empty) {}
  rpc Wait            (WaitRequest)          returns (WaitResponse) {}
  rpc Done            (DoneRequest)          returns (Empty) {}
  rpc Extend          (ExtendRequest)        returns (Empty) {}
  rpc Update          (UpdateRequest)        returns (Empty) {}
  rpc Log             (LogRequest)           returns (Empty) {}
  rpc RegisterAgent   (RegisterAgentRequest) returns (RegisterAgentResponse) {}
  rpc UnregisterAgent (Empty)                returns (Empty) {}
  rpc ReportHealth    (ReportHealthRequest)  returns (Empty) {}
}

//
// Basic Types
//

message StepState {
  string step_uuid = 1;
  int64  started = 2;
  int64  finished = 3;
  bool   exited = 4;
  int32  exit_code = 5;
  string error = 6;
  bool   canceled = 7;
  bool   skipped = 8;
}

message WorkflowState {
  int64  started = 1;
  int64  finished = 2;
  string error = 3;
  bool   canceled = 4;
}

message LogEntry {
  string step_uuid = 1;
  int64  time = 2;
  int32  line = 3;
  int32  type = 4; // 0 = stdout, 1 = stderr, 2 = exit-code, 3 = metadata, 4 = progress
  bytes  data = 5;
}

message Filter {
  map<string, string> labels = 1;
}

message Workflow {
  string id = 1;
  int64 timeout = 2;
  bytes payload = 3;
}

//
// Request types
//

message NextRequest {
  Filter filter = 1;
}

message InitRequest {
  string id = 1;
  WorkflowState state = 2;
}

message WaitRequest {
  string id = 1;
}

message DoneRequest {
  string id = 1;
  WorkflowState state = 2;
}

message ExtendRequest {
  string id = 1;
}

message UpdateRequest {
  string id = 1;
  StepState state = 2;
}

message LogRequest {
  repeated LogEntry logEntries = 1;
}

message Empty {
}

message ReportHealthRequest {
  string status = 1;
}

message AgentInfo {
  string platform = 1;
  int32  capacity = 2;
  string backend  = 3;
  string version  = 4;
  map<string, string> customLabels = 5;
}

message RegisterAgentRequest {
  AgentInfo info = 1;
}

//
// Response types
//

message VersionResponse {
  int32  grpc_version   = 1;
  string server_version = 2;
}

message NextResponse {
  Workflow workflow = 1;
}

message RegisterAgentResponse {
  int64 agent_id = 1;
}

message WaitResponse {
  bool canceled = 1;
};

// Woodpecker auth service is a simple service to authenticate agents and acquire a token

service WoodpeckerAuth {
  rpc Auth          (AuthRequest)          returns (AuthResponse) {}
}

message AuthRequest {
  string agent_token = 1;
  int64  agent_id    = 2;
}

message AuthResponse {
  string status        = 1;
  int64  agent_id      = 2;
  string access_token  = 3;
}
