#import "Basic";
#import "GL";
#import "freetype-2.12.1";
#import "Hash_Table";
#import "Math";
#import "File";
#import "String";
#import "stb_image";
#import "stb_rect_pack";

using SDL3 :: #import "SDL3";
#import "kb_text_shape";

#load "text.jai";
#load "ui.jai";
#load "stb_textedit.jai";
#load "math/colourspace.jai";
#load "math/math.jai";
#load "platform/input.jai";
#load "platform/opengl.jai";
#load "platform/shader.jai";
#load "platform/texture.jai";

window_width  :: 1280;
window_height :: 720;

window  : *SDL_Window;
gl_context : SDL_GLContext;
running : bool = true;

frame : u64;

ui_font_very_small : Font;
ui_font_small      : Font;
ui_font_normal     : Font;
ui_font_big        : Font;
icon_font_small    : Font;
icon_font_normal   : Font;
icon_font_big      : Font;

main :: () {
    log("Hello, Sailor!");

    SDL_Init(SDL_INIT_VIDEO);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_DEBUG_FLAG, 1);

    window = SDL_CreateWindow(NAME, window_width, window_height, SDL_WINDOW_OPENGL);
    gl_context = SDL_GL_CreateContext(window);

    gl_load(*gl);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    init();

    while (running) {
        event : SDL_Event;

        while (SDL_PollEvent(*event)) {
            if (event.type == SDL_EVENT_QUIT) {
                running = false;
            }
        }

        glClearColor(0.5, 0.1, 0.5, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);

        ui_new_frame();

        ui_context.anchor = .TOP_LEFT;
        ui_context.layout = .TTB;
        
        ui_context.sizing_x = .GROW;
        ui_context.sizing_y = .GROW;

        ui_context.colours.normal = Vector4.{0.13, 0.16, 0.22, 1};
        ui_context.colours.hover = Vector4.{0.13, 0.16, 0.22, 1};
        ui_context.colours.active = Vector4.{0.13, 0.16, 0.22, 1};
        ui_context.colours.background = Vector4.{0.07, 0.09, 0.16, 1};

        ui_context.font = *ui_font_normal;

        ui_begin("Dashboard");
        {
            ui_context.layout = .LTR;
            ui_context.colours.background = .{0.07, 0.09, 0.16, 1};
            ui_context.sizing_x = .FIT;
            ui_context.sizing_y = .FIT;
            ui_label("Hello, World");
            // ui_begin_container("Picture-Name-Settings");
            // {
            //     ui_icon("Icon", *dog, v2(128));

            //     ui_context.layout = .TTB;
            //     ui_context.sizing_x = .FIT;
            //     ui_begin_container("Name-Ready-Score");
            //     {
            //         ui_context.layout = .LTR;
            //         ui_begin_container("Name-Ready");
            //         {
            //             ui_label("John Dog");

            //             ui_context.font = *ui_font_very_small;
            //             ui_context.offaxis_layout = .MIDDLE;
            //             ui_context.colours.background = .{0.11, 0.25, 0.26, 1};
            //             ui_label("Ready to Train", .{0.25, 0.78, 0.6, 1});
            //             ui_context.offaxis_layout = .NONE;
            //             ui_context.colours.background = .{0.07, 0.09, 0.16, 1};
            //         }
            //         ui_end_container();

            //         ui_context.layout = .LTR;
            //         ui_begin_container("asd");
            //         {
            //             ui_context.offaxis_layout = .MIDDLE;
            //             ui_font_icon(*icon_font_normal, "battery-three-quarters", .{48, 48}, .{0.25, 0.78, 0.6, 1});
            //             ui_label("Recovery Score: 85%");
            //         }
            //         ui_end_container();
            //     }
            //     ui_end_container();

            //     ui_context.sizing_x = .GROW;
            //     ui_spacing("padding");

            //     ui_context.offaxis_layout = .MIDDLE;
            //     if ui_button("Settings") {
            //         log("Settings!");
            //     }
            //     ui_context.offaxis_layout = .NONE;
            // }
            // ui_end_container();

            // ui_context.layout = .TTB;
            // ui_begin_container("Scroll", flags = .SCROLL);
            // {
            //     ui_context.sizing_x = .GROW;
            //     ui_context.colours.background = .{1.0, 0.0, 0.0, 1.0};
            //     ui_begin_container("HR&Strain", max_y = 200, flags = .SCROLL);
            //     {

            //         ui_context.layout = .TTB;
            //         ui_context.colours.background = .{0.13, 0.16, 0.22, 1};

            //         ui_begin_container("HR");
            //         {
            //             ui_context.layout = .LTR;
            //             ui_context.font = *ui_font_small;
            //             ui_begin_container("HR-icon");
            //             {
            //                 ui_font_icon(*icon_font_normal, "heart-pulse", .{48, 48}, .{0.89, 0.44, 0.43, 1});
            //                 ui_context.offaxis_layout = .MIDDLE;
            //                 ui_label("HR");
            //                 ui_context.offaxis_layout = .NONE;

            //                 ui_context.sizing_x = .GROW;
            //                 ui_spacing("padding");

            //                 ui_context.font = *ui_font_very_small;
            //                 ui_context.offaxis_layout = .MIDDLE;
            //                 ui_label("Live");
            //                 ui_context.offaxis_layout = .NONE;
            //             }
            //             ui_end_container();

            //             ui_context.font = *ui_font_big;

            //             ui_label("67bpm");

            //             ui_context.font = *ui_font_small;
            //             ui_label("+12% from baseline");
            //         }
            //         ui_end_container();

            //         ui_context.layout = .TTB;

            //         ui_begin_container("Strain");
            //         {
            //             ui_context.layout = .LTR;
            //             ui_begin_container("Strain-Today");
            //             {
            //                 ui_context.font = *ui_font_small;
            //                 ui_font_icon(*icon_font_normal, "bolt", .{48, 48}, .{0.96, 0.73, 0.15, 1});
            //                 ui_context.offaxis_layout = .MIDDLE;
            //                 ui_label("Strain");
            //                 ui_context.offaxis_layout = .NONE;

            //                 ui_context.sizing_x = .GROW;
            //                 ui_spacing("padding");

            //                 ui_context.offaxis_layout = .MIDDLE;
            //                 ui_label("Today");
            //                 ui_context.offaxis_layout = .NONE;
            //             }
            //             ui_end_container();

            //             ui_context.font = *ui_font_big;

            //             ui_label("14.2");
            //         }
            //         ui_end_container();
            //     }
            //     ui_end_container();

            //     ui_context.colours.normal = Vector4.{1, 1, 0, 1};
            //     ui_text_input("Name");

            //     ui_context.colours.background = Vector4.{0.07, 0.09, 0.16, 1};
            //     ui_begin_container("!Padding");
            //     {
            //         ui_context.font = *ui_font_normal;
            //         ui_context.colours.background = .{0.13, 0.16, 0.22, 1};
            //         ui_context.layout = .TTB;
            //         ui_begin_container("CurrentSession");
            //         {
            //             ui_context.sizing_x = .GROW;
            //             ui_context.layout = .LTR;
            //             ui_begin_container("Session-Live");
            //             {
            //                 ui_label("Current Session");

            //                 ui_context.sizing_x = .GROW;
            //                 ui_spacing("padding");

            //                 ui_context.font = *ui_font_small;
            //                 ui_context.offaxis_layout = .MIDDLE;
            //                 ui_label("Live");
            //                 ui_context.offaxis_layout = .NONE;
            //             }
            //             ui_end_container();

            //             ui_context.layout = .LTR;
            //             ui_context.sizing_x = .GROW;
            //             ui_begin_container("CurrentWork");
            //             {
            //                 ui_context.sizing_x = .FIT;
            //                 ui_begin_container("Icon-Exercise-Set");
            //                 {
            //                     ui_context.colours.background = .{0.26, 0.23, 0.45, 1};
            //                     ui_begin_container("Icon-Container");
            //                     {
            //                         ui_font_icon(*icon_font_small, "dumbbell", .{48, 48}, .{0.64, 0.55, 0.97, 1});
            //                     }
            //                     ui_end_container();

            //                     ui_context.colours.background = .{0.13, 0.16, 0.22, 1};
            //                     ui_context.layout = .TTB;
            //                     ui_begin_container("Exercise-Set");
            //                     {
            //                         ui_label("Bench Press");
            //                         ui_context.font = *ui_font_small;
            //                         ui_label("Set 3 of 4");
            //                     }
            //                     ui_end_container();
            //                 }
            //                 ui_end_container();

            //                 ui_context.sizing_x = .GROW;
            //                 ui_spacing("padding");

            //                 ui_context.sizing_x = .FIT;
            //                 ui_begin_container("Weight-Reps");
            //                 {
            //                     ui_context.font = *ui_font_normal;
            //                     ui_label("225 lbs");

            //                     ui_begin_container("padding-reps");
            //                     {
            //                         ui_context.sizing_x = .GROW;
            //                         ui_spacing("padding");
            //                         ui_context.font = *ui_font_small;
            //                         ui_label("8 reps", colour = .{0.23, 0.79, 0.62, 1});
            //                     }
            //                     ui_end_container();
            //                 }
            //                 ui_end_container();
            //             }
            //             ui_end_container();
            //         }
            //         ui_end_container();
            //     }
            //     ui_end_container();

            //     ui_context.colours.background = Vector4.{0.07, 0.09, 0.16, 1};
            //     ui_begin_container("Padding2");
            //     {
            //         ui_context.layout = .LTR;
            //         ui_context.colours.background = .{0.07, 0.09, 0.16, 1};
            //         ui_context.sizing_x = .GROW;
            //         ui_begin_container("Activation-Refresh");
            //         {
            //             ui_label("Muscle Activation");
            //             ui_context.sizing_x = .GROW;
            //             ui_spacing("padding");

            //             ui_font_icon(*icon_font_small, "arrows-rotate", .{48, 48});
            //         }
            //         ui_end_container();
            //     }
            //     ui_end_container();


            //     ui_context.colours.background = .{0.07, 0.09, 0.16, 1};
            //     ui_context.colours.background = .{0.13, 0.16, 0.22, 1};
            //     ui_context.layout = .TTB;
            //     ui_begin_container("Padding3");
            //     {
            //         ui_context.layout = .LTR;
            //         ui_context.colours.background = .{0.13, 0.16, 0.22, 1};

            //         ui_begin_container("Chest");
            //         {
            //             ui_context.font = *ui_font_small;
            //             ui_label("Chest");

            //             ui_context.sizing_x = .GROW;
            //             ui_spacing("padding");

            //             ui_context.colours.background = .{0.3, 0.21, 0.25, 1};
            //             ui_context.font = *ui_font_small;
            //             ui_label("High Strain", colour = .{0.96, 0.44, 0.44, 1});
            //             ui_context.colours.background = .{0.13, 0.16, 0.22, 1};

            //             ui_label("92%", colour = .{0.96, 0.44, 0.44, 1});
            //         }
            //         ui_end_container();

            //         ui_progress_bar("chest-progress", 0.92, .{1800, 20}, .{0.22, 0.25, 0.32, 1}, .{0.96, 0.45, 0.45, 1});
            //     }
            //     ui_end_container();

            //     ui_context.colours.background = Vector4.{0.07, 0.09, 0.16, 1};
            //     ui_context.layout = .TTB;
            //     ui_begin_container("Padding4");
            //     {
            //         ui_context.layout = .LTR;
            //         ui_context.colours.background = .{0.13, 0.16, 0.22, 1};
            //         ui_begin_container("Triceps");
            //         {
            //             ui_context.font = *ui_font_small;
            //             ui_label("Triceps");

            //             ui_context.sizing_x = .GROW;
            //             ui_spacing("padding");

            //             ui_context.font = *ui_font_small;
            //             ui_context.colours.background = .{0.29, 0.27, 0.23, 1};
            //             ui_label("Moderate", colour = .{0.98, 0.75, 0.15, 1});
            //             ui_context.colours.background = .{0.13, 0.16, 0.22, 1};
            //             ui_label("67%", colour = .{0.98, 0.75, 0.15, 1});
            //         }
            //         ui_end_container();
            //     }
            //     ui_end_container();


            //     ui_context.colours.background = Vector4.{0.07, 0.09, 0.16, 1};
            //     ui_context.layout = .TTB;
            //     ui_begin_container("Padding5");
            //     {
            //         ui_context.layout = .TTB;
            //         ui_context.font = *ui_font_small;
            //         ui_context.colours.background = .{0.13, 0.16, 0.22, 1};
            //         ui_begin_container("AI", true, .{0.16, 0.15, 0.31, 1}, .{0.09, 0.18, 0.31, 1});
            //         {
            //             ui_context.sizing_x = .FIT;
            //             ui_context.sizing_y = .FIT;
            //             ui_context.layout = .LTR;
            //             ui_context.colours.background = .{};
            //             ui_begin_container("Icon-AI-Form");
            //             {
            //                 ui_context.colours.background = .{0.26, 0.23, 0.45, 1};
            //                 ui_begin_container("Icon-Container");
            //                 {
            //                     ui_font_icon(*icon_font_small, "robot", .{48, 48}, .{0.64, 0.54, 0.97, 1});
            //                 }
            //                 ui_end_container();

            //                 ui_context.colours.background = .{};
            //                 ui_context.layout = .TTB;
            //                 ui_begin_container("AI-Form");
            //                 {
            //                     ui_context.font = *ui_font_normal;
            //                     ui_label("AI Feedback");
            //                     ui_context.font = *ui_font_small;
            //                     ui_label("Form Analysis");
            //                 }
            //                 ui_end_container();
            //             }
            //             ui_end_container();

            //             ui_label("Reduce weight by 5 lbs for optimal form. Bar path showing slight right deviation.");

            //             ui_context.layout = .LTR;
            //             ui_context.sizing_x = .GROW;
            //             ui_begin_container("buttons");
            //             {
            //                 ui_context.colours.normal = .{0.25, 0.22, 0.45, 1};
            //                 ui_button("Adjust Weight", font_colour = .{0.64, 0.55, 0.97, 1});

            //                 ui_spacing("padding");

            //                 ui_context.colours.normal = .{0.22, 0.25, 0.32, 1};
            //                 ui_button("View Details", font_colour = .{0.6, 0.64, 0.69, 1});
            //             }
            //             ui_end_container();
            //         }
            //         ui_end_container();
            //     }
            //     ui_end_container();
            // }
            // ui_end_container();
        }
        ui_end();

        // ui_context.anchor = .BOTTOM_LEFT;
        // ui_context.layout = .LTR;
        // ui_context.sizing_x = .GROW;
        // ui_context.sizing_y = .FIT;


        // ui_context.colours.background = Vector4.{0.13, 0.16, 0.22, 1};
        // ui_context.colours.normal = Vector4.{0.1, 0.14, 0.21, 1};

        // ui_context.font = *ui_font_very_small;

        // ui_begin("Menu");
        // {
        //     if ui_button("Dashboard") {
        //         log("Dashboard!");
        //     }

        //     if ui_button("Workout") {
        //         log("Workout!");
        //     }

        //     if ui_button("Recovery") {
        //         log("Recovery!");
        //     }

        //     if ui_button("Profile") {
        //         log("Profile!");
        //     }

        //     if ui_button("Exit") {
        //         break;
        //     }
        // }
        // ui_end();

        ui_end_frame();

        ui_render();
        
        SDL_GL_SwapWindow(window);
    }

    SDL_GL_DestroyContext(gl_context);
    SDL_DestroyWindow(window);

    SDL_Quit();
}

