/* TripSurf browser backend for doomgeneric. GPL-2.0-or-later. */
#include <emscripten.h>
#include <emscripten/eventloop.h>
#include <SDL.h>
#include <SDL_mixer.h>
#include "doomgeneric.h"
#include "d_event.h"
#include "doomstat.h"

EM_JS(void, draw, (unsigned int ptr), { Module.drawFrame(ptr); });
void DG_Init(void) {}
void DG_DrawFrame(void) { draw((unsigned int)DG_ScreenBuffer); }
void DG_SleepMs(uint32_t ms) { /* Tick scheduling is owned by the browser. */ }
uint32_t DG_GetTicksMs(void) { return (uint32_t)emscripten_get_now(); }
int DG_GetKey(int *pressed, unsigned char *key) { return 0; }
void DG_SetWindowTitle(const char *title) {}

EMSCRIPTEN_KEEPALIVE void ts_key(int key, int down) {
    if (key < 0 || key > 255) return;
    event_t event = {0};
    event.type = down ? ev_keydown : ev_keyup;
    event.data1 = key;
    event.data2 = key;
    D_PostEvent(&event);
}
EMSCRIPTEN_KEEPALIVE void ts_mouse(int delta) {
    if (delta < -100 || delta > 100) return;
    event_t event = {0};
    event.type = ev_mouse;
    event.data2 = delta;
    D_PostEvent(&event);
}
EMSCRIPTEN_KEEPALIVE void ts_weapon(void) {
    if (gamestate != GS_LEVEL) return;
    player_t *player = &players[consoleplayer];
    for (int step = 1; step < NUMWEAPONS; step++) {
        int next = (player->readyweapon + step) % NUMWEAPONS;
        if (player->weaponowned[next]) { player->pendingweapon = next; break; }
    }
}
EMSCRIPTEN_KEEPALIVE void ts_pause(int paused) {
    if (paused) {
        emscripten_runtime_keepalive_push();
        emscripten_pause_main_loop(); Mix_Pause(-1);
    } else {
        Mix_Resume(-1); emscripten_resume_main_loop();
        emscripten_runtime_keepalive_pop();
    }
}
// Upstream doomgeneric intentionally omits process termination in I_Quit.
// In this disposable browser session, Quit returns to the shell immediately.
void __wrap_I_Quit(void) { emscripten_force_exit(0); }
EMSCRIPTEN_KEEPALIVE void ts_audio(void) {
    EM_ASM({ if (typeof SDL2 !== 'undefined' && SDL2.audioContext) SDL2.audioContext.resume(); });
}
int main(int argc, char **argv) {
    doomgeneric_Create(argc, argv);
    emscripten_set_main_loop(doomgeneric_Tick, 35, 1);
    return 0;
}
