// border.hpp - Border del playfield amb estat (desplaçaments i flash per impactes)
// © 2026 JailDesigner
//
// Substitueix el `drawMargins()` inline de GameScene. Cada un dels 4 costats
// té estat propi (desplaçament perpendicular outward + intensitat de flash blanc)
// que decau cap a 0. Esdeveniments externs (col·lisions contra els bounds, etc.)
// criden `bumpAt()` per generar reaccions.

#pragma once

#include <array>
#include <cstdint>

#include "core/rendering/render_context.hpp"
#include "core/types.hpp"

namespace Graphics {

    class Border {
       public:
        explicit Border(Rendering::Renderer* renderer);

        // Decae desplaçaments i flash cap a 0.
        void update(float delta_time);

        // Dibuixa els 4 costats amb el seu estat actual.
        void draw() const;

        // Aplica un bump al costat més proper al punt de contacte.
        // strength ∈ [0, 1]; valors superiors es retallen.
        void bumpAt(Vec2 contact_point, float strength);

       private:
        enum : std::uint8_t {
            SIDE_TOP = 0,
            SIDE_RIGHT = 1,
            SIDE_BOTTOM = 2,
            SIDE_LEFT = 3,
            SIDE_COUNT = 4
        };

        struct SideState {
            float displacement_px{0.0F};  // outward (sempre ≥ 0); el flash es deriva d'aquí
        };

        void applyBump(int side_idx, float strength);

        Rendering::Renderer* renderer_;
        std::array<SideState, SIDE_COUNT> sides_{};
    };

}  // namespace Graphics
