syntax = "proto3";

enum MovementType {
    CONTRACTING = 0;
    CANCEL = 1;
    INSTALL = 2;
    UNINSTALL = 3;
    UPDATE_STATUS = 4;
}

message UserAccount {
    string email = 1;
    string first_name = 2;
    string last_name = 3;
    string phone = 4;
    int32 login_id = 5;
    int32 contact_id = 6;
}

message VirtualMachine {
    string name = 1;
    string ownerName = 2; 
    // string vdcName = 3; 
    string description = 3;
    string guestOs = 4;
    string dateCreated = 5; 
    string href = 6;   // Se extrae id con prefijo mv
    int32 sensorId = 7;   // Oculto desde front y corresponde a deviceId
    int32 licenseId = 8;
}

message VMWorkloadSensor {
    string name = 1;
    string loginUserName = 2;
    string firstName = 3;
    string lastName = 4;
    string status = 5;
    string registeredTime = 6;
    string lastInternalIpAddress = 7;
    string lastExternalIpAddress = 8;
    string osVersion = 9;
    string sensorVersion = 10;
    string macAddress = 11;
    bool sensorOutOfDate = 12;
    int32 deviceId = 13;
}

message ServiceForm {
    string service = 1; // nombre
    MovementType movementType = 2;
    string plan = 3;    // nombre
    string orgVdc = 4;
    string paymentMethod = 5;
    int32 licenses = 6;
    string expireDate = 7;
    int32 requestQueueId = 8;
}

message LicenseForm {
    string orgVdc = 1;
    MovementType movementType = 2;
    string hrefVM = 3;
    int32 licenseId = 4;
}

message UserAccountsRequest {
    string cbc_api_host = 1;
    string org_key = 2;
    string auth_token = 3;
    string email = 4;   // filtro opcional de búsqueda
}

message UserAccountsResponse {
    repeated UserAccount accounts = 1;
    string status = 2;
    string message = 3;
}

message CreateUserAccountRequest {
    UserAccount user_data = 1;
    int32 org_id = 2;
    string cbc_api_host = 3;
    string org_key = 4;
    string auth_token = 5;
}

message CreateUserAccountResponse {
    string status = 1;
    string message = 2;
}

message UpdateUserAccountRequest {
    UserAccount user_data = 1;
    int32 org_id = 2;
    string login_name = 3;
    string cbc_api_host = 4;
    string org_key = 5;
    string auth_token = 6;
}

message UpdateUserAccountResponse {
    string status = 1;
    string message = 2;
}

message DeleteUserAccountRequest {
    int32 login_id = 1;
    string cbc_api_host = 2;
    string org_key = 3;
    string auth_token = 4;
}

message DeleteUserAccountResponse {
    string status = 1;
    string message = 2;
}

message RetrieveVMsRequest {
    string vdc_id = 1;
    string vcd_api_host = 2;
    string auth = 3;
    bool is_basic_auth = 4;
    string api_version = 5;
    string tenant = 6;
}

message RetrieveVMsResponse {
    repeated VirtualMachine vms = 1;
    string status = 2;
    string message = 3;
}

message RetrieveSensorsRequest {
    string cbc_api_host = 1;
    string auth_token = 2;
    int32 device_id = 3;
}

message RetrieveSensorsResponse {
    repeated VMWorkloadSensor vmws = 1;
    string status = 2;
    string message = 3;
}

message SensorManagementRequest {
    LicenseForm license_form = 1;
}

message SensorManagementResponse {
    string status = 1;
    string message = 2;
}

message ServiceManagementRequest {
    ServiceForm service_form = 1;
}

message ServiceManagementResponse {
    string status = 1;
    string message = 2;
}

service CBCManagerService {
    rpc GetUserAccounts (UserAccountsRequest) returns (UserAccountsResponse);
    rpc CreateUserAccount (CreateUserAccountRequest) returns (CreateUserAccountResponse);
    rpc UpdateUserAccount (UpdateUserAccountRequest) returns (UpdateUserAccountResponse);
    rpc DeleteUserAccount (DeleteUserAccountRequest) returns (DeleteUserAccountResponse);
    rpc RetrieveVMs (RetrieveVMsRequest) returns (RetrieveVMsResponse);
    rpc RetrieveWorkloadSensors (RetrieveSensorsRequest) returns (RetrieveSensorsResponse);
    rpc ServiceManage (ServiceManagementRequest) returns (ServiceManagementResponse);
    rpc SensorManage (SensorManagementRequest) returns (SensorManagementResponse);
}