init :: () {
    init_shaders();

    init_texture(*normal_frame, "panel-border-000.png");
    init_texture(*hot_frame,    "panel-transparent-center-000.png");
    init_texture(*active_frame, "panel-000.png");
    init_texture(*dog,          "dog.png");

    FT_Init_FreeType(*ftlib);

    init_font(*ui_font_very_small, "./JetBrainsMono-Regular.ttf", 18);
    init_font(*ui_font_small,      "./JetBrainsMono-Regular.ttf", 32);
    init_font(*ui_font_normal,     "./JetBrainsMono-Regular.ttf", 48);
    init_font(*ui_font_big,        "./JetBrainsMono-Regular.ttf", 54);
    init_font(*icon_font_small,    "./Font Awesome 6 Free-Solid-900.otf", 32);
    init_font(*icon_font_normal,   "./Font Awesome 6 Free-Solid-900.otf", 48);
    init_font(*icon_font_big,      "./Font Awesome 6 Free-Solid-900.otf", 54);
}

offset_of :: ($T: Type, ident: Code) -> s64 #expand {
    t: T = ---;
    return cast(*void) (*t.#insert ident) - cast(*void) *t;
}

glDebugOutput :: (source: GLenum, type: GLenum, id: u32, severity: GLenum, length: u64, message: *u8, userParam: *void) {
    // ignore non-significant error/warning codes
    if id == 131169 || id == 131185 || id == 131218 || id == 131204
        return; 

    log("---------------");
    log("Debug message (%): %", id, message);

    if source == {
        case GL_DEBUG_SOURCE_API;             log("Source: API");
        case GL_DEBUG_SOURCE_WINDOW_SYSTEM;   log("Source: Window System");
        case GL_DEBUG_SOURCE_SHADER_COMPILER; log("Source: Shader Compiler");
        case GL_DEBUG_SOURCE_THIRD_PARTY;     log("Source: Third Party");
        case GL_DEBUG_SOURCE_APPLICATION;     log("Source: Application");
        case GL_DEBUG_SOURCE_OTHER;           log("Source: Other");
    }

    if type == {
        case GL_DEBUG_TYPE_ERROR;               log("Type: Error");
        case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR; log("Type: Deprecated Behaviour");
        case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR;  log("Type: Undefined Behaviour");
        case GL_DEBUG_TYPE_PORTABILITY;         log("Type: Portability");
        case GL_DEBUG_TYPE_PERFORMANCE;         log("Type: Performance");
        case GL_DEBUG_TYPE_MARKER;              log("Type: Marker");
        case GL_DEBUG_TYPE_PUSH_GROUP;          log("Type: Push Group");
        case GL_DEBUG_TYPE_POP_GROUP;           log("Type: Pop Group");
        case GL_DEBUG_TYPE_OTHER;               log("Type: Other");
    }
    
    if severity == {
        case GL_DEBUG_SEVERITY_HIGH;         log("Severity: high");
        case GL_DEBUG_SEVERITY_MEDIUM;       log("Severity: medium");
        case GL_DEBUG_SEVERITY_LOW;          log("Severity: low");
        case GL_DEBUG_SEVERITY_NOTIFICATION; log("Severity: notification");
    }

    log("");
}
