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

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.api.robot.websocket.RobotInformationVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
import cn.iocoder.yudao.module.system.controller.admin.statistics.dto.RobotStatusClassificationDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 车辆信息 Service 接口
 *
 * @author 陈宾顺
 */
public interface RobotInformationService extends IService<RobotInformationDO> {

    /**
     * 创建车辆信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createInformation(@Valid RobotInformationSaveReqVO createReqVO);

    /**
     * 更新车辆信息
     *
     * @param updateReqVO 更新信息
     */
    void updateInformation(@Valid RobotInformationSaveReqVO updateReqVO);

    /**
     * 删除车辆信息
     *
     * @param id 编号
     */
    void deleteInformation(Long id);

    /**
     * 获得车辆信息
     *
     * @param id 编号
     * @return 车辆信息
     */
    RobotInformationRespVO getInformation(Long id);

    /**
     * 获得车辆信息分页
     *
     * @param pageReqVO 分页查询
     * @return 车辆信息分页
     */
    PageResult<RobotInformationPageRespVO> getInformationPage(RobotInformationPageReqVO pageReqVO);

    /**
     * 统计车辆待命/任务中/离线
     *
     * @return
     */
    RobotInformationStatisticsVO statisticsInformation();

    /**
     * 车机mac地址获取电量
     * @param str
     * type 1:是mac， 0 :是车辆编号
     * @return
     */
    String getSocByMac(String str, Integer type);

    /**
     * 获取所有AGV状态
     * @return
     */
    List<RobotInfoStatusVO> getAGVListStatusInfo();

    /**
     * 查询能正常使用的车辆
     *
     * @return
     */
    List<RobotInformationDO> getCanUseRobot();

    /**
     * 查询所有车辆
     *
     * @return
     */
    List<RobotInformationDO> getAllRobot();

    /**
     * 查询机器人编号
     *
     * @param mac
     * @return
     */
    String getRobotNoByMac(String mac);

    /**
     * @param dto
     */
    void test(@Valid RobotStatusDTO dto);

    /**
     * 获取所有的车辆信息 (缓存中获取)
     *
     * @return
     */
    Map<String, RobotInformationVO> getAllRobotByRedis();

    /**
     * 通过macAddress 获取设备基础信息 - 然后存入到redis中
     *
     * @param macAddress
     * @return
     */
    RobotInformationVO getRobotByRedis(String macAddress);

    /**
     * 根据机器人编号获取mac地址
     * @param robotNo
     * @return
     */
    String getMacByRobotNo(String robotNo);

    /**
     * 获取机器人全部信息和异常信息
     * @return
     */
    List<RobotInformationRespVO> getAllRobotAndErrorMsg();


    /**
     * 根据地图id查询车辆信息
     * @param mapId
     * @return
     */
    List<RobotInformationDO> getListByMapId(Long mapId);

    RobotInformationDO getRobotInformationByDetailId(String taskDetailId);

    /**
     * 维护车机心跳
     */
    void rcsHeartBeat();

    /**
     * 清除交管
     * @param robotNo
     */
    void cleanTrafficManagement(String robotNo);

    /**
     * 继续做任务
     * @param robotNo
     */
    void doTaskContinue(String robotNo,Boolean isRobot);

    /**
     *
     * @param id
     * @param mac
     * @param orderType
     */
    void robotCloseTaskDetail(String id, String mac, String orderType);

    /**
     * 获取楼层区域对应的机器人编号
     * @param floor
     * @param area
     * @return
     */
    List<String> getRobotByFloorAndArea(String floor, String area);

    /**
     * 车辆一键暂停或启动
     * @param robotSimulationPose
     * @param robotNos
     * @param str
     */
    void sendEmergencyStopOrRecoveryToRobot(RobotAcceptTaskDTO robotSimulationPose, List<String> robotNos, String str);

    /**
     * 查询机器人处理中的任务
     * @param robotNo
     * @return
     */
    List<RobotTaskDO> selectDoingTaskByRobotNo(String robotNo);

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

    /**
     * 校验机器人是否到达设定的电量
     * @param information
     * @param commonConfig
     * @return
     */
    Boolean checkRobotElectricity(RobotInformationDO information, CommonConfigDO commonConfig);

    /**
     * 根据车辆编号查询
     * @param robotNos
     * @return
     */
    List<RobotInformationDO> getRobotInformationByRobotNos(List<String> robotNos);

    /**
     * 查询楼层区域
     * @param robotNo
     * @return
     */
    FloorZoneDTO getFloorZoneDTOByRobotNo(String robotNo);

    /**
     * 远遥将任务切换给空闲机器人
     * @param id
     * @param robotNo
     */
    void rmoteTransferTaskToNewFreeRobo(String oldRobotNo ,Long id, String robotNo);

    /**
     * 设置车辆空闲
     * @param robotNo
     */
    void setRobotFree(String robotNo);

    /**
     * 校验端口和IP
     * @param updateObj
     */
    void checkIpAndPort(RobotInformationDO updateObj);

    /**
     * 统计车辆状态分类
     * @return
     */
    RobotStatusClassificationDTO robotStatusClassification();

    /**
     * 查询车辆所在的地图id
     * @param robotNo
     * @return
     */
    Long getRobotMapIdByRobotNo(String robotNo);

    void sendRobotConfigToPP();

    void stopRobot(String robotNo);

    void continueRobot(String robotNo);

    void initRobotInformation();

    /**
     * 锁车
     * @param robotNo
     */
    void lockRobot(String robotNo);
}
