package cn.iocoder.yudao.module.system.service.remote;

import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.module.mqtt.api.path.dto.PathToRobotDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.LoginCheckDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotTransferDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteTaskTransferDTO;
import cn.iocoder.yudao.module.system.controller.admin.remote.vo.RemoteControllerInformationPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.remote.vo.RemoteControllerInformationSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.remote.RemoteControllerInformationDO;
import cn.iocoder.yudao.module.system.mq.message.remote.RemoteSendMessage;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

/**
 * 远遥设备信息 Service 接口
 *
 * @author 陈宾顺
 */
public interface RemoteControllerInformationService extends IService<RemoteControllerInformationDO> {

    /**
     * 创建远遥设备信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createControllerInformation(@Valid RemoteControllerInformationSaveReqVO createReqVO);

    /**
     * 更新远遥设备信息
     *
     * @param updateReqVO 更新信息
     */
    void updateControllerInformation(@Valid RemoteControllerInformationSaveReqVO updateReqVO);

    /**
     * 删除远遥设备信息
     *
     * @param id 编号
     */
    void deleteControllerInformation(Long id);

    /**
     * 获得远遥设备信息
     *
     * @param id 编号
     * @return 远遥设备信息
     */
    RemoteControllerInformationDO getControllerInformation(Long id);

    /**
     * 获得远遥设备信息分页
     *
     * @param pageReqVO 分页查询
     * @return 远遥设备信息分页
     */
    PageResult<RemoteControllerInformationDO> getControllerInformationPage(RemoteControllerInformationPageReqVO pageReqVO);

    /**
     * 保存远遥的IP和端口
     *
     * @param loginCheckDTO
     */
    void saveIpAndPort(LoginCheckDTO loginCheckDTO);

    /**
     * 查询远遥默认IP和端口
     *
     * @return
     */
    LoginCheckDTO getDefaultIpAndPort(String remoteIp);

    /**
     * 获取所有远遥信息
     *
     * @return
     */
    List<RemoteControllerInformationDO> getAllRemoteController();

    /**
     * 获取机器人远遥模式/急停/协控状态
     *
     * @param ip
     * @return
     */
    RemoteRobotStatusDTO getRemoteRobotStatus(String ip);

    /**
     * 根据机器人编号查询
     *
     * @param robotNo
     * @return
     */
    RemoteControllerInformationDO getRemoteControllerByRobotNo(String robotNo);

    /**
     * 远遥切换模式
     *
     * @param remoteMode
     * @param remoteIp
     */
    RemoteRobotTransferDTO robotChangeMode(Integer remoteMode, String remoteIp, String robotNo, int remoteControllerPort, String remoteControllerIp);

    /**
     * 任务转移给空闲车辆
     * @param data
     */
    void remoteTransferTaskToFreeRobot(RemoteTaskTransferDTO data);

    /**
     * 车辆换图修改限速
     * @param pathPosedsDTO
     */
    void robotChangeSpeed(PathToRobotDTO pathRobotDTO);

    /**
     * 断开连接
     * @param remoteIp
     */
    RemoteRobotTransferDTO remoteDisconnect(String remoteIp);

    /**
     * 重复发送断开连接的请求
     * @param message
     */
    void repeatedTransmissionDisconnect(RemoteSendMessage message);

    /**
     * 任务完成/取货完成
     * @param remoteIp
     * @param mode
     */
    void remoteTaskDone(String remoteIp, Integer mode);

    List<String> getRemoteControllerRobotNos();
}
