// curtain.hpp - Cortinilla negra per a transicions d'escena
// © 2026 JailDesigner
//
// Tela negra a pantalla completa que es mou SEMPRE cap avall:
//   - cover():  cau des de dalt fins a tapar-ho tot (queda negre).
//   - reveal(): segueix caient i surt per baix, deixant veure l'escena.
// Una escena la posseeix, l'actualitza cada frame i la dibuixa l'ÚLTIM (per
// damunt de tot). En repòs (no arrencada o reveal acabada) el draw() és no-op.

#pragma once

#include "core/rendering/render_context.hpp"

namespace Graphics {

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

        // Tela que cau des de dalt fins a tapar tota la pantalla en 'duration' s.
        void cover(float duration);

        // Tela que segueix caient i surt per baix (destapa) en 'duration' s.
        void reveal(float duration);

        // Avança el temporitzador intern.
        void update(float delta_time);

        // Dibuixa la tela negra a la seva posició vertical actual. No-op si no
        // queda res visible.
        void draw() const;

        // Cert quan el moviment actual ha acabat (o no s'ha arrencat mai).
        [[nodiscard]] auto isDone() const -> bool;

       private:
        // Posició actual del caire superior de la tela (píxels lògics).
        [[nodiscard]] auto topY() const -> float;

        Rendering::Renderer* renderer_;
        float from_{0.0F};
        float to_{0.0F};
        float duration_{0.0F};
        float elapsed_{0.0F};
        bool active_{false};
    };

}  // namespace Graphics
