/**
 * @file qdx_tcp_logic.h
 * @brief Zero-Copy TCP Network Logic and State Machine tailored for MCU
 *
 * Implements connection management (Dual Stream 5511/5512),
 * packet handling, heartbeating, config caching, and callbacks.
 */

#ifndef QDX_TCP_LOGIC_H
#define QDX_TCP_LOGIC_H

#include "qdx_protocol.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Initialize the TCP logic module
 *
 * @param deviceUUID Provide standard UUID for the device.
 * @param authToken Optional auth token for connections.
 * @return 0 on success, < 0 on failure.
 */
int8_t TcpLogic_Init(const uint8_t *deviceUUID, const uint8_t *authToken);

/**
 * @brief Wait for and start non-blocking network connection attempts.
 *
 * It will spawn background threads for Control and Data streams
 * connecting to the server.
 */
void TcpLogic_Start(void);

/**
 * @brief Encapsulate and send a temperature frame without generic memory copy.
 *
 * Uses the pre-filled `TcpTxBuffer_t` (containing image array) to prepend
 * the required nested headers directly into the buffer offset.
 *
 * @param io_buffer The user-allocated buffer containing Image payload starting
 * at HeadOffset
 * @param processMeta Real-time analysis metadata for the image data
 * @param frameType Frame type: 0=LIVE, 1=TRIGGER, 2=MASKED
 * @param is2D 1 for 2D matrix, 0 for 1D array
 * @return 0 successfully sent to transmission queue, < 0 if failed
 */
int8_t
TcpLogic_BuildAndSendTemperatureFrame(TcpTxBuffer_t *io_buffer,
                                      const PreprocessResult_t *processMeta,
                                      uint8_t frameType, uint8_t is2D);

/**
 * @brief Retrieves a distinct copy of the latest active configuration
 * structure.
 *
 * Recommended for safe reads of configuration during offline or fallback
 * scenarios. Requires pointers to pre-allocated Config* structures.
 *
 * @param out_common Required pointer to common config structure.
 * @param out_cfg2d Required pointer to 2d config structure.
 * @param out_cfg1d Required pointer to 1d config structure.
 * @return 0 on success, -1 if no configuration has been stored or received.
 */
int8_t TcpLogic_GetLatestConfig(ConfigCommon_t *out_common,
                                Config2D_t *out_cfg2d, Config1D_t *out_cfg1d);

/**
 * @brief Register configuration parsing event callback.
 *
 * Fired immediately after the host sends a Configuration payload and it is
 * safely cached to the internal registers.
 *
 * @param cb Callable function matching the interface
 */
void TcpLogic_RegisterConfigCallback(ConfigUpdateCallback_t cb);

/**
 * @brief Register remote decision consequence callback (e.g. Reject / Ok
 * processing result).
 *
 * Fired shortly after the host finishes processing a sent 2D or 1D target
 * frame.
 *
 * @param cb Callable function matching the interface
 */
void TcpLogic_RegisterDetectionCallback(DetectionResultCallback_t cb);

/**
 * @brief Callback for when host requests a temperature frame.
 *
 * Fired when the host sends a TYPE_TEMP_FRAME request (typically empty or
 * carrying trigger context). The device should capture an image and reply by
 * calling TcpLogic_BuildAndSendTemperatureFrame.
 *
 * @param is2dRequest Non-zero if request is specifically for 2D frame, zero if
 * for 1D.
 */
typedef void (*TempFrameRequestCallback_t)(uint8_t is2dRequest);

/**
 * @brief Register host temperature frame request callback.
 *
 * @param cb Callable function matching the interface
 */
void TcpLogic_RegisterTempFrameRequestCallback(TempFrameRequestCallback_t cb);

/**
 * @brief Inject configuration directly (for test mode without server).
 *
 * Sets the internal config cache and fires the config callback.
 * Only non-NULL parameters are updated.
 */
void TcpLogic_InjectTestConfig(const ConfigCommon_t *common,
                               const Config2D_t *cfg2d,
                               const Config1D_t *cfg1d);

#ifdef __cplusplus
}
#endif

#endif /* QDX_TCP_LOGIC_H */
