// scene.hpp - Interfaz base para escenas del juego
// © 2026 JailDesigner
//
// El frame loop vive en Director, no en cada escena. Cada escena implementa
// estos cuatro métodos y el Director los llama en orden por frame:
//   handleEvent(ev)   por cada evento SDL (tras los eventos globales)
//   update(dt)        lógica
//   draw()            pintado (entre clear y present del Director)
//   isFinished()      consultar transición pendiente
//
// Cuando una escena pide transición (vía context_.setNextScene(...)),
// isFinished() debe pasar a true y el Director destruye la escena para
// construir la siguiente.

#pragma once

#include <SDL3/SDL.h>

class Scene {
    public:
        Scene() = default;
        virtual ~Scene() = default;

        Scene(const Scene&) = delete;
        auto operator=(const Scene&) -> Scene& = delete;
        Scene(Scene&&) = delete;
        auto operator=(Scene&&) -> Scene& = delete;

        // Eventos específicos de la escena. Los globales (window resize,
        // F1-F4, ESC, QUIT) los procesa GlobalEvents::handle antes.
        virtual void handleEvent(const SDL_Event& event) = 0;

        // Lógica de la escena. delta_time en segundos, ya capeado por el Director.
        virtual void update(float delta_time) = 0;

        // Pintar la escena (entre clear y present del Director).
        virtual void draw() = 0;

        // True cuando la escena ha pedido transición.
        [[nodiscard]] virtual auto isFinished() const -> bool = 0;
};
