package com.fuyuanshen.global.mqtt.service;

import com.alibaba.fastjson2.JSONObject;
import com.fuyuanshen.global.mqtt.base.MqttMessage;

/**
 * 通用IoT设备MQTT协议服务接口
 * 遵循统一的MQTT通信协议规范
 */
public interface IotMqttService {

    /**
     * 构建下发指令主题
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @return 指令主题
     */
    String buildCommandTopic(String tenantCode, Long deviceType, String imei);

    /**
     * 构建响应数据主题
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @return 响应主题
     */
    String buildStatusTopic(String tenantCode, String deviceType, String imei);

    /**
     * 构建设备上报数据主题
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @return 上报主题
     */
    String buildReportTopic(String tenantCode, String deviceType, String imei);

    /**
     * 发送指令到设备
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @param message    指令消息 (JSON格式)
     */
    void sendCommand(String tenantCode, Long deviceType, String imei, MqttMessage message);

    /**
     * 发送响应消息到设备
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @param message    响应消息 (JSON格式)
     */
    void sendStatus(String tenantCode, String deviceType, String imei, JSONObject message);

    /**
     * 发送设备上报数据的确认消息
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @param message    确认消息 (JSON格式)
     */
    void sendReportAck(String tenantCode, String deviceType, String imei, JSONObject message);

    /**
     * 处理设备上报的单个传感器数据
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @param sensor     传感器名称
     * @param value      传感器值
     * @param timestamp  时间戳
     */
    void handleSingleReport(String tenantCode, String deviceType, String imei,
                            String sensor, Object value, Long timestamp);

    /**
     * 处理设备上报的批量传感器数据
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @param batchData  批量数据
     * @param timestamp  时间戳
     */
    void handleBatchReport(String tenantCode, String deviceType, String imei,
                           JSONObject batchData, Long timestamp);

    /**
     * 处理设备对指令的响应
     *
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei       设备IMEI
     * @param message    响应消息 (JSON格式)
     */
    void handleCommandResponse(String tenantCode, String deviceType, String imei, JSONObject message);
}