
--------------------------------------------------------------------------------
-- PaddleOCR ONNX 模块
--------------------------------------------------------------------------------

---@type onnxruntime*
local _onnxruntime = require("onnxruntime")

---@type image_cv*
local _image_cv = require("image.cv")

---@alias paddleocr_image_input string|ImageObject*

---@class paddleocr_point*
---@field x number 横坐标
---@field y number 纵坐标

---@class paddleocr_line*
---@field text string 识别文本
---@field confidence number 置信度
---@field box paddleocr_point*[] 文本框四点坐标
---@field x? number 横坐标
---@field y? number 纵坐标
---@field width? number 宽度
---@field height? number 高度

---@class paddleocr_result*
---@field text string 识别文本，按行拼接
---@field lines paddleocr_line*[] 文本行列表
---@field stats? table 批量识别统计信息

---@class paddleocr_options*
---@field det_model_path? string 检测模型路径
---@field rec_model_path? string 识别模型路径
---@field dict_path? string 字典路径
---@field det_model_dir? string 检测模型目录
---@field rec_model_dir? string 识别模型目录
---@field model_dir? string 模型根目录
---@field providers? string[] ONNX Runtime provider 列表
---@field fallback_to_cpu? boolean provider 失败时回退 CPU
---@field threads? integer 线程数
---@field max_side_len? integer 检测最长边
---@field det_db_thresh? number DB 阈值
---@field det_db_box_thresh? number DB 框阈值
---@field det_db_unclip_ratio? number DB 扩张比例
---@field det_db_use_dilate? boolean 是否膨胀
---@field det_use_polygon_score? boolean 是否使用多边形评分
---@field rec_batch? boolean 是否批量识别
---@field rec_batch_size? integer 批量大小
---@field rec_batch_min_size? integer 批量最小数量
---@field rec_bucket_width? boolean 是否按宽度分桶
---@field rec_bucket_width_stride? integer 宽度分桶步长
---@field use_space_char? boolean 是否使用空格字符
---@field coreml_compute_units? 'all'|'cpu_only'|'cpu_and_gpu'|'cpu_and_neural_engine' CoreML 计算单元
---@field coreml_enable_on_subgraph? boolean 是否在子图启用 CoreML
---@field coreml_require_static_input_shapes? boolean 是否要求静态输入形状
---@field coreml_create_mlprogram? boolean 是否创建 MLProgram

---@class paddleocr_call_options*
---@field return_text_only? boolean 是否只返回文本
---@field return_details? boolean 是否返回详细信息
---@field stats? boolean 是否返回统计信息

---@class paddleocr_model_info*
---@field mode? 'det'|'rec' 模式
---@field model_path? string 模型路径
---@field used_coreml? boolean 是否使用 CoreML EP
---@field input_name? string 输入名
---@field input_shape? integer[] 输入形状
---@field providers? string[] provider 列表
---@field outputs? { name: string, shape: integer[] }[] 输出信息

---@class paddleocr_session_info*
---@field session onnxruntime_session* ONNX Runtime 会话
---@field model_path string 模型路径
---@field dict_path? string 字典路径，仅识别模型存在
---@field input_name string 输入名
---@field output_names string[] 输出名
---@field model_info paddleocr_model_info* 模型信息

---@class paddleocr_det_config*
---@field max_side_len integer 检测最长边
---@field det_db_thresh number DB 阈值
---@field det_db_box_thresh number DB 框阈值
---@field det_db_unclip_ratio number DB 扩张比例
---@field det_db_use_dilate boolean 是否膨胀
---@field det_use_polygon_score boolean 是否使用多边形评分

---@class paddleocr_rec_config*
---@field batch boolean 是否批量识别
---@field batch_size integer 批量大小
---@field batch_min_size integer 批量最小数量
---@field bucket_width boolean 是否按宽度分桶
---@field bucket_width_stride integer 宽度分桶步长

---@class paddleocr_model_info_result*
---@field rec paddleocr_model_info* 识别模型信息
---@field det? paddleocr_model_info* 检测模型信息
---@field dict_path? string 字典路径
---@field det_config paddleocr_det_config* 检测配置
---@field rec_config paddleocr_rec_config* 识别配置

---@class paddleocr_instance*
---@field closed boolean 是否已关闭
---@field rec paddleocr_session_info* 识别会话信息
---@field det? paddleocr_session_info* 检测会话信息
---@field charset string[] 字符集
---@field det_config paddleocr_det_config* 检测配置
---@field rec_config paddleocr_rec_config* 识别配置
local paddleocr_instance = {}

---@class paddleocr_onnx*
---@field VERSION string 模块版本
---@field AUTHOR string 作者
---@type paddleocr_onnx*
local M = {}

--- 创建 OCR 实例
---@param opts? paddleocr_options* 选项
---@return paddleocr_instance* ocr OCR 实例
function M.new(opts) end

--- 创建 OCR 实例
---@param opts? paddleocr_options* 选项
---@return paddleocr_instance* ocr OCR 实例
function M.create(opts) end

--- 创建 OCR 实例
---@param opts? paddleocr_options* 选项
---@return paddleocr_instance* ocr OCR 实例
function M.open(opts) end

--- 识别整张图片
---@param input paddleocr_image_input 图片路径、图片数据或图片对象
---@param opts? paddleocr_call_options* 选项
---@return paddleocr_result|string result 识别结果，return_text_only 为 true 时返回文本
function paddleocr_instance:recognize(input, opts) end

--- 识别单行文字图片
---@param input paddleocr_image_input 图片路径、图片数据或图片对象
---@param opts? paddleocr_call_options* 选项
---@return paddleocr_line|string line 识别结果，return_text_only 为 true 时返回文本
function paddleocr_instance:recognize_line(input, opts) end

--- 识别单行文字图片
---@param input paddleocr_image_input 图片路径、图片数据或图片对象
---@param opts? paddleocr_call_options* 选项
---@return paddleocr_line|string line 识别结果，默认可返回文本
function paddleocr_instance:classification(input, opts) end

--- 识别整张图片
---@param input paddleocr_image_input 图片路径、图片数据或图片对象
---@param opts? paddleocr_call_options* 选项
---@return paddleocr_result|string result 识别结果
function paddleocr_instance:ocr(input, opts) end

--- 仅检测文本框
---@param input paddleocr_image_input 图片路径、图片数据或图片对象
---@return paddleocr_line*[] lines 文本框列表
function paddleocr_instance:detect(input) end

--- 仅检测文本框
---@param input paddleocr_image_input 图片路径、图片数据或图片对象
---@return paddleocr_line*[] lines 文本框列表
function paddleocr_instance:det(input) end

--- 获取模型信息
---@return paddleocr_model_info_result* info 模型信息
function paddleocr_instance:get_model_info() end

--- 关闭实例
function paddleocr_instance:close() end

return M
