#include "core/rendering/sprite/smart_sprite.hpp"

#include "core/rendering/sprite/moving_sprite.hpp"  // Para MovingSprite

// Actualiza la posición y comprueba si ha llegado a su destino (time-based)
void SmartSprite::update(float delta_time) {
    if (enabled_) {
        MovingSprite::update(delta_time);
        checkMove();
        checkFinished(delta_time);
    }
}

// Dibuja el sprite
void SmartSprite::render() {
    if (enabled_) {
        MovingSprite::render();
    }
}

// Comprueba el movimiento
void SmartSprite::checkMove() {
    // Comprueba si se desplaza en el eje X hacia la derecha
    if (getAccelX() > 0 || getVelX() > 0) {
        // Comprueba si ha llegado al destino
        if (getPosX() > dest_x_) {
            // Lo coloca en posición
            setPosX(dest_x_);

            // Lo detiene
            setVelX(0.0F);
            setAccelX(0.0F);
        }
    }
    // Comprueba si se desplaza en el eje X hacia la izquierda
    else if (getAccelX() < 0 || getVelX() < 0) {
        // Comprueba si ha llegado al destino
        if (getPosX() < dest_x_) {
            // Lo coloca en posición
            setPosX(dest_x_);

            // Lo detiene
            setVelX(0.0F);
            setAccelX(0.0F);
        }
    }

    // Comprueba si se desplaza en el eje Y hacia abajo
    if (getAccelY() > 0 || getVelY() > 0) {
        // Comprueba si ha llegado al destino
        if (getPosY() > dest_y_) {
            // Lo coloca en posición
            setPosY(dest_y_);

            // Lo detiene
            setVelY(0.0F);
            setAccelY(0.0F);
        }
    }
    // Comprueba si se desplaza en el eje Y hacia arriba
    else if (getAccelY() < 0 || getVelY() < 0) {
        // Comprueba si ha llegado al destino
        if (getPosY() < dest_y_) {
            // Lo coloca en posición
            setPosY(dest_y_);

            // Lo detiene
            setVelY(0.0F);
            setAccelY(0.0F);
        }
    }
}

// Comprueba si ha terminado (time-based)
void SmartSprite::checkFinished(float delta_time) {
    // Comprueba si ha llegado a su destino
    on_destination_ = (getPosX() == dest_x_ && getPosY() == dest_y_);

    if (on_destination_) {
        if (finished_delay_ms_ == 0.0F) {
            finished_ = true;
        } else {
            finished_timer_ += delta_time;
            if (finished_timer_ >= finished_delay_ms_) {
                finished_ = true;
            }
        }
    }
}