syntax = "proto3";

package proto;

option csharp_namespace = "DysonNetwork.Shared.Proto";

import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/duration.proto";

// CloudFile represents a reference to a file stored in cloud storage.
// It contains metadata about the file that won't change, helping to reduce database load.
message CloudFile {
  // Unique identifier for the file
  string id = 1;

  // Original name of the file
  string name = 2;

  // The metadata uses JSON bytes to store to keep the data structure over gRPC
  // File metadata (e.g., dimensions, duration, etc.)
  bytes file_meta = 3;
  // User-defined metadata
  bytes user_meta = 4;
  optional bytes sensitive_marks = 12;

  // MIME type of the file
  string mime_type = 5;

  // File content hash (e.g., MD5, SHA-256)
  string hash = 6;

  // File size in bytes
  int64 size = 7;

  // Indicates if the file is stored with compression
  bool has_compression = 8;

  // URL to access the file
  string url = 9;

  // Content type of the file
  string content_type = 10;

  // When the file was uploaded
  google.protobuf.Timestamp uploaded_at = 11;

  // Image/Video width (optional, for media files)
  optional int32 width = 13;

  // Image/Video height (optional, for media files)
  optional int32 height = 14;

  // Blurhash for placeholder (optional, for images)
  optional string blurhash = 15;

  // Nested file object containing additional metadata
  optional FileObject object = 16;
}

// FileObject represents the actual file data stored in cloud storage.
// It contains metadata about the file content that may be shared across multiple references.
message FileObject {
  // Unique identifier for the file object
  string id = 1;

  // File size in bytes
  int64 size = 2;

  // File metadata (e.g., dimensions, duration, etc.) stored as JSON bytes
  bytes meta = 3;

  // MIME type of the file
  string mime_type = 4;

  // File content hash (e.g., MD5, SHA-256)
  string hash = 5;

  // Indicates if the file is stored with compression
  bool has_compression = 6;

  // Indicates if the file has a thumbnail
  bool has_thumbnail = 7;
}

// Service for file operations
service FileService {
  // Get file reference by ID
  rpc GetFile(GetFileRequest) returns (CloudFile);
  rpc GetFileBatch(GetFileBatchRequest) returns (GetFileBatchResponse);

  // Update an existing file reference
  rpc UpdateFile(UpdateFileRequest) returns (CloudFile);

  // Delete a file reference
  rpc DeleteFile(DeleteFileRequest) returns (google.protobuf.Empty);

  // Purge cache for a file
  rpc PurgeCache(PurgeCacheRequest) returns (google.protobuf.Empty);

  // Set file as publicly readable (anyone read permission)
  rpc SetFilePublic(SetFilePublicRequest) returns (google.protobuf.Empty);

  // Remove public read permission
  rpc UnsetFilePublic(UnsetFilePublicRequest) returns (google.protobuf.Empty);
}

// Request message for GetFile
message GetFileRequest {
  string id = 1;
}

message GetFileBatchRequest {
  repeated string ids = 1;
}

message GetFileBatchResponse {
  repeated CloudFile files = 1;
}

// Request message for UpdateFile
message UpdateFileRequest {
  CloudFile file = 1;
  google.protobuf.FieldMask update_mask = 2;
}

message FileMetadata {
  string file_id = 1;
  string file_name = 2;
  string content_type = 3;
  string account_id = 4;
}

message UploadMetadata {
  string file_id = 1;
  string target_remote = 2;
  string suffix = 3;
  string content_type = 4;
}

message DeleteFileRequest {
  string id = 1;
  bool purge = 2;
}

message PurgeCacheRequest {
  string file_id = 1;
}

message SetFilePublicRequest {
  string file_id = 1;
}

message UnsetFilePublicRequest {
  string file_id = 1;
}
