syntax = "proto3";

package pcloud.api;

option go_package = "api";

enum ChunkStatus {
     NEW = 0;
     CREATED = 1;
     WRITING = 2;
     REPLICATING = 3;
     READY = 4;
}

enum ReplicaRole {
     SECONDARY = 0;
     PRIMARY = 1;
}

// ChunkStorage

service ChunkStorage {
	rpc ListChunks(ListChunksRequest) returns (ListChunksResponse) {}

	rpc CreateChunk(CreateChunkRequest) returns (CreateChunkResponse) {}

	rpc GetChunkStatus(GetChunkStatusRequest) returns (GetChunkStatusResponse) {}

	rpc ReadChunk(ReadChunkRequest) returns (ReadChunkResponse) {}

	rpc WriteChunk(WriteChunkRequest) returns (WriteChunkResponse) {}

	rpc StoreChunk(StoreChunkRequest) returns (StoreChunkResponse) {}

	rpc RemoveChunk(RemoveChunkRequest) returns (RemoveChunkResponse) {}
}

message ListChunksRequest {
}

message ListChunksResponse {
	repeated string chunk_id = 1;
}

message CreateChunkRequest {
	string chunk_id = 1;
	int32 size = 2;
	ReplicaRole role = 3;
	string primary_address = 4;
}

message CreateChunkResponse {
}

message GetChunkStatusRequest {
	string chunk_id = 1;
}

message GetChunkStatusResponse {
	ChunkStatus status = 1;
	int32 total_bytes = 2;
	int32 committed_bytes = 3;	
}

message ReadChunkRequest {
	string chunk_id = 1;
	int32 offset = 2;
	int32 num_bytes = 3;
}

message ReadChunkResponse {
	bytes data = 1;
}

message WriteChunkRequest {
	string chunk_id = 1;
	int32 offset = 2;
	bytes data = 3;
}

message WriteChunkResponse {
	int32 bytes_written = 1;
}

message StoreChunkRequest {
	string chunk_id = 1;
	bytes data = 2;
}

message StoreChunkResponse {
}

message RemoveChunkRequest {
	string chunk_id = 1;
}

message RemoveChunkResponse {
}

// MetadataStorage

message ChunkStorageMetadata {
	string chunk_id = 1;
	int32 size_bytes = 2;
	repeated string server = 3;
}

service MetadataStorage {
	rpc AddChunkServer(AddChunkServerRequest) returns (AddChunkServerResponse) {}
	
	rpc CreateBlob(CreateBlobRequest) returns (CreateBlobResponse) {}

	rpc GetBlobMetadata(GetBlobMetadataRequest) returns (GetBlobMetadataResponse) {}
}

message AddChunkServerRequest {
	string address = 1;
}

message AddChunkServerResponse {
}

message CreateBlobRequest {
	int32 size_bytes = 1;
	int32 chunk_size_bytes = 2;
	int32 num_replicas = 3;
}

message CreateBlobResponse {
	string blob_id = 1;
	repeated ChunkStorageMetadata chunk = 2;
}

message GetBlobMetadataRequest {
	string blob_id = 1;
}

message GetBlobMetadataResponse {
	string blob_id = 1;
	int32 size_bytes = 2;
	repeated ChunkStorageMetadata chunk = 3;
}