#pragma once

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

#include "esp_err.h"

#ifdef __cplusplus
extern "C" {
#endif

#define PORTRAIT_MAX_STROKES 96
#define PORTRAIT_MAX_POINTS 4096

typedef enum {
    PORTRAIT_STROKE_XDOG = 0,
    PORTRAIT_STROKE_LEFT_EYE,
    PORTRAIT_STROKE_RIGHT_EYE,
    PORTRAIT_STROKE_MOUTH,
} portrait_stroke_type_t;

typedef struct {
    int16_t x;
    int16_t y;
} portrait_point_t;

typedef struct {
    portrait_stroke_type_t type;
    uint16_t first_point;
    uint16_t point_count;
} portrait_stroke_t;

typedef struct {
    uint32_t timestamp_ms;
    int16_t canvas_w;
    int16_t canvas_h;
    bool has_face;
    float face_score;
    int16_t bbox[4];
    int16_t keypoint[10];
    uint16_t stroke_count;
    uint16_t point_count;
    char message[96];
    portrait_stroke_t strokes[PORTRAIT_MAX_STROKES];
    portrait_point_t points[PORTRAIT_MAX_POINTS];
} portrait_result_t;

esp_err_t portrait_engine_init(void);
esp_err_t portrait_engine_capture_and_generate(void);
esp_err_t portrait_engine_capture_and_wait(uint32_t timeout_ms);
void portrait_engine_request_capture(void);
bool portrait_engine_capture_is_busy(void);

void portrait_engine_lock(void);
void portrait_engine_unlock(void);
const portrait_result_t *portrait_engine_get_result_locked(void);
const uint8_t *portrait_engine_get_jpeg_locked(size_t *len);
const char *portrait_stroke_type_name(portrait_stroke_type_t type);

#ifdef __cplusplus
}
#endif
