#pragma once

#include <cstdint>  // Para uint8_t
#include <memory>   // Para shared_ptr
#include <string>   // Para string
#include <vector>   // Para vector

#include "core/rendering/surface.hpp"  // Para Palette y Surface
#include "core/rendering/text.hpp"     // Para Text y Text::File
#include "game/gameplay/room.hpp"      // Para Room::Data

// Forward declarations
struct JA_Music_t;
struct JA_Sound_t;

// Estructura para almacenar ficheros de sonido y su nombre
struct SoundResource {
    std::string name;            // Nombre del sonido
    JA_Sound_t* sound{nullptr};  // Objeto con el sonido
};

// Estructura para almacenar ficheros musicales y su nombre
struct MusicResource {
    std::string name;            // Nombre de la musica
    JA_Music_t* music{nullptr};  // Objeto con la música
};

// Estructura para almacenar objetos Surface y su nombre
struct SurfaceResource {
    std::string name;                  // Nombre de la surface
    std::shared_ptr<Surface> surface;  // Objeto con la surface
};

// Estructura para almacenar objetos Palette y su nombre
struct ResourcePalette {
    std::string name;    // Nombre de la surface
    Palette palette{};   // Paleta
    bool loaded{false};  // Usado por el modo lazy para saber si ya se ha leído del disco
};

// Estructura para almacenar ficheros TextFile y su nombre
struct TextFileResource {
    std::string name;                       // Nombre del fichero
    std::shared_ptr<Text::File> text_file;  // Objeto con los descriptores de la fuente de texto
};

// Estructura para almacenar objetos Text y su nombre
struct TextResource {
    std::string name;            // Nombre del objeto
    std::shared_ptr<Text> text;  // Objeto
};

// Estructura para almacenar ficheros animaciones y su nombre
struct AnimationResource {
    std::string name;                // Nombre del fichero
    std::vector<uint8_t> yaml_data;  // Bytes del archivo YAML sin parsear
};

// Estructura para almacenar habitaciones y su nombre
struct RoomResource {
    std::string name;                  // Nombre de la habitación
    std::shared_ptr<Room::Data> room;  // Habitación
};
