/*
 * Mr. 4th Dimention - Allen Webster
 *
 * 14.08.2019
 *
 * Log parser.
 *
 */

// TOP

#if !defined(FCODER_LOG_PARSER_H)
#define FCODER_LOG_PARSER_H

typedef i64 Log_Tag_Kind;
enum{
    LogTagKind_Null,
    LogTagKind_Integer,
    LogTagKind_String,
};

typedef i32 Log_String_Source;
enum{
    LogParse_ExternalString,
    LogParse_PreAllocatedString,
};

struct Log_Tag_Value{
    Log_Tag_Kind kind;
    union{
        u64 value;
        i64 value_s;
    };
};

struct Log_Sort_Key{
    Log_Tag_Value value;
    i32 number;
};

struct Log_Tag_Name_Value{
    u64 name;
    Log_Tag_Value value;
};

struct Log_Tag{
    Log_Tag *next;
    u64 name;
    Log_Tag_Value value;
};

struct Log_Event{
    Log_Event *next;
    u64 src_file_name;
    u64 event_name;
    u64 line_number;
    
    Log_Tag *first_tag;
    Log_Tag *last_tag;
    i32 tag_count;
    
    i32 event_number;
    
    Table_u64_u64 tag_name_to_tag_ptr_table;
};

struct Log_Event_Ptr_Node{
    Log_Event_Ptr_Node *next;
    Log_Event *event;
};

struct Log_Event_List{
    Log_Event_Ptr_Node *first;
    Log_Event_Ptr_Node *last;
    i32 count;
};

struct Log_Event_Ptr_Array{
    Log_Event **events;
    i32 count;
};

struct Log_Tag_Value_Array{
    Log_Tag_Value *vals;
    i32 count;
};

struct Log_Parse{
    Arena *arena;
    
    Log_Event *first_event;
    Log_Event *last_event;
    i32 event_count;
    
    u64 string_id_counter;
    Table_Data_u64 string_to_id_table;
    Table_u64_Data id_to_string_table;
    
    Table_Data_u64 tag_value_to_event_list_table;
    Table_u64_u64 tag_name_to_event_list_table;
};

////////////////////////////////

struct Log_Graph_Thread_Bucket{
    Log_Graph_Thread_Bucket *next;
    Range_i32 range;
    b32 had_a_tag;
    u64 thread_id_value;
};

struct Log_Graph_Box{
    Log_Graph_Box *next;
    Rect_f32 rect;
    Log_Event *event;
};

typedef i32 Log_Filter_Kind;
enum{
    LogFilter_ERROR,
    LogFilter_TagValue,
    LogFilter_Tag,
};

struct Log_Filter{
    Log_Filter *next;
    Log_Filter *prev;
    Log_Filter_Kind kind;
    u64 tag_name_code;
    Log_Tag_Value tag_value;
};

struct Log_Filter_Set{
    Log_Filter filters_memory[20];
    Log_Filter *free_filters;
    Log_Filter *first;
    Log_Filter *last;
    i32 count;
    i32 alter_counter;
};

typedef i32 Log_Graph_List_Tab;
enum{
    LogTab_ERROR,
    LogTab_Filters,
    LogTab_Previews,
    LogTab_COUNT,
};

struct Log_Graph{
    b32 holding_temp;
    Temp_Memory temp;
    Rect_f32 layout_region;
    Face_ID face_id;
    i32 filter_alter_counter;
    i32 preview_alter_counter;
    Log_Graph_List_Tab tab;
    Rect_f32 details_region;
    Log_Event_List filtered_list;
    Log_Event_Ptr_Array event_array;
    Log_Graph_Thread_Bucket *first_bucket;
    Log_Graph_Thread_Bucket *last_bucket;
    i32 bucket_count;
    Log_Graph_Box *first_box;
    Log_Graph_Box *last_box;
    i32 box_count;
    f32 y_scroll;
    f32 max_y_scroll;
    Log_Event *selected_event;
    b32 has_unused_click;
    Vec2_f32 unused_click;
};

#endif

// BOTTOM