#pragma once

#include <cstdint>     // Para uint8_t
#include <filesystem>  // Para remove, path
#include <fstream>     // Para basic_ofstream, basic_ios, basic_ostream::write, ios, ofstream
#include <string>      // Para string, basic_string, hash, operator+, to_string, __str_hash_base
#include <vector>      // Para vector

// Helper functions para integrar ResourceLoader con el sistema existente
namespace ResourceHelper {
    // Inicializa ResourceLoader (llamar al inicio del programa)
    auto initializeResourceSystem(const std::string& pack_file = "resources.pack", bool enable_fallback = true) -> bool;

    // Cierra ResourceLoader
    void shutdownResourceSystem();

    // Carga un archivo usando ResourceLoader o fallback a filesystem
    auto loadFile(const std::string& filepath) -> std::vector<uint8_t>;

    // Verifica si un archivo debería cargarse del pack vs filesystem
    auto shouldUseResourcePack(const std::string& filepath) -> bool;

    // Convierte ruta Asset a ruta relativa para ResourceLoader
    auto getPackPath(const std::string& asset_path) -> std::string;

    // Wrappea la carga de archivos para mantener compatibilidad
    template <typename T>
    auto loadResourceFile(const std::string& asset_path, T* (*loader_func)(const char*)) -> T* {
        auto data = loadFile(asset_path);
        if (data.empty()) {
            return loader_func(asset_path.c_str());
        }

        // Crear archivo temporal para funciones que esperan path
        std::string temp_path = "/tmp/ccae_" + std::to_string(std::hash<std::string>{}(asset_path));
        std::ofstream temp_file(temp_path, std::ios::binary);
        temp_file.write(reinterpret_cast<const char*>(data.data()), data.size());
        temp_file.close();

        T* result = loader_func(temp_path.c_str());
        std::filesystem::remove(temp_path);

        return result;
    }
}  // namespace ResourceHelper