#include "platform_manager.hpp"

#include "game/entities/moving_platform.hpp"      // Para MovingPlatform
#include "game/gameplay/solid_actor_manager.hpp"  // Para SolidActorManager

// Constructor: recibe el SolidActorManager para registrar las plataformas
// como SolidActors (flags CARRY_ON_TOP | ONEWAY_TOP) y que los sweeps del
// Player las detecten en moveVertical/checkFalling.
PlatformManager::PlatformManager(SolidActorManager* solid_actors)
    : solid_actors_(solid_actors) {
}

// Añade una plataforma a la colección y la registra en el SolidActorManager
void PlatformManager::addPlatform(std::shared_ptr<MovingPlatform> platform) {
    solid_actors_->registerActor(platform.get());
    platforms_.push_back(std::move(platform));
}

// Elimina todas las plataformas y las desregistra del SolidActorManager
void PlatformManager::clear() {
    for (const auto& platform : platforms_) {
        solid_actors_->unregisterActor(platform.get());
    }
    platforms_.clear();
}

// Comprueba si no hay plataformas
auto PlatformManager::isEmpty() const -> bool {
    return platforms_.empty();
}

// Actualiza todas las plataformas
void PlatformManager::update(float delta_time) {
    for (const auto& platform : platforms_) {
        platform->update(delta_time);
    }
}

// Renderiza todas las plataformas
void PlatformManager::render() {
    for (const auto& platform : platforms_) {
        platform->render();
    }
}

#ifdef _DEBUG
// Solo actualiza animaciones sin mover plataformas
void PlatformManager::updateAnimations(float delta_time) {
    for (const auto& platform : platforms_) {
        platform->updateAnimation(delta_time);
    }
}

// Resetea todas las plataformas a su posición inicial
void PlatformManager::resetPositions(const std::vector<MovingPlatform::Data>& platform_data) {
    const int COUNT = std::min(static_cast<int>(platforms_.size()), static_cast<int>(platform_data.size()));
    for (int i = 0; i < COUNT; ++i) {
        platforms_[i]->resetToInitialPosition(platform_data[i]);
    }
}

// Número de plataformas
auto PlatformManager::getCount() const -> int {
    return static_cast<int>(platforms_.size());
}

// Acceso a una plataforma por índice
auto PlatformManager::getPlatform(int index) -> std::shared_ptr<MovingPlatform>& {
    return platforms_.at(index);
}

// Elimina la última plataforma (y la desregistra del SolidActorManager)
void PlatformManager::removeLastPlatform() {
    if (!platforms_.empty()) {
        solid_actors_->unregisterActor(platforms_.back().get());
        platforms_.pop_back();
    }
}
#endif
