// resource_helper.cpp - Implementació de funcions d'ajuda
// © 2025 Port a C++20 amb SDL3

#include "resource_helper.hpp"

#include <algorithm>
#include <iostream>

#include "resource_loader.hpp"

namespace Resource::Helper {

// Inicialitzar el sistema de recursos
bool initializeResourceSystem(const std::string& pack_file, bool fallback) {
    return Loader::get().initialize(pack_file, fallback);
}

// Carregar un fitxer
std::vector<uint8_t> loadFile(const std::string& filepath) {
    // Normalitzar la ruta
    std::string normalized = normalizePath(filepath);

    // Carregar del sistema de recursos
    return Loader::get().loadResource(normalized);
}

// Comprovar si existeix un fitxer
bool fileExists(const std::string& filepath) {
    std::string normalized = normalizePath(filepath);
    return Loader::get().resourceExists(normalized);
}

// Obtenir ruta normalitzada per al paquet
// Elimina prefixos "data/", rutes absolutes, etc.
std::string getPackPath(const std::string& asset_path) {
    std::string path = asset_path;

    // Eliminar rutes absolutes (detectar / o C:\ al principi)
    if (!path.empty() && path[0] == '/') {
        // Buscar "data/" i agafar el que ve després
        size_t data_pos = path.find("/data/");
        if (data_pos != std::string::npos) {
            path = path.substr(data_pos + 6);  // Saltar "/data/"
        }
    }

    // Eliminar "./" i "../" del principi
    while (path.starts_with("./")) {
        path = path.substr(2);
    }
    while (path.starts_with("../")) {
        path = path.substr(3);
    }

    // Eliminar "data/" del principi
    if (path.starts_with("data/")) {
        path = path.substr(5);
    }

    // Eliminar "Resources/" (macOS bundles)
    if (path.starts_with("Resources/")) {
        path = path.substr(10);
    }

    // Convertir barres invertides a normals
    std::ranges::replace(path, '\\', '/');

    return path;
}

// Normalitzar ruta (alias de getPackPath)
std::string normalizePath(const std::string& path) {
    return getPackPath(path);
}

// Comprovar si hi ha paquet carregat
bool isPackLoaded() {
    return Loader::get().isPackLoaded();
}

}  // namespace Resource::Helper
