#include "bullet.h"
#include <SDL3/SDL_rect.h> // Para SDL_FRect
#include <memory>          // Para unique_ptr, make_unique, shared_ptr
#include "param.h"         // Para Param, ParamGame, param
#include "sprite.h"        // Para Sprite
class Texture;             // lines 5-5

// Constructor
Bullet::Bullet(float x, float y, BulletType bullet_type, bool powered_up, int owner, std::shared_ptr<Texture> texture)
    : sprite_(std::make_unique<Sprite>(texture, SDL_FRect{x, y, BULLET_WIDTH_, BULLET_HEIGHT_})),
      pos_x_(x),
      pos_y_(y),
      bullet_type_(bullet_type),
      owner_(owner)
{
    vel_x_ = (bullet_type_ == BulletType::LEFT)    ? BULLET_VEL_X_LEFT_
             : (bullet_type_ == BulletType::RIGHT) ? BULLET_VEL_X_RIGHT_
                                                   : 0;

    int sprite_offset = powered_up ? 3 : 0;
    int offset = (static_cast<int>(bullet_type) + sprite_offset) * BULLET_WIDTH_;
    sprite_->setSpriteClip(offset, 0, BULLET_WIDTH_, BULLET_HEIGHT_);

    collider_.r = BULLET_WIDTH_ / 2;
    shiftColliders();
}

// Implementación de render (llama al render del sprite_)
void Bullet::render()
{
    sprite_->render();
}

// Implementación del movimiento usando BulletMoveStatus
BulletMoveStatus Bullet::move()
{
    pos_x_ += vel_x_;
    if (pos_x_ < param.game.play_area.rect.x - BULLET_WIDTH_ || pos_x_ > param.game.play_area.rect.w)
    {
        disable();
        return BulletMoveStatus::OUT;
    }

    pos_y_ += BULLET_VEL_Y_;
    if (pos_y_ < param.game.play_area.rect.y - BULLET_HEIGHT_)
    {
        disable();
        return BulletMoveStatus::OUT;
    }

    shiftSprite();
    shiftColliders();

    return BulletMoveStatus::OK;
}

bool Bullet::isEnabled() const
{
    return bullet_type_ != BulletType::NONE;
}

void Bullet::disable()
{
    bullet_type_ = BulletType::NONE;
}

int Bullet::getOwner() const
{
    return owner_;
}

Circle &Bullet::getCollider()
{
    return collider_;
}

void Bullet::shiftColliders()
{
    collider_.x = pos_x_ + collider_.r;
    collider_.y = pos_y_ + collider_.r;
}

void Bullet::shiftSprite()
{
    sprite_->setX(pos_x_);
    sprite_->setY(pos_y_);
}
