#include <emscripten.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>

#include "gol.h"



/* ******************** Game WASM API ******************** */

EMSCRIPTEN_KEEPALIVE
void wrapper_checkNeighbor(grid* gol) { return checkNeighbor(gol);}

EMSCRIPTEN_KEEPALIVE
void wrapper_updateState(grid* gol) { return updateState(gol);}

EMSCRIPTEN_KEEPALIVE
void wrapper_changeState(int x, int y,bool state, grid* gol) { return changeState(x,y,state,gol);}

EMSCRIPTEN_KEEPALIVE
bool wrapper_getState(int x, int y, grid* gol) { return getState(x,y,gol);}

EMSCRIPTEN_KEEPALIVE
void wrapper_setRate(float rate, grid* gol) { return setRate(rate,gol);}

EMSCRIPTEN_KEEPALIVE
void wrapper_setPause(bool pause, grid* gol) { return setPause(pause,gol);}

EMSCRIPTEN_KEEPALIVE
bool wrapper_getPause(grid* gol) { return getPause(gol);}

EMSCRIPTEN_KEEPALIVE
bool wrapper_inGrid(int x, int y, grid* gol) { return inGrid(x,y,gol);}

EMSCRIPTEN_KEEPALIVE
grid* wrapper_newGrid(int rows, int cols, float alive, float update_rate) { return newGrid(rows,cols,alive,update_rate);};

EMSCRIPTEN_KEEPALIVE
float wrapper_getRate(grid* gol) {return  getRate(gol);}

EMSCRIPTEN_KEEPALIVE
int wrapper_getRows(grid* gol) {return getRows(gol);};

EMSCRIPTEN_KEEPALIVE
int wrapper_getCols(grid* gol){return getCols(gol);}

EMSCRIPTEN_KEEPALIVE
void wrapper_deleteGrid(grid* gol){return deleteGrid(gol);}

EMSCRIPTEN_KEEPALIVE
grid* wrapper_load(char* filename){return load(filename);}

EMSCRIPTEN_KEEPALIVE
void wrapper_save(char* filename, grid* gol){save(filename,gol);}

EM_JS(void, download_file, (const char* filename, const char* mime_type, const void* buffer, size_t size), {
    var a = document.createElement('a');
    a.download = UTF8ToString(filename);
    a.href = URL.createObjectURL(new Blob([new Uint8Array(Module.HEAPU8.buffer, buffer, size)], {type: UTF8ToString(mime_type)}));
    a.click();
});

EM_JS(void, upload_file, (const char* filename_c), {
    var input = document.createElement('input');
    input.type = 'file';
    input.onchange = function(event) {
        var file = event.target.files[0];
        if (!file) return;

        var reader = new FileReader();
        reader.onload = function(e) {
            var data = new Uint8Array(e.target.result);
            FS.writeFile(UTF8ToString(filename_c), data);
            onFileLoad();
        };
        reader.readAsArrayBuffer(file);
    };
    input.click();
});


// EOF


