/*
 * DWN - Desktop Window Manager
 * retoor <retoor@molodetz.nl>
 * OCR text extraction API
 */

#ifndef DWN_OCR_H
#define DWN_OCR_H

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

typedef enum {
    OCR_OK = 0,
    OCR_ERROR_INVALID_ARG,
    OCR_ERROR_INIT,
    OCR_ERROR_IMAGE,
    OCR_ERROR_NO_MEMORY,
    OCR_ERROR_NOT_AVAILABLE
} OcrStatus;

typedef enum {
    OCR_STATE_IDLE,
    OCR_STATE_PENDING,
    OCR_STATE_COMPLETED,
    OCR_STATE_ERROR
} OcrState;

typedef struct {
    char *text;
    size_t length;
    float confidence;
} OcrResult;

typedef struct OcrRequest {
    unsigned char *png_data;
    size_t png_size;
    char language[16];

    OcrResult result;
    OcrStatus status;
    OcrState state;

    void (*callback)(struct OcrRequest *req);
    void *user_data;

    pthread_t thread;
    struct OcrRequest *next;
} OcrRequest;

bool ocr_init(void);
void ocr_cleanup(void);
bool ocr_is_available(void);

OcrStatus ocr_extract_from_png(const unsigned char *png_data, size_t size,
                               const char *language, OcrResult *result);

OcrRequest *ocr_extract_async(const unsigned char *png_data, size_t size,
                              const char *language,
                              void (*callback)(OcrRequest *));

void ocr_process_pending(void);
void ocr_cancel(OcrRequest *req);

void ocr_result_free(OcrResult *result);

const char *ocr_status_string(OcrStatus status);

#endif
