#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 "moderna" del logo Jailgames amb revelat lletra-a-lletra +
    // ciclo de paleta final. Reemplaça `ModuleSequence::doIntroNewLogo()`.
    //
    // Flux:
    //   1. Carrega gfx/logo_new.gif, arranca música "music/menu.ogg" i posa
    //      la paleta directament (sense fade-in). Mostra pantalla negra 1s.
    //   2. Revelat: 9 lletres × 2 frames (amb cursor / sense cursor), 150 ms
    //      cada frame.
    //   3. Logo complet amb cursor fix 200 ms.
    //   4. Cicle de paleta de 256 passos modificant índexs 16–31 cada 20 ms.
    //   5. Espera final 20 ms.
    //   6. 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, amb una factory
    // condicional: només s'activa si `Options::game.use_new_logo == true`.
    // Si és false, la factory retorna nullptr i el gameFiberEntry cau al
    // path legacy (`ModuleSequence::doIntro()` vell).
    class IntroNewLogoScene : public Scene {
       public:
        IntroNewLogoScene();
        ~IntroNewLogoScene() 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,          // pantalla negra 1000 ms
            REVEALING,        // 9 × 2 frames × 150 ms cada un
            FULL_LOGO_FLASH,  // logo complet + cursor, 200 ms
            PALETTE_CYCLE,    // 256 passos × 20 ms modificant paleta
            FINAL_WAIT,       // 20 ms final
            SPRITES,          // tick delegat a IntroSpritesScene fins que acaba
            DONE,
        };

        void render();
        void advancePaletteCycle();
        // Helpers per a `tick()` — extrets per reduir complexitat cognitiva.
        void advanceRevealing(int delta_ms);
        void advancePaletteStep(int delta_ms);
        void advanceSpritesPhase(int delta_ms);

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

        Phase phase_{Phase::INITIAL};
        int phase_acc_ms_{0};
        int reveal_letter_{0};
        bool reveal_cursor_visible_{true};
        int palette_step_{0};
    };

}  // namespace Scenes
