#pragma once

// Interfície base per a una escena (cinemàtica, menú, banner, etc.) del
// joc. Una escena és una unitat autònoma amb un `tick(delta_ms)` no
// bloquejant. El Director la fa avançar cada frame fins que `done()` és
// cert, i llavors consulta `nextState()` per decidir la següent.
//
// Contracte:
//  - `tick(delta_ms)` no pot bloquejar ni cridar Jd8::flip — el caller
//    s'encarrega de fer el flip després del tick.
//  - `done()` es consulta just després de cada tick.
//  - Els assets són propietat de l'escena (normalment via SurfaceHandle)
//    i s'alliberen al destructor.
//  - `onEnter()` es crida una vegada just abans del primer tick. És el
//    moment bo per a arrancar música, disparar un fade-in, etc.

namespace Scenes {

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

        virtual void onEnter() {}

        virtual void tick(int delta_ms) = 0;

        [[nodiscard]] virtual auto done() const -> bool = 0;

        // Valor retornat al caller quan l'escena acaba — equivalent al int
        // que retornaven les velles funcions `Go()` de ModuleSequence:
        //   1 = continuar amb la següent escena segons Info::ctx
        //   0 = entrar al gameplay (ModuleGame)
        //  -1 = eixir del joc
        [[nodiscard]] virtual auto nextState() const -> int { return 1; }
    };

}  // namespace Scenes
