// Install protoc compiler https://github.com/google/protobuf/releases 
// Install gogofaster program:
// go get -u github.com/gogo/protobuf/protoc-gen-gogofaster
// protoc --proto_path=../../vendor:. --gogofaster_out=. control.proto
// Note that we use vendored gogoprotobuf path in example above.
syntax = "proto3";

package controlpb;

import "github.com/gogo/protobuf/gogoproto/gogo.proto";

option (gogoproto.equal_all) = true;
option (gogoproto.populate_all) = true;
option (gogoproto.testgen_all) = true;

enum MethodType {
    option (gogoproto.goproto_enum_prefix) = false;

    NODE = 0 [(gogoproto.enumvalue_customname) = "MethodTypeNode"];
    UNSUBSCRIBE = 1 [(gogoproto.enumvalue_customname) = "MethodTypeUnsubscribe"];
    DISCONNECT = 2 [(gogoproto.enumvalue_customname) = "MethodTypeDisconnect"];
    SHUTDOWN = 3 [(gogoproto.enumvalue_customname) = "MethodTypeShutdown"];
    SURVEY_REQUEST = 4 [(gogoproto.enumvalue_customname) = "MethodTypeSurveyRequest"];
    SURVEY_RESPONSE = 5 [(gogoproto.enumvalue_customname) = "MethodTypeSurveyResponse"];
}

message Command {
    string uid = 1 [(gogoproto.customname) = "UID", (gogoproto.jsontag) = "uid"];
    MethodType method = 2 [(gogoproto.jsontag) = "method"];
    bytes params = 3 [(gogoproto.customtype) = "Raw", (gogoproto.jsontag) = "params", (gogoproto.nullable) = false];
}

message Node {
    string uid = 1 [(gogoproto.customname) = "UID", (gogoproto.jsontag) = "uid"];
    string name = 2 [(gogoproto.jsontag) = "name"];
    string version = 3 [(gogoproto.jsontag) = "version"];
    uint32 num_clients = 4 [(gogoproto.jsontag) = "num_clients"];
    uint32 num_users = 5 [(gogoproto.jsontag) = "num_users"];
    uint32 num_channels = 6 [(gogoproto.jsontag) = "num_channels"];
    uint32 uptime = 7 [(gogoproto.jsontag) = "uptime"];
    Metrics metrics = 8 [(gogoproto.jsontag) = "metrics"];
}

message Metrics {
    double interval = 1 [(gogoproto.jsontag) = "interval"];
    map<string, double> items = 2 [(gogoproto.jsontag) = "items"];
}

message Unsubscribe {
    string channel = 1 [(gogoproto.jsontag) = "channel"];
    string user = 2 [(gogoproto.jsontag) = "user"];
}

message Disconnect {
    string user = 1 [(gogoproto.jsontag) = "user"];
    repeated string whitelist = 2 [(gogoproto.jsontag) = "whitelist"];
    uint32 code = 3 [(gogoproto.jsontag) = "code"];
    string reason = 4 [(gogoproto.jsontag) = "reason"];
    bool reconnect = 5 [(gogoproto.jsontag) = "reconnect"];
}

message SurveyRequest {
    uint64 id = 1 [(gogoproto.customname) = "ID", (gogoproto.jsontag) = "id"];
    string op = 2 [(gogoproto.jsontag) = "op"];
    bytes data = 3 [(gogoproto.jsontag) = "data"];
}

message SurveyResponse {
    uint64 id = 1 [(gogoproto.customname) = "ID", (gogoproto.jsontag) = "id"];
    uint32 code = 3 [(gogoproto.jsontag) = "code"];
    bytes data = 4 [(gogoproto.jsontag) = "data"];
}
