syntax = "proto3";

import "google/protobuf/descriptor.proto";
import "google/protobuf/timestamp.proto";

option go_package = "/proto";

package daemon;

service DaemonService {
  // Login uses setup key to prepare configuration for the daemon.
  rpc Login(LoginRequest) returns (LoginResponse) {}

  // WaitSSOLogin uses the userCode to validate the TokenInfo and
  // waits for the user to continue with the login on a browser
  rpc WaitSSOLogin(WaitSSOLoginRequest) returns (WaitSSOLoginResponse) {}

  // Up starts engine work in the daemon.
  rpc Up(UpRequest) returns (UpResponse) {}

  // Status of the service.
  rpc Status(StatusRequest) returns (StatusResponse) {}

  // Down engine work in the daemon.
  rpc Down(DownRequest) returns (DownResponse) {}

  // GetConfig of the daemon.
  rpc GetConfig(GetConfigRequest) returns (GetConfigResponse) {}
};

message LoginRequest {
  // setupKey wiretrustee setup key.
  string setupKey = 1;

  // preSharedKey for wireguard setup.
  string preSharedKey = 2;

  // managementUrl to authenticate.
  string managementUrl = 3;

  // adminUrl to manage keys.
  string adminURL = 4;

  // natExternalIPs map list of external IPs
  repeated string natExternalIPs = 5;

  // cleanNATExternalIPs clean map list of external IPs.
  // This is needed because the generated code
  // omits initialized empty slices due to omitempty tags
  bool cleanNATExternalIPs = 6;

  bytes customDNSAddress = 7;

  bool isLinuxDesktopClient = 8;

  string hostname = 9;
}

message LoginResponse {
  bool   needsSSOLogin = 1;
  string userCode = 2;
  string verificationURI = 3;
  string verificationURIComplete = 4;
}

message WaitSSOLoginRequest {
  string userCode = 1;
  string hostname = 2;
}

message WaitSSOLoginResponse {}

message UpRequest {}

message UpResponse {}

message StatusRequest{
  bool getFullPeerStatus = 1;
}

message StatusResponse{
  // status of the server.
  string status = 1;
  FullStatus fullStatus = 2;
  // NetBird daemon version
  string daemonVersion = 3;
}

message DownRequest {}

message DownResponse {}

message GetConfigRequest {}

message GetConfigResponse {
  // managementUrl settings value.
  string managementUrl = 1;

  // configFile settings value.
  string configFile = 2;

  // logFile settings value.
  string logFile = 3;

  // preSharedKey settings value.
  string preSharedKey = 4;

  // adminURL settings value.
  string adminURL = 5;
}

// PeerState contains the latest state of a peer
message PeerState {
  string IP = 1;
  string pubKey = 2;
  string connStatus = 3;
  google.protobuf.Timestamp connStatusUpdate = 4;
  bool relayed = 5;
  bool direct = 6;
  string localIceCandidateType = 7;
  string remoteIceCandidateType =8;
  string fqdn = 9;
}

// LocalPeerState contains the latest state of the local peer
message LocalPeerState {
  string IP = 1;
  string pubKey = 2;
  bool  kernelInterface =3;
  string fqdn = 4;
}

// SignalState contains the latest state of a signal connection
message SignalState {
  string URL = 1;
  bool connected = 2;
}

// ManagementState contains the latest state of a management connection
message ManagementState {
  string URL = 1;
  bool connected = 2;
}
// FullStatus contains the full state held by the Status instance
message FullStatus {
    ManagementState managementState = 1;
    SignalState     signalState = 2;
    LocalPeerState  localPeerState = 3;
    repeated PeerState peers = 4;
}