#include "game/scenes/menu_scene.hpp"

#include <cstdlib>

#include "core/jail/jdraw8.hpp"
#include "core/jail/jinput.hpp"
#include "game/info.hpp"

namespace Scenes {

    void MenuScene::onEnter() {
        fondo_ = SurfaceHandle("gfx/menu.gif");
        gfx_ = SurfaceHandle("gfx/menu2.gif");

        // Pintat inicial (congelat durant el fade-in de paleta). El loop
        // d'animació repintarà tot des de zero en el primer tick de SHOWING.
        Jd8::blit(fondo_);
        Jd8::blitCK(100, 25, gfx_, 0, 74, 124, 68, 255);  // logo
        Jd8::blitCK(130, 100, gfx_, 0, 0, 80, 74, 255);   // camell (frame 0)
        Jd8::blitCK(0, 150, gfx_, 0, 150, 320, 50, 255);  // base "jdes"

        Jd8::Palette pal = Jd8::loadPalette("gfx/menu2.gif");
        fade_.startFadeTo(pal);
        delete[] pal;

        phase_ = Phase::FADING_IN;
    }

    void MenuScene::render() {
        // Cel estàtic (els primers 100 pixels verticals)
        Jd8::blit(0, 0, fondo_, 0, 0, 320, 100);

        // Fondo mòvil (horitzó) amb wrap a 320
        Jd8::blitCK(horitzo_, 100, fondo_, 0, 100, 320 - horitzo_, 100, 255);
        Jd8::blitCK(0, 100, fondo_, 320 - horitzo_, 100, horitzo_, 100, 255);

        // Logo i camell animat
        Jd8::blitCK(100, 25, gfx_, 0, 74, 124, 68, 255);
        Jd8::blitCK(130, 100, gfx_, camello_.frame() * 80, 0, 80, 74, 255);

        // Palmeres mòvils amb wrap a 320
        Jd8::blitCK(palmeres_, 150, gfx_, 0, 150, 320 - palmeres_, 50, 255);
        Jd8::blitCK(0, 150, gfx_, 320 - palmeres_, 150, palmeres_, 50, 255);

        // "jdes" estàtic (davant dels scrollers) i versió a la cantonada
        Jd8::blitCK(87, 167, gfx_, 127, 124, 150, 24, 255);
        Jd8::blitCK(303, 193, gfx_, 305, 143, 15, 5, 255);

        // "Polsa tecla" parpallejant. Al vell `contador % 100 > 30` amb
        // updateTicks=20 ms, el cicle són 2000 ms amb un llindar de 600 ms:
        // amagat els primers 600 ms, visible els següents 1400 ms.
        const bool BLINK_ON = (blink_ms_ % 2000) > 600;
        if (BLINK_ON) {
            Jd8::blitCK(98, 130, gfx_, 161, 92, 127, 9, 255);
            if (Info::ctx.nou_personatge) {
                Jd8::blitCK(68, 141, gfx_, 128, 105, 189, 9, 255);
            }
        }
    }

    void MenuScene::tick(int delta_ms) {
        switch (phase_) {
            case Phase::FADING_IN:
                fade_.tick(delta_ms);
                if (fade_.done()) {
                    phase_ = Phase::SHOWING;
                }
                break;

            case Phase::SHOWING: {
                // Palmeres: 1 pixel cada 80 ms (= cada 4 ticks × 20 ms originals)
                palmeres_acc_ms_ += delta_ms;
                while (palmeres_acc_ms_ >= 80) {
                    palmeres_acc_ms_ -= 80;
                    if (--palmeres_ < 0) {
                        palmeres_ = 319;
                    }
                }

                // Horitzó: 1 pixel cada 320 ms (= cada 16 ticks × 20 ms)
                horitzo_acc_ms_ += delta_ms;
                while (horitzo_acc_ms_ >= 320) {
                    horitzo_acc_ms_ -= 320;
                    if (--horitzo_ < 0) {
                        horitzo_ = 319;
                    }
                }

                camello_.tick(delta_ms);

                blink_ms_ += delta_ms;
                if (blink_ms_ >= 2000) {
                    blink_ms_ %= 2000;
                }

                render();

                // Qualsevol tecla tanca el menú. Llegim 'P' explícitament abans
                // de reiniciar el flag de input perquè `Info::ctx.pepe_activat`
                // reflecteixca si l'usuari estava polsant P al moment d'eixir.
                if (Ji::anyKey() || Ji::keyPressed(SDL_SCANCODE_P)) {
                    Info::ctx.pepe_activat = Ji::keyPressed(SDL_SCANCODE_P);
                    Ji::disableKeyboard(60);
                    Info::ctx.num_piramide = 1;
                    fade_.startFadeOut();
                    phase_ = Phase::FADING_OUT;
                }
                break;
            }

            case Phase::FADING_OUT:
                fade_.tick(delta_ms);
                if (fade_.done()) {
                    phase_ = Phase::DONE;
                }
                break;

            case Phase::DONE:
                break;
        }
    }

}  // namespace Scenes
