// Test stuff

#include <SDL.h>

#include <stdio.h>
#include <math.h>

#include "video.h"
#include "tiler.h"

/* Global objects */
Video *video;
Tiler *tiler;

/* Storage for map layers */
int *layers[128];
int width = 32, height = 32;
int nlayers = 0;

void LoadMap(void)
{
    FILE *fp = popen("grep '^   ' maps/testmap.tmx | while read i; do echo -n \"$i\" | perl -MMIME::Base64 -ne 'print decode_base64($_)' | gunzip; done", "r");
    while (fp && !feof(fp))
    {
        layers[nlayers] = (int *)malloc(width * height * sizeof(int));
        fread(layers[nlayers], sizeof(int), width * height, fp);
        if (feof(fp))
        {
            free(layers[nlayers]);
            layers[nlayers] = 0;
            fclose(fp);
            break;
        }
        for (int n = 0; n < width * height; n++)
        {
            unsigned int i = layers[nlayers][n];
            //i = (i >> 24) | ((i >> 8) & 0xff00) | ((i << 8) & 0xff0000) | (i << 24);
            layers[nlayers][n] = i ? i - 1 : 0;
        }
        nlayers++;
    }
}

/* The main drawing function. */
void DrawScene()
{
    video->Clear();

    for (int i = 0; i < nlayers; i++)
        for (int y = 0; y < height; y++)
            for (int x = 0; x < width; x++)
                tiler->AddTile(layers[i][y * width + x], x * 32, y * 32, i);

    /* Test stuff */
    int playerx, playery;
    SDL_GetMouseState(&playerx, &playery);
    tiler->AddTile(50, playerx, playery, 1);

    tiler->Render();
    video->Refresh(33.33333f);
}

int main(int argc, char **argv)
{
    video = new Video("Deus Hax", 640, 480);
    tiler = new Tiler();

    int done;

    /* Loop, drawing and checking events */
    LoadMap();

    done = 0;
    while (!done)
    {
        DrawScene();

        /* This could go in a separate function */
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
                done = 1;
            if (event.type == SDL_KEYDOWN)
            {
                if (event.key.keysym.sym == SDLK_RETURN)
                    video->FullScreen();
                else if (event.key.keysym.sym == SDLK_ESCAPE)
                    done = 1;
            }
        }
    }

    delete tiler;
    delete video;

    return EXIT_SUCCESS;
}