#include "gamestates.h"
#include "jgame.h"
#include <string>

namespace gamestate
{
    namespace prefase
    {
        // Variables del gamestate
        draw::surface *fondo = nullptr;
        draw::surface *cursor = nullptr;
        draw::surface *font = nullptr;

        uint8_t num_arounders = 0;
        uint8_t arounders_necessaris = 0;

        // Mètodes del gamestate
        void carregarMapa();
        std::string formatejar(const int numero);
        void drawText(const int x, const int y, std::string text);
        bool loop();


        void init()
        {
            fondo = draw::loadSurface("prefase.gif", true);
            cursor = draw::loadSurface("cursor.gif");
            font = draw::loadSurface("fuente1.gif");

            //int size=0;
            //uint32_t *font_pal = draw::loadPalette("fuente1.gif", &size);
            //draw::setPalette(font_pal+1, 5, 80);

            carregarMapa();

            draw::fadein();
            game::setState(gamestate::prefase::loop);
        }

        bool loop()
        {
            static bool salir = false;

            const int x = input::mouseX();
            const int y = input::mouseY();

            draw::setTrans(255);
            draw::setSource(fondo);
            draw::draw(0, 0, 320, 200, 0, 0);

            draw::setTrans(0);
            draw::setSource(font);

            drawText(130, 60, "NIVELL");
            drawText(179, 60, formatejar(game::getConfig("fase")+1));

            drawText(80, 100, formatejar(num_arounders));
            drawText(101, 100, "AROUNDERS DISPONIBLES");

            drawText(80, 110, formatejar(arounders_necessaris));
            drawText(101, 110, "AROUNDERS NECESSARIS");

            draw::setSource(cursor);
            draw::draw(x, y, cursor->w, cursor->h, 0, 0);

            draw::render();

            if (draw::isfading()) return true;

            if (salir)
            {
                salir = false;
                gamestate::play::init();
                return true;
            }

            if (input::anyKeyPressed() || input::mouseBtn(1))
            {
                draw::fadeout();
                salir = true;
                return true;
            }
            return true;
        }

        void carregarMapa()
        {
            int filesize = 0;
            char *buffer = file::getFileBuffer("MAPES.BAL", &filesize);

            char *punter = buffer + (game::getConfig("fase") * 212) + 3;

            num_arounders = *(punter++);
            arounders_necessaris = *punter;
            
            free(buffer);
        }

        std::string formatejar(const int numero)
        {
            char resultat[3];

            if (numero > 9) {
                    resultat[0] = (numero / 10) + 48;
                    resultat[1] = (numero % 10) + 48;
            } else {
                    resultat[0] = 48;
                    resultat[1] = (numero % 10) + 48;
            }

            resultat[2] = '\0';

            return std::string(resultat);
        }

        void drawText(const int x, const int y, std::string text)
        {
            draw::setSource(font);
            draw::setTrans(0);
            //for (int i=1;i<=5;++i) draw::swapcol(i, 79+i);
            const int len = text.length();
            for (int i=0;i<len;++i)
            {
                char chr = text[i];
                draw::draw(x+i*7, y, 5, 5, (int(chr)-32)*7, 0);
            }
            //for (int i=1;i<=5;++i) draw::restorecol(i);
        }

    }
}
