syntax = "proto3";

package agate.grpc;

import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto"; // Добавлено для HTTP mapping

option go_package = "unprism.ru/KRBL/agate/grpc";

// Сервис для управления снапшотами
service SnapshotService {
  // Получить список доступных снапшотов (краткая информация)
  rpc ListSnapshots(ListSnapshotsRequest) returns (ListSnapshotsResponse) {
    option (google.api.http) = {
      get: "/v1/snapshots"
    };
  }

  // Получить детальную информацию о снапшоте, включая список файлов с хешами
  rpc GetSnapshotDetails(GetSnapshotDetailsRequest) returns (SnapshotDetails) {
    option (google.api.http) = {
      get: "/v1/snapshots/{snapshot_id}"
    };
  }

  // Скачать конкретный файл из снапшота (потоковая передача)
  rpc DownloadFile(DownloadFileRequest) returns (stream DownloadFileResponse) {
    option (google.api.http) = {
      get: "/v1/snapshots/{snapshot_id}/files/{file_path}"
    };
  }

  // --- Методы для управления (опционально, можно не включать в публичный API клиента) ---
  // Создать новый снапшот из директории (если серверу позволено инициировать)
  // rpc CreateSnapshot(CreateSnapshotRequest) returns (Snapshot);
  // Удалить снапшот (если требуется)
  // rpc DeleteSnapshot(DeleteSnapshotRequest) returns (DeleteSnapshotResponse);
}

// Метаданные файла внутри снапшота
message FileInfo {
  string path = 1;         // Относительный путь файла внутри снапшота
  int64 size_bytes = 2;    // Размер файла в байтах
  string sha256_hash = 3;  // Хеш-сумма файла (SHA256)
  bool is_dir = 4;         // Является ли запись директорией
}

// Краткая информация о снапшоте
message SnapshotInfo {
  string id = 1;                                // Уникальный ID снапшота (UUID)
  string name = 2;                              // Имя снапшота
  string parent_id = 3;                         // ID родительского снапшота (может быть пустым)
  google.protobuf.Timestamp creation_time = 4;  // Время создания
}

// Детальная информация о снапшоте
message SnapshotDetails {
  SnapshotInfo info = 1;        // Краткая информация
  repeated FileInfo files = 2;  // Список файлов в снапшоте
}

// Запрос на получение списка снапшотов (можно добавить фильтры/пагинацию)
message ListSnapshotsRequest {
  // string filter_by_name = 1;
  // int32 page_size = 2;
  // string page_token = 3;
}

// Ответ со списком снапшотов
message ListSnapshotsResponse {
  repeated SnapshotInfo snapshots = 1;
  // string next_page_token = 2;
}

// Запрос на получение деталей снапшота
message GetSnapshotDetailsRequest {
  string snapshot_id = 1; // ID нужного снапшота
}

// Запрос на скачивание файла
message DownloadFileRequest {
  string snapshot_id = 1; // ID снапшота
  string file_path = 2;   // Путь к файлу внутри снапшота
}

// Ответ (часть файла) при скачивании
message DownloadFileResponse {
  bytes chunk_data = 1; // Кусочек данных файла
}

// --- Сообщения для опциональных методов управления ---
/*
message CreateSnapshotRequest {
  string source_path = 1; // Путь к директории на сервере
  string name = 2;
  string parent_id = 3; // Опционально
}

message DeleteSnapshotRequest {
  string snapshot_id = 1;
}

message DeleteSnapshotResponse {
  bool success = 1;
}
*/