#ifndef W3CS_COMPACT_DRAW_H
#define W3CS_COMPACT_DRAW_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#include "w3cs_protocol.h"

#define W3CS_COMPACT_DRAW_MAX_PAYLOAD 48u

struct w3cs_indexed_draw {
    uint32_t primitive_type;
    int32_t base_vertex;
    uint32_t minimum_vertex;
    uint32_t vertex_count;
    uint32_t start_index;
    uint32_t primitive_count;
    uint32_t vertex_blob;
    uint32_t index_blob;
};

struct w3cs_compact_draw_state {
    struct w3cs_indexed_draw prior;
    uint32_t blob_ids[W3CS_COMPACT_DRAW_MAX_HANDLES];
    uint32_t blob_count;
};

void w3cs_compact_draw_reset(struct w3cs_compact_draw_state *state);
void w3cs_compact_draw_clear_handles(struct w3cs_compact_draw_state *state);
void w3cs_compact_draw_observe_blob(struct w3cs_compact_draw_state *state,
                                    uint32_t blob_id);
void w3cs_compact_draw_accept_full(struct w3cs_compact_draw_state *state,
                                   const struct w3cs_indexed_draw *draw);

/* Encode one draw and advance the predictor. A zero result means the output
 * capacity was insufficient. The caller may send the legacy 32-byte record;
 * the predictor has still advanced, so a later compact draw remains exact. */
size_t w3cs_compact_draw_encode(struct w3cs_compact_draw_state *state,
                                const struct w3cs_indexed_draw *draw,
                                uint8_t *output, size_t capacity);

/* Strict canonical decoder used by the native tests and offline validators.
 * Browser command-state.js implements the same small format. */
bool w3cs_compact_draw_decode(struct w3cs_compact_draw_state *state,
                              const uint8_t *input, size_t size,
                              struct w3cs_indexed_draw *draw);

#endif
