// Viewer & Rive
#include "viewer/viewer.hpp"
#include "viewer/viewer_content.hpp"
#include "viewer/viewer_host.hpp"
#include "rive/shapes/paint/color.hpp"

// Graphics and UI abstraction
#include "sokol_app.h"
#include "sokol_gfx.h"
#include "sokol_glue.h"
#include "imgui.h"
#include "util/sokol_imgui.h"

// Std lib
#include <stdio.h>
#include <memory>

std::unique_ptr<ViewerHost> g_Host = ViewerHost::Make();
std::unique_ptr<ViewerContent> g_Content = ViewerContent::TrimPath("");
static struct { sg_pass_action pass_action; } state;

void displayStats();

static const int backgroundColor = rive::colorARGB(255, 22, 22, 22);

static void init(void) {
    sg_desc descriptor = {.context = sapp_sgcontext()};
    sg_setup(&descriptor);
    simgui_desc_t imguiDescriptor = {
        .write_alpha_channel = true,
    };
    simgui_setup(&imguiDescriptor);

    // If the host doesn't overwrite this (in init()), Sokol is in full control,
    // so let's clear to our bg color.
    state.pass_action =
        (sg_pass_action){.colors[0] = {.action = SG_ACTION_CLEAR,
                                       .value = {rive::colorRed(backgroundColor) / 255.0f,
                                                 rive::colorGreen(backgroundColor) / 255.0f,
                                                 rive::colorBlue(backgroundColor) / 255.0f,
                                                 rive::colorOpacity(backgroundColor)}}};

    if (!g_Host->init(&state.pass_action, sapp_width(), sapp_height())) {
        fprintf(stderr, "failed to initialize host\n");
        sapp_quit();
    }
}

static void frame(void) {
    auto dur = sapp_frame_duration();

    g_Host->beforeDefaultPass(g_Content.get(), dur);

    sg_begin_default_pass(&state.pass_action, sapp_width(), sapp_height());

    g_Host->afterDefaultPass(g_Content.get(), dur);

    simgui_frame_desc_t imguiDesc = {
        .width = sapp_width(),
        .height = sapp_height(),
        .delta_time = sapp_frame_duration(),
        .dpi_scale = sapp_dpi_scale(),
    };
    simgui_new_frame(&imguiDesc);

    displayStats();

    if (g_Content) {
        g_Content->handleImgui();
    }
    simgui_render();

    sg_end_pass();
    sg_commit();
}

static void cleanup(void) {
    g_Content = nullptr;
    g_Host = nullptr;

    simgui_shutdown();
    sg_shutdown();
}

static void event(const sapp_event* ev) {
    simgui_handle_event(ev);

    switch (ev->type) {
        case SAPP_EVENTTYPE_RESIZED:
            if (g_Content) {
                g_Content->handleResize(ev->framebuffer_width, ev->framebuffer_height);
            }
            g_Host->handleResize(ev->framebuffer_width, ev->framebuffer_height);
            break;
        case SAPP_EVENTTYPE_FILES_DROPPED: {
            // Do this to make sure the graphics is bound.
            bindGraphicsContext();

            // get the number of files and their paths like this:
            const int numDroppedFiles = sapp_get_num_dropped_files();
            if (numDroppedFiles != 0) {
                const char* filename = sapp_get_dropped_file_path(numDroppedFiles - 1);
                auto newContent = ViewerContent::findHandler(filename);
                if (newContent) {
                    g_Content = std::move(newContent);
                    g_Content->handleResize(ev->framebuffer_width, ev->framebuffer_height);
                } else {
                    fprintf(stderr, "No handler found for %s\n", filename);
                }
            }
            break;
        }
        case SAPP_EVENTTYPE_MOUSE_DOWN:
        case SAPP_EVENTTYPE_TOUCHES_BEGAN:
            if (g_Content) {
                g_Content->handlePointerDown(ev->mouse_x, ev->mouse_y);
            }
            break;
        case SAPP_EVENTTYPE_MOUSE_UP:
        case SAPP_EVENTTYPE_TOUCHES_ENDED:
            if (g_Content) {
                g_Content->handlePointerUp(ev->mouse_x, ev->mouse_y);
                break;
            }
        case SAPP_EVENTTYPE_MOUSE_MOVE:
        case SAPP_EVENTTYPE_TOUCHES_MOVED:
            if (g_Content) {
                g_Content->handlePointerMove(ev->mouse_x, ev->mouse_y);
            }
            break;
        case SAPP_EVENTTYPE_KEY_UP:
            switch (ev->key_code) {
                case SAPP_KEYCODE_ESCAPE:
                    sapp_quit();
                    break;
                case SAPP_KEYCODE_T:
                    g_Content = ViewerContent::Text(".svg");
                    break;
                case SAPP_KEYCODE_P:
                    g_Content = ViewerContent::TextPath("");
                    break;
                default:
                    break;
            }
            break;
        default:
            break;
    }
}

sapp_desc sokol_main(int argc, char* argv[]) {
    (void)argc;
    (void)argv;

    return (sapp_desc) {
        .init_cb = init, .frame_cb = frame, .cleanup_cb = cleanup, .event_cb = event,
        .enable_dragndrop = true, .high_dpi = true,
        .window_title = "Rive Viewer "
#if defined(SOKOL_GLCORE33)
                        "(OpenGL 3.3)",
#elif defined(SOKOL_GLES2)
                        "(OpenGL ES 2)",
#elif defined(SOKOL_GLES3)
                        "(OpenGL ES 3)",
#elif defined(SOKOL_D3D11)
                        "(D3D11)",
#elif defined(SOKOL_METAL)
                        "(Metal)",
#elif defined(SOKOL_WGPU)
                        "(WebGPU)",
#endif
        .width = 800, .height = 600, .icon.sokol_default = true, .gl_force_gles2 = true,
    };
}