/* date = July 11th 2023 0:34 pm */

#ifndef VN_WORKSPACE_TEXT_EDITOR_H
#define VN_WORKSPACE_TEXT_EDITOR_H

////////////////////////////////
//~ sixten: Mutable String Types

struct mutable_string
{
    memory_arena *Arena;
    string String;
};

////////////////////////////////
//~ sixten: History & Undo Types

struct history_entry
{
    range1_s64 Range;
    string ReplaceString;
};

struct history_node
{
    history_node *Next;
    history_node *Prev;
    history_entry Forward;
    history_entry Backward;
};

struct history_list
{
    history_node *At;
    history_node Sentinel;
};

////////////////////////////////
//~ sixten: Workspace Text Editor Types

struct workspace_text_data
{
    token_array Tokens;
    range1_s64_array Lines;
};

struct workspace_text_editor_lister_action
{
    b32 HasRequestedFile;
    string Path;
    string Name;
};

struct workspace_view_text_editor
{
    // sixten: processed text
    memory_arena *ProcessingArena;
    token_array Tokens;
    range1_s64_array Lines;
    compiled_scene Compiled;
    
    // sixten: text being edited
    string FileName;
    string FilePath;
    mutable_string Text;
    
    // sixten: text editing
    text_edit_state EditState;
    text_point LastTextPoint;
    
    // sixten: text rendering
    r32 FontSize;
    
    // sixten: history
    memory_arena *HistoryArena;
    history_list History;
    history_node *SavePoint;
    
    // sixten: ui building & rendering
    ui_box *ContainerBox;
    v2 TextDim;
    v2 Offset;
    b32 DropdownActive;
    v2 DropdownP;
    r32 DropdownTransition;
    
    // sixten: file lister
    string Path;
    r32 ListerScroll;
    u8 ListerInput[256];
    s32 ListerInputUsed;
    text_edit_state ListerInputEditState;
};

////////////////////////////////
//~ sixten: Mutable String Functions

static mutable_string MutableStringAllocate(u64 Size);
static void MutableStringRelease(mutable_string *String);
static void MutableStringReplaceRange(mutable_string *String, string ReplaceString, range1_s64 Range);

////////////////////////////////
//~ sixten: History & Undo Functions

static history_entry HistoryEntry(memory_arena *Arena, string ReplaceString, range1_s64 Range);
static void AppendToHistory(memory_arena *Arena, history_list *List, history_entry Forward, history_entry Backward);

////////////////////////////////
//~ sixten: Workspace Text Editing Functions

static workspace_text_data W_TextDataFromString(memory_arena *Arena, string Text);
static void W_TextEditorApplyChanges(workspace_view_text_editor *Editor);
static void W_SaveTextEditorToFile(workspace_view_text_editor *Editor);

////////////////////////////////
//~ sixten: Workspace Text Editor Builder Functions

static UI_CUSTOM_DRAW_CALLBACK(W_TextEditorDrawCallback);
static b32 W_BuildTextEditorListerItem(string Text, u32 Icon);
static workspace_text_editor_lister_action W_BuildTextEditorLister(workspace_view *View, workspace_view_text_editor *Editor);
static b32 W_ProcessTextEditorEvent(workspace_view_text_editor *Editor, platform_event *Event);
static void W_BuildTextEditorInfoBar(workspace_view_text_editor *Editor);
static void W_BuildTextEditor(workspace_view *View);

#endif //VN_WORKSPACE_TEXT_EDITOR_H
