///
/// HybridOneFileSystemSpec.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

#pragma once

#if __has_include(<NitroModules/HybridObject.hpp>)
#include <NitroModules/HybridObject.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif

// Forward declaration of `FileDirectories` to properly resolve imports.
namespace margelo::nitro::one { struct FileDirectories; }
// Forward declaration of `FileInfo` to properly resolve imports.
namespace margelo::nitro::one { struct FileInfo; }
// Forward declaration of `FileEntry` to properly resolve imports.
namespace margelo::nitro::one { struct FileEntry; }
// Forward declaration of `FileEncoding` to properly resolve imports.
namespace margelo::nitro::one { enum class FileEncoding; }
// Forward declaration of `DiskSpace` to properly resolve imports.
namespace margelo::nitro::one { struct DiskSpace; }
// Forward declaration of `PathStat` to properly resolve imports.
namespace margelo::nitro::one { struct PathStat; }
// Forward declaration of `ListedEntry` to properly resolve imports.
namespace margelo::nitro::one { struct ListedEntry; }
// Forward declaration of `DetailedFileInfo` to properly resolve imports.
namespace margelo::nitro::one { struct DetailedFileInfo; }
// Forward declaration of `DetailedDirectoryInfo` to properly resolve imports.
namespace margelo::nitro::one { struct DetailedDirectoryInfo; }

#include "FileDirectories.hpp"
#include "FileInfo.hpp"
#include <NitroModules/Promise.hpp>
#include <string>
#include "FileEntry.hpp"
#include <vector>
#include "FileEncoding.hpp"
#include "DiskSpace.hpp"
#include "PathStat.hpp"
#include <NitroModules/ArrayBuffer.hpp>
#include "ListedEntry.hpp"
#include "DetailedFileInfo.hpp"
#include "DetailedDirectoryInfo.hpp"

namespace margelo::nitro::one {

  using namespace margelo::nitro;

  /**
   * An abstract base class for `OneFileSystem`
   * Inherit this class to create instances of `HybridOneFileSystemSpec` in C++.
   * You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
   * @example
   * ```cpp
   * class HybridOneFileSystem: public HybridOneFileSystemSpec {
   * public:
   *   HybridOneFileSystem(...): HybridObject(TAG) { ... }
   *   // ...
   * };
   * ```
   */
  class HybridOneFileSystemSpec: public virtual HybridObject {
    public:
      // Constructor
      explicit HybridOneFileSystemSpec(): HybridObject(TAG) { }

      // Destructor
      ~HybridOneFileSystemSpec() override = default;

    public:
      // Properties
      

    public:
      // Methods
      virtual FileDirectories getDirectories() = 0;
      virtual std::shared_ptr<Promise<FileInfo>> getInfo(const std::string& uri) = 0;
      virtual std::shared_ptr<Promise<std::vector<FileEntry>>> readDirectory(const std::string& uri) = 0;
      virtual std::shared_ptr<Promise<void>> makeDirectory(const std::string& uri, bool intermediates) = 0;
      virtual std::shared_ptr<Promise<void>> writeFile(const std::string& uri, const std::string& contents, FileEncoding encoding) = 0;
      virtual std::shared_ptr<Promise<void>> copy(const std::string& fromUri, const std::string& toUri) = 0;
      virtual std::shared_ptr<Promise<void>> move(const std::string& fromUri, const std::string& toUri) = 0;
      virtual std::shared_ptr<Promise<void>> remove(const std::string& uri) = 0;
      virtual std::string getBundleDirectory() = 0;
      virtual DiskSpace getDiskSpace() = 0;
      virtual PathStat pathInfo(const std::string& uri) = 0;
      virtual std::string readText(const std::string& uri) = 0;
      virtual std::shared_ptr<Promise<std::string>> readTextAsync(const std::string& uri) = 0;
      virtual std::shared_ptr<ArrayBuffer> readData(const std::string& uri) = 0;
      virtual std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> readDataAsync(const std::string& uri) = 0;
      virtual std::string readBase64(const std::string& uri) = 0;
      virtual std::shared_ptr<Promise<std::string>> readBase64Async(const std::string& uri) = 0;
      virtual void writeText(const std::string& uri, const std::string& contents, FileEncoding encoding, bool append) = 0;
      virtual std::shared_ptr<Promise<void>> writeTextAsync(const std::string& uri, const std::string& contents, FileEncoding encoding, bool append) = 0;
      virtual void writeData(const std::string& uri, const std::shared_ptr<ArrayBuffer>& bytes, bool append) = 0;
      virtual std::shared_ptr<Promise<void>> writeDataAsync(const std::string& uri, const std::shared_ptr<ArrayBuffer>& bytes, bool append) = 0;
      virtual std::shared_ptr<Promise<std::string>> fileDigest(const std::string& uri, const std::string& algorithm) = 0;
      virtual void createFileEntry(const std::string& uri, bool intermediates, bool overwrite) = 0;
      virtual void createDirectoryEntry(const std::string& uri, bool intermediates, bool overwrite, bool idempotent) = 0;
      virtual std::string createFileInDirectory(const std::string& dirUri, const std::string& name) = 0;
      virtual std::string createSubdirectory(const std::string& dirUri, const std::string& name) = 0;
      virtual void deleteEntry(const std::string& uri) = 0;
      virtual std::string renameEntry(const std::string& uri, const std::string& newName) = 0;
      virtual void copyEntry(const std::string& fromUri, const std::string& toUri, bool overwrite) = 0;
      virtual std::shared_ptr<Promise<void>> copyEntryAsync(const std::string& fromUri, const std::string& toUri, bool overwrite) = 0;
      virtual void moveEntry(const std::string& fromUri, const std::string& toUri, bool overwrite) = 0;
      virtual std::shared_ptr<Promise<void>> moveEntryAsync(const std::string& fromUri, const std::string& toUri, bool overwrite) = 0;
      virtual std::vector<ListedEntry> listEntries(const std::string& uri) = 0;
      virtual DetailedFileInfo fileDetails(const std::string& uri) = 0;
      virtual DetailedDirectoryInfo directoryDetails(const std::string& uri) = 0;
      virtual double openFile(const std::string& uri, const std::string& mode) = 0;
      virtual void closeFile(double handle) = 0;
      virtual std::shared_ptr<ArrayBuffer> readHandle(double handle, double length) = 0;
      virtual std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> readHandleAsync(double handle, double length) = 0;
      virtual void writeHandle(double handle, const std::shared_ptr<ArrayBuffer>& bytes) = 0;
      virtual std::shared_ptr<Promise<void>> writeHandleAsync(double handle, const std::shared_ptr<ArrayBuffer>& bytes) = 0;
      virtual double getHandleOffset(double handle) = 0;
      virtual void setHandleOffset(double handle, double offset) = 0;
      virtual double getHandleSize(double handle) = 0;

    protected:
      // Hybrid Setup
      void loadHybridMethods() override;

    protected:
      // Tag for logging
      static constexpr auto TAG = "OneFileSystem";
  };

} // namespace margelo::nitro::one
