/*
Copyright (c) 2020-2026 Rupert Carmichael

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
*/

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#include <jg/jg.h>
//#include <jg/jg_system.h>

#define SAMPLERATE 48000
#define FRAMERATE 60
#define CHANNELS 2
#define NUMINPUTS 2

static jg_cb_audio_t jg_cb_audio;
static void *jg_cb_audio_udata;

static jg_cb_frametime_t jg_cb_frametime;
static void *jg_cb_frametime_udata;

static jg_cb_log_t jg_cb_log;

static jg_cb_rumble_t jg_cb_rumble;
static void *jg_cb_rumble_udata;

static jg_coreinfo_t coreinfo = {
    "name", "Full Name", "0.0", "system", NUMINPUTS, 0x00
};

static jg_videoinfo_t vidinfo = {
    JG_PIXFMT_XRGB8888, // pixfmt
    256,                // wmax
    240,                // hmax
    256,                // w
    240,                // h
    0,                  // x
    0,                  // y
    256,                // p
    256.0/240.0,        // aspect
    NULL                // buf
};

static jg_audioinfo_t audinfo = {
    JG_SAMPFMT_INT16,
    SAMPLERATE,
    CHANNELS,
    (SAMPLERATE / FRAMERATE) * CHANNELS,
    NULL
};

static jg_pathinfo_t pathinfo;
static jg_fileinfo_t gameinfo;
static jg_inputinfo_t inputinfo[NUMINPUTS];
static jg_inputstate_t *input_device[NUMINPUTS];

void jg_set_cb_audio(jg_cb_audio_t func, void *udata) {
    jg_cb_audio = func;
    jg_cb_audio_udata = udata;
}

void jg_set_cb_frametime(jg_cb_frametime_t func, void *udata) {
    jg_cb_frametime = func;
    jg_cb_frametime_udata = udata;
}

void jg_set_cb_log(jg_cb_log_t func) {
    jg_cb_log = func;
}

void jg_set_cb_rumble(jg_cb_rumble_t func, void *udata) {
    jg_cb_rumble = func;
    jg_cb_rumble_udata = udata;
}

unsigned jg_api_version(void) {
    return JG_VERSION_NUMBER;
}

int jg_init(void) {
    return 1;
}

void jg_deinit(void) {
}

void jg_reset(int hard) {
}

void jg_exec_frame(void) {
}

int jg_game_load(void) {
    return 1;
}

int jg_game_unload(void) {
    return 1;
}

int jg_state_load(const char *filename) {
    return 0;
}

void jg_state_load_raw(const void *data) {
}

int jg_state_save(const char *filename) {
    return 0;
}

const void* jg_state_save_raw(void) {
    return NULL;
}

size_t jg_state_size(void) {
    return 0;
}

void jg_media_set(unsigned index) {
}

void jg_media_mount(unsigned state) {
}

void jg_cheat_clear(void) {
}

void jg_cheat_set(const char *code) {
}

void jg_rehash(void) {
}

void jg_data_push(uint32_t type, int port, const void *ptr, size_t size) {
}

jg_systeminfo_t* jg_get_systemlist(size_t *num) {
    *num = 0;
    return NULL;
}

jg_coreinfo_t* jg_get_coreinfo(const char *sys) {
    return &coreinfo;
}

jg_biosinfo_t* jg_get_bioslist(size_t *num) {
    *num = 0;
    return NULL;
}

jg_videoinfo_t* jg_get_videoinfo(void) {
    return &vidinfo;
}

jg_audioinfo_t* jg_get_audioinfo(void) {
    return &audinfo;
}

jg_inputinfo_t* jg_get_inputinfo(int port) {
    return &inputinfo[port];
}

jg_inputinfo_t* jg_get_inputlist(size_t *num) {
    *num = 0;
    return NULL;
}

jg_setting_t* jg_get_settings(size_t *numsettings) {
    *numsettings = 0;
    return NULL;
}

jg_setting_t* jg_get_dips(size_t *num) {
    *num = 0;
    return NULL;
}

jg_mediainfo_t* jg_get_mediainfo(void) {
    return NULL;
}

void jg_setup_video(void) {
}

void jg_setup_audio(void) {
}

void jg_set_inputstate(jg_inputstate_t *ptr, int port) {
    input_device[port] = ptr;
}

void jg_set_gameinfo(jg_fileinfo_t info) {
    gameinfo = info;
}

void jg_set_auxinfo(jg_fileinfo_t info, int index) {
}

void jg_set_paths(jg_pathinfo_t paths) {
    pathinfo = paths;
}
