/* date = May 5th 2023 10:12 am */

#ifndef VN_WORKSPACE_H
#define VN_WORKSPACE_H

////////////////////////////////
//~ sixten: Workspace Types

// sixten(TODO): Remove this type entirely.
enum toolbar_menu
{
    ToolbarMenu_None = 0,
    ToolbarMenu_Panel,
    ToolbarMenu_View,
    ToolbarMenu_Window,
};

struct workspace_panel
{
    workspace_panel *First;
    workspace_panel *Last;
    workspace_panel *Next;
    workspace_panel *Prev;
    workspace_panel *Parent;
    
    struct workspace_view *FirstView;
    struct workspace_view *LastView;
    
    struct workspace_view *CurrentView;
    
    axis2 SplitAxis;
    r32 PercentOfParent;
};

#define WORKSPACE_COMMAND(name, ...) void name(u64 Argument)
typedef WORKSPACE_COMMAND(workspace_command_sig);

struct workspace_command
{
    workspace_command_sig *Command;
    u64 Argument;
    
    workspace_command *Next;
    workspace_command *Prev;
};

struct workspace_keybind
{
    platform_key Key;
    platform_modifiers Modifiers;
    workspace_command_sig *Command;
    u64 Argument;
};

enum workspace_drag_payload_state
{
    W_DragPayload_Inactive = 0,
    W_DragPayload_Active,
    W_DragPayload_Released,
};

struct workspace_drag_payload
{
    ui_key Key;
    workspace_view *View;
};

struct workspace
{
    vn_input *Input;
    platform_event_list *EventList;
    
    // sixten: General Purpose Allocation
    memory_arena *FrameArena;
    
    // sixten: Command Allocation
    memory_arena *CommandArena;
    workspace_command *FirstFreeCommand;
    workspace_command *LastFreeCommand;
    
    // sixten: Command List
    workspace_command *FirstCommand;
    workspace_command *LastCommand;
    
    // sixten: Panels
    memory_arena *PanelArena;
    workspace_panel *FirstFreePanel;
    workspace_panel *LastFreePanel;
    
    workspace_drag_payload_state DragPayloadState;
    workspace_drag_payload DragPayload;
    
    toolbar_menu Menu;
    v2 MenuP;
    r32 MenuTransition;
    
    workspace_panel *RootPanel;
    workspace_panel *CurrentPanel;
};

#include "vn_workspace_editor.h"
#include "vn_workspace_text_editor.h"
#include "vn_workspace_character_editor.h"
#include "vn_workspace_view.h"

////////////////////////////////
//~ sixten: Workspace Functions

//- sixten: State management
static void W_SetState(workspace *Workspace);
static workspace *W_GetState(void);
static memory_arena *W_FrameArena(void);

//- sixten: Commands
static void W_IssueCommand(workspace_command_sig *Sig, u64 Argument);
static void W_ProcessCommands(void);

//- sixten: Panels
static workspace_panel *W_CreateNewPanel(workspace_panel *Parent);
static void W_DeletePanel(workspace_panel *Panel);
static void W_SplitPanel(workspace_panel *Panel, axis2 Axis);

//- sixten: Builder code
static ui_signal W_BuildToolbarButton(char *Text, toolbar_menu Menu);
static ui_signal W_BuildMenuItem(u32 Icon, char *Text, char *Shortcut);
static void W_BuildToolbar(r32 dtForFrame);

//- sixten: Workspace
static void W_Init(workspace *Workspace);
static void W_Update(workspace *Workspace, vn_render_commands *RenderCommands, vn_input *Input, glyph_atlas *GlyphAtlas);

#endif //VN_WORKSPACE_H
