// 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(),
        .buffer_pool_size = 1024,
        .pipeline_pool_size = 1024,
    };
    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),
                    },
            },
        .stencil =
            {
                .action = SG_ACTION_CLEAR,
            },
    };

    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,
    };
}