#include <furi.h>
#include <gui/gui.h>
#include <gui/elements.h>
#include <gui/view_dispatcher.h>
#include <gui/modules/dialog_ex.h>
#include <locale/locale.h>

typedef struct {
    Gui* gui;
    ViewDispatcher* view_dispatcher;
    View* view;
} LocaleTestApp;

static void locale_test_view_draw_callback(Canvas* canvas, void* _model) {
    UNUSED(_model);

    // Prepare canvas
    canvas_set_color(canvas, ColorBlack);
    canvas_set_font(canvas, FontSecondary);

    FuriString* tmp_string = furi_string_alloc();

    float temp = 25.3f;
    LocaleMeasurementUnits units = locale_get_measurement_unit();
    if(units == LocaleMeasurementUnitsMetric) {
        furi_string_printf(tmp_string, "Temp: %5.1fC", (double)temp);
    } else {
        temp = locale_celsius_to_fahrenheit(temp);
        furi_string_printf(tmp_string, "Temp: %5.1fF", (double)temp);
    }
    canvas_draw_str(canvas, 0, 10, furi_string_get_cstr(tmp_string));

    FuriHalRtcDateTime datetime;
    furi_hal_rtc_get_datetime(&datetime);

    locale_format_time(tmp_string, &datetime, locale_get_time_format(), false);
    canvas_draw_str(canvas, 0, 25, furi_string_get_cstr(tmp_string));

    locale_format_date(tmp_string, &datetime, locale_get_date_format(), "/");
    canvas_draw_str(canvas, 0, 40, furi_string_get_cstr(tmp_string));

    furi_string_free(tmp_string);
}

static bool locale_test_view_input_callback(InputEvent* event, void* context) {
    UNUSED(event);
    UNUSED(context);
    return false;
}

static uint32_t locale_test_exit(void* context) {
    UNUSED(context);
    return VIEW_NONE;
}

static LocaleTestApp* locale_test_alloc() {
    LocaleTestApp* app = malloc(sizeof(LocaleTestApp));

    // Gui
    app->gui = furi_record_open(RECORD_GUI);

    // View dispatcher
    app->view_dispatcher = view_dispatcher_alloc();
    view_dispatcher_enable_queue(app->view_dispatcher);
    view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);

    // Views
    app->view = view_alloc();
    view_set_draw_callback(app->view, locale_test_view_draw_callback);
    view_set_input_callback(app->view, locale_test_view_input_callback);

    view_set_previous_callback(app->view, locale_test_exit);
    view_dispatcher_add_view(app->view_dispatcher, 0, app->view);
    view_dispatcher_switch_to_view(app->view_dispatcher, 0);

    return app;
}

static void locale_test_free(LocaleTestApp* app) {
    furi_assert(app);

    // Free views
    view_dispatcher_remove_view(app->view_dispatcher, 0);

    view_free(app->view);
    view_dispatcher_free(app->view_dispatcher);

    // Close gui record
    furi_record_close(RECORD_GUI);
    app->gui = NULL;

    // Free rest
    free(app);
}

int32_t locale_test_app(void* p) {
    UNUSED(p);
    LocaleTestApp* app = locale_test_alloc();
    view_dispatcher_run(app->view_dispatcher);
    locale_test_free(app);
    return 0;
}