#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 {

    // 3 slides narratius amb scroll d'entrada + espera + transició amb
    // fade-out. Reemplaça `ModuleSequence::doSlides()`.
    //
    // Tria d'asset segons context:
    //   - num_piramide == 7 i diners < 200: gfx/intro2.gif + música "music/final.ogg"
    //   - num_piramide == 7 i diners >= 200: gfx/intro3.gif + música "music/final.ogg"
    //   - altre cas (num_piramide == 1): gfx/intro.gif, sense música nova
    //
    // Flux:
    //   SLIDE1_ENTER (1600 ms scroll dreta→centre, easing outCubic)
    //   → SLIDE1_HOLD (4600 ms)
    //   → FADE_OUT1 + clear + reset paleta
    //   → SLIDE2_ENTER (1600 ms scroll esquerra→centre)
    //   → SLIDE2_HOLD (4600 ms)
    //   → FADE_OUT2 + clear + reset paleta
    //   → SLIDE3_ENTER (1600 ms scroll dreta→centre)
    //   → SLIDE3_HOLD (4600 ms)
    //   → FADE_FINAL (Ja::fadeOutMusic si num_piramide != 7 + fade paleta)
    //   → Done
    //
    // Qualsevol tecla salta directament a FADE_FINAL (sense cortar la música
    // si hem entrat per num_piramide==7, per fidelitat al vell).
    //
    // NextState:
    //   - num_piramide==7 al entrar → num_piramide=8 + return 1 (a Credits)
    //   - altre cas → return 0 (entra al ModuleGame)
    class SlidesScene : public Scene {
       public:
        SlidesScene() = default;
        ~SlidesScene() 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 next_state_; }

       private:
        enum class Phase : std::uint8_t {
            SLIDE1_ENTER,
            SLIDE1_HOLD,
            FADE_OUT1,
            SLIDE2_ENTER,
            SLIDE2_HOLD,
            FADE_OUT2,
            SLIDE3_ENTER,
            SLIDE3_HOLD,
            FADE_FINAL,
            DONE,
        };

        // Pinta un slide amb desplaçament horitzontal. `slide_idx` = 0..2
        // (correspon a la franja 65x65 a y = 0, 65, 130 dins de gfx_).
        // `pos_x` = desplaçament, amb clipping manual quan surt de pantalla.
        void drawSlide(int slide_idx, int pos_x);
        void restorePalette();
        void beginFinalFade();
        // Helpers per a `tick()` — extrets per reduir complexitat cognitiva.
        void triggerSkip();
        void tickSlideEnter(int delta_ms);
        void tickHoldIntermediate(int delta_ms);
        void tickFadeOutIntermediate(int delta_ms);
        void tickFinalFade(int delta_ms);

        SurfaceHandle gfx_;
        Jd8::Palette pal_aux_{nullptr};     // còpia "neta" que preservem
        Jd8::Palette pal_active_{nullptr};  // propietat transferida a main_palette
        PaletteFade fade_;

        Phase phase_{Phase::SLIDE1_ENTER};
        int phase_acc_ms_{0};
        int num_piramide_at_start_{1};
        int next_state_{0};
        bool skip_triggered_{false};
    };

}  // namespace Scenes
