//  SPDX-License-Identifier: MIT
//
//  ES-DE Frontend
//  ResourceManager.h
//
//  Handles the application resources (fonts, graphics, sounds etc.).
//  Loading and unloading of these files are done here.
//

#ifndef ES_CORE_RESOURCES_RESOURCE_MANAGER_H
#define ES_CORE_RESOURCES_RESOURCE_MANAGER_H

#include <list>
#include <memory>
#include <string>

#include <SDL2/SDL_rwops.h>

// The ResourceManager exists to:
// Allow loading resources embedded into the executable like an actual file.
// Allow embedded resources to be optionally remapped to actual files for further customization.

struct ResourceData {
    const std::shared_ptr<unsigned char> ptr;
    const size_t length;
};

class ResourceManager;

class IReloadable
{
public:
    virtual void unload(ResourceManager& rm) = 0;
    virtual void reload(ResourceManager& rm) = 0;
};

class ResourceManager
{
public:
    static ResourceManager& getInstance();

    void addReloadable(std::weak_ptr<IReloadable> reloadable);

    void unloadAll();
    void reloadAll();

    std::string getResourcePath(const std::string& path, bool terminateOnFailure = true) const;
    const ResourceData getFileData(const std::string& path) const;
    bool fileExists(const std::string& path) const;

private:
    ResourceManager() noexcept {}

    ResourceData loadFile(const std::string& path) const;
    ResourceData loadFile(SDL_RWops* resFile) const;

    std::list<std::weak_ptr<IReloadable>> mReloadables;
};

#endif // ES_CORE_RESOURCES_RESOURCE_MANAGER_H