#include "core/system/demo.hpp"

#include <SDL3/SDL.h>  // Para SDL_IOStream, SDL_IOFromConstMem, SDL_IOFromFile, SDL_ReadIO, SDL_WriteIO, SDL_CloseIO

#include <iostream>   // Para std::cout
#include <stdexcept>  // Para runtime_error

#include "core/resources/resource_helper.hpp"  // Para ResourceHelper
#include "utils/utils.hpp"                     // Para getFileName

// Carga el fichero de datos para la demo
auto loadDemoDataFromFile(const std::string& file_path) -> DemoData {
    DemoData dd;

    SDL_IOStream* file = nullptr;

    // Intentar cargar desde ResourceHelper primero
    auto resource_data = ResourceHelper::loadFile(file_path);
    if (!resource_data.empty()) {
        file = SDL_IOFromConstMem(resource_data.data(), resource_data.size());
    } else {
        // Fallback a filesystem directo
        file = SDL_IOFromFile(file_path.c_str(), "r+b");
    }

    if (file == nullptr) {
        std::cout << "Error: Fichero no encontrado " << file_path << '\n';
        throw std::runtime_error("Fichero no encontrado: " + file_path);
    }

    // Lee todos los datos del fichero y los deja en el destino
    for (int i = 0; i < TOTAL_DEMO_DATA; ++i) {
        DemoKeys dk = DemoKeys();
        SDL_ReadIO(file, &dk, sizeof(DemoKeys));
        dd.push_back(dk);
    }

    // Cierra el fichero
    SDL_CloseIO(file);

    return dd;
}

#ifdef RECORDING
// Guarda el fichero de datos para la demo
bool saveDemoFile(const std::string& file_path, const DemoData& dd) {
    auto success = true;
    auto file = SDL_IOFromFile(file_path.c_str(), "w+b");

    if (file) {
        // Guarda los datos
        for (const auto& data : dd) {
            if (SDL_WriteIO(file, &data, sizeof(DemoKeys)) != sizeof(DemoKeys)) {
                std::cout << "Error al escribir el fichero " << getFileName(file_path) << '\n';
                success = false;
                break;
            }
        }
        // Cierra el fichero
        SDL_CloseIO(file);
    } else {
        std::cout << "Error: Unable to save " << getFileName(file_path) << " file! " << SDL_GetError() << '\n';
        success = false;
    }

    return success;
}
#endif  // RECORDING