#pragma once

#include <cstdint>

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

namespace Scenes {

    // Pre-Secreta. Reemplaça `ModuleSequence::doSecreta()`.
    //
    // Flux:
    //   1. Arranca música "music/secreta.ogg" i fa fade-out de la paleta anterior.
    //   2. Carrega gfx/tomba1.gif + paleta i pinta un scroll vertical doble
    //      (dos blits solapats, un a velocitat meitat que l'altre) durant
    //      ~2.5 s + ~2.5 s de pausa.
    //   3. Swap a gfx/tomba2.gif + reset de paleta, scroll vertical del segon
    //      asset (~1.9 s + ~1.9 s de pausa).
    //   4. ClearScreen a 0, set colors 253/254 a vermell fosc (12,11,11)
    //      i pinta un revelat horitzontal (~1.6 s + ~1.6 s de pausa).
    //   5. "Red pulse": anima els colors 253/254 incrementant el canal R
    //      de 12 a 62 durant ~1 s (+ ~1 s de pausa).
    //   6. FadeOut + Ja::fadeOutMusic(250).
    //   7. Retorna nextState=0 per entrar al ModuleGame amb num_piramide=6.
    //
    // Registrada al SceneRegistry amb state_key = 6.
    class SecretaScene : public Scene {
       public:
        SecretaScene() = default;
        ~SecretaScene() override;

        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 { return 0; }

       private:
        enum class Phase : std::uint8_t {
            INITIAL_FADE_OUT,
            TOMBA1_SCROLL_IN,
            TOMBA1_HOLD,
            TOMBA2_SCROLL_IN,
            TOMBA2_HOLD,
            TOMBA2_REVEAL,
            TOMBA2_REVEAL_HOLD,
            RED_PULSE,
            RED_PULSE_HOLD,
            FINAL_FADE_OUT,
            DONE,
        };

        void swapToTomba2();
        static void beginRedPulseSetup();
        void beginFinalFade();

        SurfaceHandle gfx_;
        Jd8::Palette pal_aux_{nullptr};
        Jd8::Palette pal_active_{nullptr};  // propietat transferida a main_palette
        PaletteFade fade_;

        Phase phase_{Phase::INITIAL_FADE_OUT};
        int phase_acc_ms_{0};
        bool skip_triggered_{false};
    };

}  // namespace Scenes
