// bullet.hpp - Clase para projectils de la ship
// © 2026 JailDesigner

#pragma once
#include <SDL3/SDL.h>

#include <cstdint>

#include "core/defaults.hpp"
#include "core/entities/entity.hpp"
#include "core/types.hpp"

class Bullet : public Entities::Entity {
   public:
    Bullet()
        : Entity(nullptr) {}
    explicit Bullet(Rendering::Renderer* renderer);

    void init() override;
    void disparar(const Vec2& position, float angle, uint8_t owner_id);
    void update(float delta_time) override;
    void postUpdate(float delta_time) override;
    void draw() const override;

    // Override: Interfaz de Entity
    [[nodiscard]] auto isActive() const -> bool override { return is_active_; }

    // Override: Interfaz de colisión (gameplay-level: PLAYAREA bounds-check)
    [[nodiscard]] auto getCollisionRadius() const -> float override {
        return Defaults::Entities::BULLET_RADIUS;
    }
    [[nodiscard]] auto isCollidable() const -> bool override {
        return is_active_;
    }

    // Getters (API pública sin cambios)
    [[nodiscard]] auto getOwnerId() const -> uint8_t { return owner_id_; }
    // Posició al final del frame anterior, per a CCD segment-vs-cercle.
    [[nodiscard]] auto getPrevPosition() const -> const Vec2& { return prev_position_; }
    void desactivar();

   private:
    // Miembros específicos de Bullet (heredados: renderer_, shape_, center_, angle_, brightness_, body_).
    // Inicializados en la declaración para que tanto el ctor por defecto como el que toma renderer
    // dejen el objeto en estado coherente (proyectil inactivo, sin owner).
    bool is_active_{false};
    uint8_t owner_id_{0};   // 0=P1, 1=P2
    Vec2 prev_position_{};  // Posició al final del frame anterior (per a swept collision)
};
