syntax = "proto3";
package state;
option go_package = "github.com/nspcc-dev/neofs-api-go/state";
option csharp_namespace = "NeoFS.API.State";

import "service/meta.proto";
import "service/verify.proto";
import "bootstrap/types.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";

option (gogoproto.stable_marshaler_all) = true;

// Status service provides node's healthcheck and status info.
// TODO: decide how to describe auth and were contains permissions.
service Status {
    // Netmap request allows to receive current [bootstrap.SpreadMap](bootstrap.md#bootstrap.SpreadMap)
    rpc Netmap(NetmapRequest) returns (bootstrap.SpreadMap);
    // Metrics request allows to receive metrics in prometheus format
    rpc Metrics(MetricsRequest) returns (MetricsResponse);
    // HealthCheck request allows to check health status of the node.
    // If node unhealthy field Status would contains detailed info.
    rpc HealthCheck(HealthRequest) returns (HealthResponse);
    // DumpConfig request allows dumping settings for the current node.
    // To permit access, used server config options.
    // The request should be signed.
    rpc DumpConfig(DumpRequest) returns (DumpResponse);
    // DumpVars returns debug variables for the current node.
    // To permit access, used server config options.
    // The request should be signed.
    rpc DumpVars(DumpVarsRequest) returns (DumpVarsResponse);
    // ChangeState allows to change current node state of node.
    // To permit access, used server config options.
    // The request should be signed.
    rpc ChangeState(ChangeStateRequest) returns (ChangeStateResponse);
}

// NetmapRequest message to request current node netmap
message NetmapRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// MetricsRequest message to request node metrics
message MetricsRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// MetricsResponse contains [][]byte,
// every []byte is marshaled MetricFamily proto message
// from github.com/prometheus/client_model/metrics.proto
message MetricsResponse {
    repeated bytes Metrics = 1;
}

// HealthRequest message to check current state
message HealthRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// HealthResponse message with current state
message HealthResponse {
    // Healthy is true when node alive and healthy
    bool Healthy  = 1;
    // Status contains detailed information about health status
    string Status = 2;
}

// DumpRequest message to fetch current server config.
message DumpRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// DumpResponse message contains current server config.
// Config stored in JSON encoded into slice of bytes.
message DumpResponse {
    bytes Config = 1;
}

// DumpVarsRequest message to fetch current server debug variables.
message DumpVarsRequest {
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// DumpVarsResponse message contains current server debug variables.
// Variables stored in JSON encoded into slice of bytes.
message DumpVarsResponse {
    bytes Variables = 1;
}

// ChangeStateRequest contains a new state of node.
message ChangeStateRequest {
    enum State {
        // Unknown is default value. Does nothing.
        Unknown = 0;
        // Online used when need to set node to the online state.
        Online = 1;
        // Offline used when need to set node to the offline state.
        Offline = 2;
    }

    // State is a new state of node.
    State state = 1;
    // RequestMetaHeader contains information about request meta headers (should be embedded into message)
    service.RequestMetaHeader Meta           = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
    // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message)
    service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
}

// ChangeStateResponse is an empty response, that returns when RPC invoked without errors.
message ChangeStateResponse {}