package org.dromara.app.service;

import org.dromara.app.domain.mqtt.DeviceCommand;

import java.util.Map;

/**
 * 设备命令下发业务层接口。
 * <p>
 * 封装命令构造、设备校验、下发与日志记录，避免各业务方直接拼装 {@link DeviceCommand}。
 *
 * @author water team
 */
public interface IDeviceCommandService {

    /**
     * 通用命令下发。
     *
     * @param command 命令对象（commandId 为空时自动生成）
     * @return commandId
     */
    String sendCommand(DeviceCommand command);

    /**
     * 下发设备开关/浇水命令。
     *
     * @param deviceNo    设备编号
     * @param workStatus  目标工作状态
     * @param startTime   开始时间（可为 null）
     * @param durationMin 持续时间（分钟）
     * @return commandId
     */
    String sendSwitchCommand(String deviceNo, String workStatus, String startTime, Integer durationMin);

    /**
     * 下发自定义命令。
     *
     * @param deviceNo    设备编号
     * @param commandType 命令类型
     * @param extra       额外参数
     * @return commandId
     */
    String sendCustomCommand(String deviceNo, String commandType, Map<String, Object> extra);

    /**
     * 下发排程绑定命令。
     *
     * @param deviceNo 设备编号
     * @param payload  排程信息
     * @return commandId
     */
    String sendScheduleBindCommand(String deviceNo, Map<String, Object> payload);
    String sendBindDeviceCommand(String deviceNo);

    /**
     * 下发排程解绑命令，通知设备清除指定排程。
     *
     * @param deviceNo   设备编号
     * @param scheduleId 排程ID
     * @return commandId
     */
    String sendScheduleUnbindCommand(String deviceNo, Long scheduleId);

    /**
     * 下发排程取消命令，通知设备暂停指定排程。
     *
     * @param deviceNo   设备编号
     * @param scheduleId 排程ID
     * @return commandId
     */
    String sendScheduleCanceledCommand(String deviceNo, Long scheduleId);

    /**
     * 下发设备初始化指令。用于解绑设备，允许设备未绑定用户时下发。
     *
     * @param deviceNo 设备编号
     * @return commandId
     */
    String sendInitDeviceCommand(String deviceNo);
}
