// resource_loader.hpp - Carregador de recursos (Singleton)
// © 2026 JailDesigner
// Coordina càrrega des del paquet i/o sistema de archivos

#pragma once

#include <memory>
#include <string>
#include <vector>

#include "resource_pack.hpp"

namespace Resource {

// Singleton per gestionar la càrrega de recursos
class Loader {
    public:
        // Singleton
        static auto get() -> Loader&;

        // Inicialización
        auto initialize(const std::string& pack_file, bool enable_fallback) -> bool;

        // Càrrega de recursos
        auto loadResource(const std::string& filename) -> std::vector<uint8_t>;
        auto resourceExists(const std::string& filename) -> bool;

        // Validació
        auto validatePack() -> bool;
        [[nodiscard]] auto isPackLoaded() const -> bool;

        // Estat
        void setBasePath(const std::string& path);
        [[nodiscard]] auto getBasePath() const -> const std::string&;

        // No es pot copiar ni moure
        Loader(const Loader&) = delete;
        auto operator=(const Loader&) -> Loader& = delete;

    private:
        Loader() = default;
        ~Loader() = default;

        // Dades
        std::unique_ptr<Pack> pack_;
        bool fallback_enabled_ = false;
        std::string base_path_;

        // Funciones auxiliars
        auto loadFromFilesystem(const std::string& filename) -> std::vector<uint8_t>;
};

}  // namespace Resource
