package org.nl.acs.instruction.service;

import org.nl.acs.instruction.domain.InstructionMybatis;
import org.nl.acs.instruction.service.dto.InstructionDto;
import org.nl.acs.instruction.service.dto.InstructionQueryParam;
import org.nl.acs.common.base.PageInfo;
import org.nl.acs.common.base.CommonService;
import org.nl.acs.instruction.domain.Instruction;
import org.springframework.data.domain.Pageable;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* @author jiaolm
* @date 2023-05-09
*/
public interface InstructionService extends CommonService<InstructionMybatis>  {

    static final String CACHE_KEY = "instruction";

    /**
    * 查询数据分页
    * @param query 条件
    * @param pageable 分页参数
    * @return PageInfo<InstructionDto>
    */
    PageInfo<InstructionDto> queryAll(InstructionQueryParam query, Pageable pageable);

    /**
    * 查询所有数据不分页
    * @param query 条件参数
    * @return List<InstructionDto>
    */
    List<InstructionDto> queryAll(InstructionQueryParam query);

    InstructionMybatis getById(String id);
    InstructionDto findById(String id);

    /**
     * 插入一条新数据。
     */
    int updateById(InstructionDto resources);
    int removeById(String id);
    int removeByIds(Set<String> ids);

    /**
    * 导出数据
    * @param all 待导出的数据
    * @param response /
    * @throws IOException /
    */
    // void download(List<InstructionDto> all, HttpServletResponse response) throws IOException;

    /**
     * 查询数据分页
     *
     * @param whereJson 条件
     * @param page      分页参数
     * @return Map<String, Object>
     */
    Map<String, Object> queryAll(Map whereJson, Pageable page);

    /**
     * 查询数据分页
     *
     * @param page 分页参数
     * @return Map<String, Object>
     */
    Map<String, Object> getAll(Map whereJson, Pageable page);

    /**
     * 查询指定任务的所有指令不分页
     *
     * @param id
     * @return
     */
    Map<String, Object> getByTaskId(String id);

    /**
     * 查询所有数据不分页
     *
     * @param whereJson 条件参数
     * @return List<Instruction>
     */
    List<Instruction> queryAll(Map whereJson);

    /**
     * 查询所有数据不分页
     *
     * @param whereJson 条件参数
     * @return List<Instruction>
     */
    List<Instruction> queryAll(String whereJson);

    /**
     * 数据同步
     */
    void reload();

    /**
     * 根据ID查询
     *
     * @param instruction_id ID
     * @return Instruction
     */
//    Instruction findById(String instruction_id);

    /**
     * 根据编码查询
     *
     * @param code code
     * @return Instruction
     */
    Instruction findByCode(String code);

    /**
     * 根据任务code查询
     *
     * @param code code
     * @return Instruction
     */
    Instruction findByTaskcode(String code);

    Instruction findByTaskcodeAndStatus(String code);

    /**
     * 根据任务id查询
     *
     * @param id id
     * @return Instruction
     */
    Instruction findByTaskid(String id, String wherecase);

    /**
     * 创建
     *
     * @param dto /
     */
    void create(Instruction dto) throws Exception;

    void create2(Instruction dto) throws Exception;
    /**
     * 再次创建
     *
     * @param dto
     * @throws Exception
     */
    void createAgain(Instruction dto) throws Exception ;

    /**
     * 编辑
     *
     * @param dto /
     */
    void update(Instruction dto);

    /**
     * 多选删除
     *
     * @param ids /
     */
    void deleteAll(String[] ids) throws Exception;

    /**
     * 导出数据
     *
     * @param dtos     待导出的数据
     * @param response /
     * @throws IOException /
     */
    void download(List<Instruction> dtos, HttpServletResponse response) throws IOException;

    /**
     * 完成指令
     *
     * @param id
     */
    void finish(String id) throws Exception;

    /**
     * 完成指令
     *
     * @param
     */
    void finish(Instruction dto) throws Exception;


    /**
     * 完成并创建下一条指令
     *
     * @param
     */
    void finishAndCreateNextInst(Instruction dto) throws Exception;


    /**
     * 取消指令
     *
     * @param id
     */
    void cancel(String id) throws Exception;

    /**
     * 取消指令
     *
     * @param id
     */
    void forceCancel(String id) throws Exception;

    /**
     * 取消指令不下发agv
     *
     * @param id
     */
    void cancelNOSendAgv(String id) throws Exception;

    /**
     * 根据指令编号缓存查询
     *
     * @param code code
     * @return Instruction
     */
    Instruction findByCodeFromCache(String code);



    List<Instruction> findByLinkNum(String code);

    /**
     * 根据关联编号查询下发任务
     *
     * @param code code
     * @return Instruction
     */
    Instruction findByLinkNumSend(String code);

    /**
     * 根据关联编号查询非下发任务
     *
     * @param code code
     * @return Instruction
     */
    Instruction findByLinkNumNoSend(String code);

    Instruction findByBarcodeFromCache(String barcode);

    /**
     * 根据设备缓存查询
     *
     * @param devicecode code
     * @return Instruction
     */
    Instruction findByDeviceCodeFromCache(String devicecode);

    /**
     * 根据设备id查询
     *
     * @param id
     * @return Instruction
     */
    Instruction findByIdFromCache(String id);

    /**
     * @param inst
     */
    Instruction foramte(Instruction inst);

    /**
     * 缓存中查询所有指令
     *
     * @return
     */
    List<Instruction> findAllInstFromCache();

    /**
     * 查询相同终点指令的数量
     *
     * @param code
     * @return
     */
    Integer querySameDestinationInst(String code);

    /**
     * 查询相同指令类型的数量
     *
     * @param inst_type
     * @return
     */
    Integer querySameInstType(String inst_type);

    /**
     * 查询相同起点指令的数量
     *
     * @param code
     * @return
     */
    Integer querySameOriginInst(String code);

    /**
     * 查询相同起点、终点指令的数量
     *
     * @param code
     * @return
     */
    //Integer querySameOriginInst(String code);

    boolean removeByCodeFromCache(String code);


    boolean createLkInst(String type, Instruction inst);


    void init(String id);
}
