#pragma once

#include <cstdint>

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

namespace Scenes {

    // Crèdits finals del joc. Reemplaça `ModuleSequence::doCredits()`.
    //
    // Flux:
    //   1. Carrega gfx/final.gif (sprites de crèdits) i gfx/finals.gif (fons).
    //   2. Mostra els crèdits amb scroll vertical de 2 columnes durant
    //      ~62 segons (contador 0..3100 × 20 ms).
    //   3. Si `Info::ctx.diamants == 16`, pinta addicionalment un parallax
    //      de 4 capes amb cotxe animat (8 frames). Si no, 2 blits fixos.
    //   4. Al acabar (per tecla o per contador), crea el fitxer `trick.ini`
    //      i activa `Info::ctx.nou_personatge`.
    //   5. Fade-out de paleta. Torna a la intro (num_piramide = 255).
    //
    // Registrada al SceneRegistry amb state_key = 8.
    class CreditsScene : public Scene {
       public:
        CreditsScene() = default;
        ~CreditsScene() 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 { ROLLING,
            FADING_OUT,
            DONE };

        void render();
        static void writeTrickIni();

        SurfaceHandle vaddr2_;  // gfx/final.gif (sprites i coches)
        SurfaceHandle vaddr3_;  // gfx/finals.gif (fons / parallax)
        PaletteFade fade_;
        FrameAnimator coche_{8, 60, true};  // 8 frames × 60 ms (~3 × 20 ms tick vell)

        Phase phase_{Phase::ROLLING};
        int contador_{1};
        int contador_acc_ms_{0};
    };

}  // namespace Scenes
