#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <EGL/egl.h>
#include <emscripten.h>

#define MULTILINE(...) #__VA_ARGS__

int wheel_up = 0;
int wheel_down = 0;

int result = 0;

void mouseCB(int button, int state, int x, int y)
{
    if(button == 3)
    {
      wheel_up = 1;   
    }
    else if (button == 4)
    {
      wheel_down = 1;
    }
}

int main(int argc, char *argv[])
{
    emscripten_run_script(MULTILINE(
        Module.injectWheelEvent = function(x, y, delta) {
            var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
            var event = document.createEvent("MouseEvents");
            if (!isFirefox) {
            // mouse wheel event for IE9, Chrome, Safari, Opera
            event.initMouseEvent('mousewheel', true, true, window,
                                 0, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y,
                                 0, 0, 0, 0, 0, null);
                                 event.wheelDelta = delta;
            } else {
              // mouse wheel event for Firefox, the delta sign is inversed for that browser and is stored in the detail property of the mouse event
              event.initMouseEvent('DOMMouseScroll', true, true, window,
                                   -delta, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y,
                                   0, 0, 0, 0, 0, null);
            }
            Module['canvas'].dispatchEvent(event);
        }
    ));

    
    glutInit(&argc, argv);

    glutMouseFunc(&mouseCB);
    
    // inject wheel up event (delta > 0)
    emscripten_run_script("Module.injectWheelEvent(100, 100, 1)");
    if (wheel_up) {
      printf("%s\n", "mouse wheel up event received");
    }
    // inject wheel down event (delta < 0)
    emscripten_run_script("Module.injectWheelEvent(100, 100, -1)");
    if (wheel_down) {
      printf("%s\n", "mouse wheel down event received");
    }
    
    result = wheel_up && wheel_down;
  
    REPORT_RESULT(result);
    return 0;
}
