#include <stdio.h>
#include <furi.h>
#include <gui/gui.h>
#include <input/input.h>
#include <gui/elements.h>
#include <furi_hal.h>

#include "scrambler.h"
#include "furi_hal_random.h"

int scrambleStarted = 0;
char scramble_str[100] = {0};
char scramble_start[100] = {0};
char scramble_end[100] = {0};
int notifications_enabled = 0;

static void success_vibration() {
    furi_hal_vibro_on(false);
    furi_hal_vibro_on(true);
    furi_delay_ms(50);
    furi_hal_vibro_on(false);
    return;
}
void split_array(char original[], int size, char first[], char second[]) {
    int mid = size / 2;
    if(size % 2 != 0) {
        mid++;
    }
    int first_index = 0, second_index = 0;
    for(int i = 0; i < size; i++) {
        if(i < mid) {
            first[first_index++] = original[i];
        } else {
            if(i == mid && (original[i] == '2' || original[i] == '\'')) {
                continue;
            }
            second[second_index++] = original[i];
        }
    }
    first[first_index] = '\0';
    second[second_index] = '\0';
}

static void draw_callback(Canvas* canvas, void* ctx) {
    UNUSED(ctx);
    canvas_clear(canvas);
    canvas_set_font(canvas, FontPrimary);
    canvas_draw_str(canvas, 4, 13, "Rubik's Cube Scrambler");

    if(scrambleStarted) {
        genScramble();
        scrambleReplace();
        strcpy(scramble_str, printData());
        if(notifications_enabled) {
            success_vibration();
        }
        split_array(scramble_str, strlen(scramble_str), scramble_start, scramble_end);
        scrambleStarted = 0;
    }
    canvas_set_font(canvas, FontSecondary);
    canvas_draw_str_aligned(canvas, 64, 28, AlignCenter, AlignCenter, scramble_start);
    canvas_draw_str_aligned(canvas, 64, 38, AlignCenter, AlignCenter, scramble_end);
    elements_button_center(canvas, "New");

    elements_button_left(canvas, notifications_enabled ? "On" : "Off");
};

static void input_callback(InputEvent* input_event, void* ctx) {
    furi_assert(ctx);
    FuriMessageQueue* event_queue = ctx;
    furi_message_queue_put(event_queue, input_event, FuriWaitForever);
}

int32_t rubiks_cube_scrambler_main(void* p) {
    UNUSED(p);
    InputEvent event;

    FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent));

    ViewPort* view_port = view_port_alloc();

    view_port_draw_callback_set(view_port, draw_callback, NULL);

    view_port_input_callback_set(view_port, input_callback, event_queue);

    Gui* gui = furi_record_open(RECORD_GUI);
    gui_add_view_port(gui, view_port, GuiLayerFullscreen);

    while(true) {
        furi_check(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk);

        if(event.key == InputKeyOk && event.type == InputTypeShort) {
            scrambleStarted = 1;
        }
        if(event.key == InputKeyLeft && event.type == InputTypeShort) {
            if(notifications_enabled) {
                notifications_enabled = 0;
            } else {
                notifications_enabled = 1;
                success_vibration();
            }
        }
        if(event.key == InputKeyBack) {
            break;
        }
        view_port_update(view_port);
    }

    furi_message_queue_free(event_queue);

    gui_remove_view_port(gui, view_port);

    view_port_free(view_port);
    furi_record_close(RECORD_GUI);
    return 0;
}
