#pragma once

#include <cstdint>
#include <memory>

#include "core/jail/jdraw8.hpp"
#include "game/scenes/intro_sprites_scene.hpp"
#include "game/scenes/scene.hpp"
#include "game/scenes/surface_handle.hpp"

namespace Scenes {

    // Intro "legacy" del wordmark JAILGAMES lletra a lletra + cicle de paleta.
    // Reemplaça `ModuleSequence::doIntro()`. S'activa quan
    // `Options::game.use_new_logo == false`; l'alternativa moderna és
    // `IntroNewLogoScene`.
    //
    // Flux:
    //   1. Carrega gfx/logo.gif, arranca música "music/menu.ogg", pantalla negra
    //      1000 ms.
    //   2. Revelat: 15 passos (100 o 200 ms) que van acumulant les lletres
    //      "JAILGAMES" d'esquerra a dreta amb un avió escombrant al final
    //      de la paraula. Els passos 5, 11, 13 i 15 netegen la pantalla
    //      per generar els parpelleigs finals.
    //   3. Cicle de paleta: 256 passos × 20 ms modificant els índexs 16..31.
    //   4. Espera final 200 ms.
    //   5. Transfereix el gfx_ a una `IntroSpritesScene` com a sub-escena
    //      i li delega els ticks fins que acaba (anima el prota + momia +
    //      mapa, amb 3 variants aleatòries). En acabar, setzea num_piramide
    //      = 0 per passar al menú.
    //
    // Registrada al SceneRegistry amb state_key = 255: la mateixa factory que
    // per a IntroNewLogoScene, però retornada quan `use_new_logo == false`.
    class IntroScene : public Scene {
       public:
        IntroScene();
        ~IntroScene() override;

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

       private:
        enum class Phase : std::uint8_t {
            INITIAL_WAIT,   // 1000 ms pantalla negra
            REVEAL,        // 15 passos del wordmark
            PALETTE_CYCLE,  // 256 × 20 ms mutant pal[16..31]
            FINAL_WAIT,     // 200 ms abans de la sub-escena de sprites
            SPRITES,       // tick delegat a IntroSpritesScene fins que acaba
            DONE,
        };

        void render();
        void advancePaletteCycle();

        SurfaceHandle gfx_;
        Jd8::Palette pal_{nullptr};  // propietat transferida a main_palette via SetScreenPalette
        std::unique_ptr<IntroSpritesScene> sprites_scene_;

        Phase phase_{Phase::INITIAL_WAIT};
        int phase_acc_ms_{0};
        int reveal_index_{0};
        int palette_step_{0};
    };

}  // namespace Scenes
