/*
    This file is part of TON Blockchain Library.
    TON Blockchain Library is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.
    TON Blockchain Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    You should have received a copy of the GNU Lesser General Public License
    along with TON Blockchain Library.  If not, see .
    Copyright 2017-2020 Telegram Systems LLP
*/
#pragma once
#include "Torrent.h"
#include "td/utils/optional.h"
#include "td/utils/SharedSlice.h"
#include "td/db/utils/BlobView.h"
namespace ton {
class Torrent::Creator {
 public:
  struct Options {
    td::uint32 piece_size{128 * 768};
    // override default dir_name
    // should't be used in a usual workflow
    td::optional dir_name;
    std::string description;
  };
  // If path is a file create a torrent with one file in it.
  // If path is a directory, create a torrent with whole directory.
  static td::Result create_from_path(Options options, td::CSlice path);
  struct Blob {
    td::Slice name;
    td::Slice data;
  };
  static td::Result create_from_blobs(Options options, td::Span blobs);
  // This api is mostly for internal usage. One should prefer static methods
  explicit Creator(Options options) : options_(options) {
  }
  TD_WARN_UNUSED_RESULT td::Status add_blob(td::Slice name, td::Slice blob);
  TD_WARN_UNUSED_RESULT td::Status add_blob(td::Slice name, td::BlobView blob);
  TD_WARN_UNUSED_RESULT td::Status add_file(td::Slice name, td::CSlice path);
  td::Result finalize();
 private:
  td::Status init();
  Options options_;
  struct File {
    std::string name;
    td::BlobView data;
  };
  std::vector files_;
};
}  // namespace ton