// resource_loader.hpp
// Singleton resource loader for managing pack and filesystem access

#ifndef RESOURCE_LOADER_HPP
#define RESOURCE_LOADER_HPP

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

#include "resource_pack.hpp"

namespace Resource {

// Singleton class for loading resources from pack or filesystem
class Loader {
    public:
        // Get singleton instance
        static auto get() -> Loader&;

        // Initialize with a pack file (optional)
        auto initialize(const std::string& pack_file, bool enable_fallback = true) -> bool;

        // Load a resource (tries pack first, then filesystem if fallback enabled)
        auto loadResource(const std::string& filename) -> std::vector<uint8_t>;

        // Check if a resource exists
        auto resourceExists(const std::string& filename) -> bool;

        // Check if pack is loaded
        [[nodiscard]] auto isPackLoaded() const -> bool;

        // Get pack statistics
        [[nodiscard]] auto getPackResourceCount() const -> size_t;

        // Validate pack integrity (checksum)
        [[nodiscard]] auto validatePack() const -> bool;

        // Load assets.yaml from pack (for release builds)
        [[nodiscard]] auto loadAssetsConfig() const -> std::string;

        // Cleanup
        void shutdown();

        // Disable copy/move
        Loader(const Loader&) = delete;
        auto operator=(const Loader&) -> Loader& = delete;
        Loader(Loader&&) = delete;
        auto operator=(Loader&&) -> Loader& = delete;

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

        // Load from filesystem
        static auto loadFromFilesystem(const std::string& filepath) -> std::vector<uint8_t>;

        // Check if file exists on filesystem
        static auto fileExistsOnFilesystem(const std::string& filepath) -> bool;

        // Member data
        std::unique_ptr<Pack> resource_pack_;
        bool fallback_to_files_{true};
        bool initialized_{false};
};

}  // namespace Resource

#endif  // RESOURCE_LOADER_HPP
