#ifndef INFINITE_CANVAS_WEB_SURFACE_H
#define INFINITE_CANVAS_WEB_SURFACE_H

#include "infinite_canvas/canvas.h"

#define CANVAS_MAX_WEB_VIEWS 12

typedef enum {
    CANVAS_DICTATION_EVENT_NONE = 0,
    CANVAS_DICTATION_EVENT_STATUS,
    CANVAS_DICTATION_EVENT_PARTIAL,
    CANVAS_DICTATION_EVENT_FINAL,
} Canvas_Dictation_Event;

typedef struct {
    uint32 entity_id;
    Canvas_Entity_Type entity_type;
    void *p_native;
    uint8 *p_pixels;
    Texture2D texture;
    int32 texture_width;
    int32 texture_height;
    size_t pixel_capacity;
    char source_url[CANVAS_ENTITY_TEXT_CAPACITY];
    char url[CANVAS_ENTITY_TEXT_CAPACITY];
    char dictation_text[CANVAS_ENTITY_TEXT_CAPACITY];
    uint32 dictation_sequence;
    uint32 consumed_dictation_sequence;
    int32 dictation_command;
    Canvas_Dictation_Event dictation_event;
    boolean is_dictation_transport;
    boolean can_go_back;
    boolean can_go_forward;
    boolean color_scheme_applied;
    boolean applied_dark_mode;
    boolean active;
    boolean browser_created;
    boolean texture_ready;
    boolean pixels_dirty;
} Canvas_Web_View;

typedef struct {
    Dowa_Arena *p_arena;
    void *p_native;
    Canvas_Web_View views[CANVAS_MAX_WEB_VIEWS];
    uint32 focused_entity_id;
    int32 pending_dictation_command;
    boolean dark_mode;
    boolean initialized;
} Canvas_Web_Surface;

#if defined(__cplusplus)
extern "C" {
#endif

int32 Canvas_Web_Surface_Execute_Subprocess(int argc, char **p_argv);
boolean Canvas_Web_Surface_Init(
    Canvas_Web_Surface *p_surface,
    Dowa_Arena *p_arena,
    boolean dark_mode);
void Canvas_Web_Surface_Set_Dark_Mode(
    Canvas_Web_Surface *p_surface,
    boolean dark_mode);
boolean Canvas_Web_Surface_Update_Input(
    Canvas_Web_Surface *p_surface,
    const Canvas_Camera *p_camera,
    const Canvas_Scene *p_scene);
void Canvas_Web_Surface_Sync(
    Canvas_Web_Surface *p_surface,
    const Canvas_Camera *p_camera,
    const Canvas_Scene *p_scene);
void Canvas_Web_Surface_Draw(
    const Canvas_Web_Surface *p_surface,
    const Canvas_Camera *p_camera,
    const Canvas_Scene *p_scene);
void Canvas_Web_Surface_Draw_Entity(
    const Canvas_Web_Surface *p_surface,
    const Canvas_Camera *p_camera,
    const Canvas_Scene *p_scene,
    size_t entity_index);
const char *Canvas_Web_Surface_URL(
    const Canvas_Web_Surface *p_surface,
    uint32 entity_id);
boolean Canvas_Web_Surface_Can_Go_Back(
    const Canvas_Web_Surface *p_surface,
    uint32 entity_id);
boolean Canvas_Web_Surface_Can_Go_Forward(
    const Canvas_Web_Surface *p_surface,
    uint32 entity_id);
void Canvas_Web_Surface_Go_Back(
    Canvas_Web_Surface *p_surface,
    uint32 entity_id);
void Canvas_Web_Surface_Go_Forward(
    Canvas_Web_Surface *p_surface,
    uint32 entity_id);
void Canvas_Web_Surface_Set_Dictation_Active(
    Canvas_Web_Surface *p_surface,
    boolean active);
void Canvas_Web_Surface_Commit_Dictation(
    Canvas_Web_Surface *p_surface);
Canvas_Dictation_Event Canvas_Web_Surface_Consume_Dictation(
    Canvas_Web_Surface *p_surface,
    char *p_text,
    size_t text_capacity);
boolean Canvas_Web_Surface_Is_Focused(const Canvas_Web_Surface *p_surface);
void Canvas_Web_Surface_Shutdown(Canvas_Web_Surface *p_surface);

#if defined(__cplusplus)
}
#endif

#endif
