#pragma once

#include <cstdint>
#include <memory>
#include <vector>

#include "game/bola.hpp"
#include "game/info.hpp"
#include "game/mapa.hpp"
#include "game/marcador.hpp"
#include "game/momia.hpp"
#include "game/prota.hpp"
#include "game/scenes/palette_fade.hpp"
#include "game/scenes/scene.hpp"

// Escena de gameplay pur. Reemplaça el vell `Go()` bloquejant amb
// l'interfície `Scenes::Scene` tick-based: `onEnter()` arranca la
// música i un fade-in, el `tick()` avança un frame (Draw + Update
// gated per Jg::shouldUpdate), i quan la partida acaba fa un fade-out
// abans de retornar el next state.
//
// Tres fases internes:
//   1. FADING_IN  — fade-in 32 passos mentre el render segueix viu.
//   2. Playing   — gameplay normal; `final_` es setja quan el prota mor
//                  o canvia de sala. `Update()` només avança cada 10 ms
//                  via `Jg::shouldUpdate` (ticker fix del jail).
//   3. FADING_OUT — fade-out 32 passos mantenint l'últim frame visible
//                  (substituïx el `JD8_FadeOut` bloquejant que feia el
//                  destructor legacy).
class ModuleGame : public Scenes::Scene {
   public:
    ModuleGame();
    ~ModuleGame() override;

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

    void onEnter() override;
    void tick(int delta_ms) override;
    [[nodiscard]] auto done() const -> bool override { return phase_ == Phase::DONE; }
    [[nodiscard]] auto nextState() const -> int override;

   private:
    enum class Phase : std::uint8_t {
        FADING_IN,
        PLAYING,
        FADING_OUT,
        DONE,
    };

    void draw();    // render a `screen`; no crida Jd8::flip (ho fa el caller)
    void update();  // gated per Jg::shouldUpdate

    void iniciarMomies();
    void applyFinalTransitions() const;  // muta Info::ctx quan final_ passa a !=0

    Phase phase_{Phase::FADING_IN};
    Scenes::PaletteFade fade_;
    Uint8 final_{0};
    Jd8::Surface gfx_{nullptr};

    std::unique_ptr<Mapa> mapa_;
    std::unique_ptr<Prota> sam_;
    std::unique_ptr<Marcador> marcador_;
    std::vector<std::unique_ptr<Momia>> momies_;
    std::unique_ptr<Bola> bola_;
};
