/*!
 * \file include/global.h
 * \brief Global typedefs
 *
 * \author xythobuz
 */
#ifndef _GLOBAL_H_
#define _GLOBAL_H_

#include "config.h"

// Defaults
#define DEFAULT_CONFIG_PATH "~/.OpenRaider"
#define DEFAULT_CONFIG_FILE "OpenRaider.ini"
#define DEFAULT_WIDTH 640
#define DEFAULT_HEIGHT 480

// Supported pixelmap color formats
enum ColorMode {
    GREYSCALE,
    RGB,
    RGBA,
    ARGB,
    BGR,
    BGRA
};

// Colors used where ever needed
const unsigned char BLACK[]  = {   0,   0,   0, 255 };
const unsigned char GREY[]   = { 128, 128, 128, 255 };
const unsigned char WHITE[]  = { 255, 255, 255, 255 };
const unsigned char RED[]    = { 255,   0,   0, 255 };
const unsigned char GREEN[]  = {   0, 255,   0, 255 };
const unsigned char PURPLE[] = {  77,  77, 128, 255 };
const unsigned char BLUE[]   = { 128, 179, 255, 255 };
const unsigned char PINK[]   = { 255,   0, 255, 255 };
const unsigned char YELLOW[] = { 255, 255,   0, 255 };
const unsigned char CYAN[]   = {   0, 255, 255, 255 };

// Actions that can be bound to a key and sent to the game engine
typedef enum {
    menuAction = 0,
    consoleAction, // menu and console should always be the first two items
    forwardAction,
    backwardAction,
    leftAction,
    rightAction,
    jumpAction,
    crouchAction,
    useAction,
    holsterAction,
    walkAction,

    ActionEventCount // Should always be at the end
} ActionEvents;

// Keys available for binding
typedef enum {
    zeroKey = '0', oneKey = '1', twoKey = '2',
    threeKey = '3', fourKey = '4', fiveKey = '5',
    sixKey = '6', sevenKey = '7', eightKey = '8',
    nineKey = '9', aKey = 'a', bKey = 'b',
    cKey = 'c', dKey = 'd', eKey = 'e', fKey = 'f',
    gKey = 'g', hKey = 'h', iKey = 'i', jKey = 'j',
    kKey = 'k', lKey = 'l', mKey = 'm', nKey = 'n',
    oKey = 'o', pKey = 'p', qKey = 'q', rKey = 'r',
    sKey = 's', tKey = 't', uKey = 'u', vKey = 'v',
    wKey = 'w', xKey = 'x', yKey = 'y', zKey = 'z',
    quoteKey, backslashKey, backspaceKey, capslockKey,
    commaKey, delKey, upKey, downKey, leftKey, rightKey,
    endKey, equalsKey, escapeKey, f1Key, f2Key, f3Key, f4Key, f5Key,
    f6Key, f7Key, f8Key, f9Key, f10Key, f11Key, f12Key, backquoteKey,
    homeKey, insertKey, leftaltKey, leftctrlKey, leftbracketKey,
    leftguiKey, leftshiftKey, minusKey, numlockKey, pagedownKey,
    pageupKey, pauseKey, dotKey, rightaltKey, rightctrlKey, enterKey,
    rightguiKey, rightbracketKey, rightshiftKey, scrolllockKey,
    semicolonKey, slashKey, spaceKey, tabKey,
    leftmouseKey, middlemouseKey, rightmouseKey,
    fourthmouseKey, fifthmouseKey,
    unknownKey // Should always be at the end
} KeyboardButton;

ActionEvents stringToActionEvent(const char *action);

KeyboardButton stringToKeyboardButton(const char *key);

// Visual C++ does not understand __attribute__
#ifdef _MSC_VER
#define __attribute__(x)
#endif

//! \todo Replace NULL usage with nullptr
#ifndef NULL
#define NULL nullptr
#endif

// Globally include OpenGL header
#ifdef __APPLE__
#include <OpenGL/gl.h>
#else
#ifdef _WIN32
#include <windows.h>
#endif
#include <GL/gl.h>
#include <GL/glext.h>
#endif

// If available, use our own assert that prints the call stack
#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && defined(HAVE_BACKTRACE_SYMBOLS)
#ifndef NDEBUG
[[noreturn]] void assertImplementation(const char *exp, const char *file, int line);
#define assert(x) (void)((x) || (assertImplementation(#x, __FILE__, __LINE__),0))
#else
#define assert(x)
#endif
#else
// Fall back to the default C assert
#include <cassert>
#endif

#endif