#include "state.h"
#include "scenes/scene.h"
#include "scenes/title.h"

#include "twn_game_api.h"

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


void game_tick(void) {
    if (ctx.initialization_needed) {
        if (!ctx.udata) {
            ctx.udata = ccalloc(1, sizeof (State));

            State *state = ctx.udata;
            state->ctx = &ctx;
            state->scene = title_scene(state);
        }

        input_add_action("debug_toggle");
        input_bind_action_control("debug_toggle", CONTROL_BACKSPACE);

        input_add_action("debug_dump_atlases");
        input_bind_action_control("debug_dump_atlases", CONTROL_HOME);

        input_add_action("player_left");
        input_bind_action_control("player_left", CONTROL_A);

        input_add_action("player_right");
        input_bind_action_control("player_right", CONTROL_D);

        input_add_action("player_forward");
        input_bind_action_control("player_forward", CONTROL_W);

        input_add_action("player_backward");
        input_bind_action_control("player_backward", CONTROL_S);

        input_add_action("player_jump");
        input_bind_action_control("player_jump", CONTROL_SPACE);

        input_add_action("player_run");
        input_bind_action_control("player_run", CONTROL_LSHIFT);

        input_add_action("ui_accept");
        input_bind_action_control("ui_accept", CONTROL_RETURN);

        input_add_action("mouse_capture_toggle");
        input_bind_action_control("mouse_capture_toggle", CONTROL_ESCAPE);
    }

    State *state = ctx.udata;

    if (input_is_action_just_pressed("debug_toggle")) {
        ctx.debug = !ctx.debug;
    }

    if (input_is_action_just_pressed("debug_dump_atlases")) {
        textures_dump_atlases();
    }

    state->scene->tick(state);

    /* there's a scene switch pending, we can do it now that the tick is done */
    if (state->next_scene != NULL) {
        state->scene->end(state);
        state->scene = state->next_scene;
        state->is_scene_switching = false;
        state->next_scene = NULL;
    }
}


void game_end(void) {
    State *state = ctx.udata;
    state->scene->end(state);
    free(state);
}
