#pragma once

#include <cstdint>
#include <fstream>
#include <map>
#include <string>
#include <vector>

/**
 * ResourcePack - Sistema de empaquetado de recursos para ViBe3 Physics
 *
 * Permite empaquetar todos los recursos (imágenes, etc.) en un archivo binario
 * único y ofuscado. Proporciona fallback automático a carpeta data/ si no existe pack.
 */
class ResourcePack {
public:
    ResourcePack();
    ~ResourcePack();

    // Empaquetado (usado por herramienta pack_resources)
    bool addDirectory(const std::string& dirPath, const std::string& prefix = "");
    bool savePack(const std::string& packFilePath);

    // Desempaquetado (usado por el juego)
    bool loadPack(const std::string& packFilePath);

    // Carga de recursos individuales
    struct ResourceData {
        unsigned char* data;
        size_t size;
    };
    ResourceData loadResource(const std::string& resourcePath);

    // Utilidades
    std::vector<std::string> getResourceList() const;
    size_t getResourceCount() const;
    void clear();

private:
    // Header del pack (12 bytes)
    struct PackHeader {
        char magic[4];      // "VBE3"
        uint32_t version;   // Versión del formato (1)
        uint32_t fileCount; // Número de archivos empaquetados
    };

    // Índice de un recurso (variable length)
    struct ResourceEntry {
        std::string path;   // Ruta relativa del recurso
        uint32_t offset;    // Offset en el archivo pack
        uint32_t size;      // Tamaño en bytes
        uint32_t checksum;  // Checksum simple (XOR de bytes)
    };

    // Datos internos
    std::map<std::string, ResourceEntry> resources_;
    std::ifstream packFile_;
    bool isLoaded_;

    // Funciones auxiliares
    void encryptData(unsigned char* data, size_t size);
    void decryptData(unsigned char* data, size_t size);
    uint32_t calculateChecksum(const unsigned char* data, size_t size);
    std::string normalizePath(const std::string& path);
};
