#ifndef OTA_OFFER_PROTOCOL_H
#define OTA_OFFER_PROTOCOL_H

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

#include "cJSON.h"

/** 设备 → 手机：询问是否 OTA（手机 message_type=6 后回复）及 OTA 结束汇报 */
#define OTA_MSG_DEVICE_OFFER     1002
/** 手机 → 设备：同意开始二进制 OTA（随后发 0x01/0x02/0x03） */
#define OTA_MSG_PHONE_OTA_START  0

typedef void (*ota_offer_done_cb_t)(bool success, uint32_t bytes_written, const char *err_step);

/** 上电/链路启动时调用，允许再次发送询问 JSON */
void ota_offer_reset_boot(void);

/** @deprecated 已由 message_type=6 触发；保留供兼容 */
bool ota_offer_mark_query_sent(void);

/** @deprecated */
void ota_offer_reset_query_sent(void);

/** OTA 二进制结束/失败时由 ota_binary_stream 调用 */
void ota_offer_notify_done(bool success, uint32_t bytes_written, const char *err_step);

/** 是否已允许接收 OTA 二进制（手机已回复 message_type=0） */
bool ota_offer_is_armed(void);

/** 取消 OTA 武装（链路清空/卡顿恢复时调用，不重置开机询问标记） */
void ota_offer_disarm(void);

/**
 * 解析手机 JSON；head.message_type==0 时置位 armed 并返回 true
 */
bool ota_offer_parse_phone_response(cJSON *root);

/** 构造询问 JSON：head.message_type=1002, body.phase=query */
char *ota_offer_query_json_malloc(const char *device_id);

/** 构造结果 JSON：head.message_type=1002, body.phase=done */
char *ota_offer_result_json_malloc(const char *device_id,
                                   bool success,
                                   uint32_t bytes_written,
                                   const char *err_step);

void ota_offer_set_done_callback(ota_offer_done_cb_t cb);

#endif
