#pragma once

#include <cstddef>  // Para size_t
#include <cstdint>  // Para uint8_t
#include <memory>   // Para unique_ptr
#include <string>   // Para string, basic_string
#include <vector>   // Para vector

class ResourcePack;

class ResourceLoader {
   private:
    static std::unique_ptr<ResourceLoader> instance;
    ResourcePack* resource_pack_;
    std::string pack_path_;
    bool fallback_to_files_;

    ResourceLoader();

   public:
    static auto getInstance() -> ResourceLoader&;
    ~ResourceLoader();

    auto initialize(const std::string& pack_file, bool enable_fallback = true) -> bool;
    void shutdown();

    auto loadResource(const std::string& filename) -> std::vector<uint8_t>;
    auto resourceExists(const std::string& filename) -> bool;

    void setFallbackToFiles(bool enable) { fallback_to_files_ = enable; }
    [[nodiscard]] auto getFallbackToFiles() const -> bool { return fallback_to_files_; }

    [[nodiscard]] auto getLoadedResourceCount() const -> size_t;
    [[nodiscard]] auto getAvailableResources() const -> std::vector<std::string>;

   private:
    static auto loadFromFile(const std::string& filename) -> std::vector<uint8_t>;
    static auto getDataPath(const std::string& filename) -> std::string;
};
