#pragma once

#include "Result.hpp"
#include "types.hpp"

#include <Geode/DefaultInclude.hpp>
#include <fs/filesystem.hpp>
#include <string>

namespace geode::utils::file {
    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<std::string>
    readString(std::string const& path);
    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<std::string>
    readString(std::wstring const& path);
    GEODE_DLL Result<std::string> readString(ghc::filesystem::path const& path);
    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<byte_array> readBinary(
        std::string const& path
    );
    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<byte_array> readBinary(
        std::wstring const& path
    );
    GEODE_DLL Result<byte_array> readBinary(ghc::filesystem::path const& path);

    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<> writeString(
        std::string const& path, std::string const& data
    );
    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<> writeString(
        std::wstring const& path, std::string const& data
    );
    GEODE_DLL Result<> writeString(ghc::filesystem::path const& path, std::string const& data);
    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<> writeBinary(
        std::string const& path, byte_array const& data
    );
    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<> writeBinary(
        std::wstring const& path, byte_array const& data
    );
    GEODE_DLL Result<> writeBinary(ghc::filesystem::path const& path, byte_array const& data);

    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<> createDirectory(
        std::string const& path
    );
    GEODE_DLL Result<> createDirectory(ghc::filesystem::path const& path);
    [[deprecated("Use the ghc::filesystem::path version")]] GEODE_DLL Result<> createDirectoryAll(
        std::string const& path
    );
    GEODE_DLL Result<> createDirectoryAll(ghc::filesystem::path const& path);
    GEODE_DLL Result<std::vector<std::string>> listFiles(std::string const& path);
    GEODE_DLL Result<std::vector<std::string>> listFilesRecursively(std::string const& path);

    /**
     * Unzip file to directory
     * @param from File to unzip
     * @param to Directory to unzip to
     * @returns Ok on success, Error on error
     */
    GEODE_DLL Result<> unzipTo(ghc::filesystem::path const& from, ghc::filesystem::path const& to);
}