package com.ktg.iscs.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.ktg.iscs.domain.IsCabinetOpenRecord;
import com.ktg.iscs.domain.IsMaterials;
import com.ktg.iscs.domain.dto.hardwareMaterialApi.*;
import com.ktg.iscs.domain.vo.hardwareMaterialApi.*;

import java.util.List;

/**
 * 硬件调用接口
 *
 * @author cgj
 * @date 2024-10-16
 */
public interface HardwareMaterialApiService {

    /**
     * 查询物资柜下物资类型，标注异常类型下的物资数量，展示异常物资
     * @param cabinetId
     * @return
     */
    List<ExMaterialTypeVO> selectExMaterialTypeById(Long cabinetId, String cabinetCode) throws JsonProcessingException;

    /**
     * 手动更换数据校验
     * @param dto
     * @return
     */
    Boolean checkReplaceData(ReplaceMaterialDTO dto);

    /**
     * 手动更换物资-校验后的提交
     * @param dto
     * @return
     */
    Boolean insertCheckedRecord(ReplaceMaterialParamDTO dto) throws JsonProcessingException;

    /**
     * 手动更换物资
     * @param dto
     * @return
     */
    Boolean insertReplaceRecord(ReplaceMaterialParamDTO dto) throws JsonProcessingException;

    /**
     * 手动更换物资-实体操作
     * @param dto
     * @return
     */
    Boolean updateMaterialsReplace(ReplaceMaterialsDTO dto);

    /**
     * 新增物资柜开门超时异常
     * @param dto
     * @return
     */
    Boolean insertCabinetOpenTimeout(OpenTimeoutDTO dto);

    /**
     * 解除柜开门超时异常
     * @param dto
     * @return
     */
    Boolean updateCabinetOpenTimeout(OpenTimeoutDTO dto);

    /**
     * 新增物资柜开门记录
     * @param dto
     * @return
     */
    Boolean insertCabinetOpenRecord(IsCabinetOpenRecord dto);

    /**
     * 物资柜关门
     * @param dto
     * @return
     */
    Boolean updateCabinetClose(IsCabinetOpenRecord dto);

    /**
     * 获取物资柜物品分类及分类下物资数量和列表
     * @param cabinetId
     * @return
     */
    List<CabinetMaterialVO> selectMaterialsByCabinetId(Long cabinetId, String cabinetCode) throws JsonProcessingException;

    /**
     * 通过RFID获取物资信息
     * @param rfid
     * @return
     */
    IsMaterials selectMaterialByRfid(String rfid);

    /**
     * 通过RFID列表获取批量物资信息
     * @param dto
     * @return
     */
    List<IsMaterials> selectMaterialsByRfidList(RfidListDTO dto);

    /**
     * 通过RFID列表获取批量物资信息
     * @param dto
     * @return
     */
    CabinetMaterialsVO selectCabinetMaterials(CabinetRfidListDTO dto);

    /**
     * 物资领取/归还
     * @param dto
     * @return
     */
    String updateMaterialReceiveReturn(RecRetParamDTO dto) throws Exception;

    /**
     * 查询物资使用说明
     * @return
     */
    List<InstructionVO> getInstructionsList();

    /**
     * 我的在某个柜子上的最近一次物资检查计划
     * @param cabinetCode
     * @return
     */
    CabinetCheckVO getLastCheckPlanByCabinetCode(String cabinetCode);

    /**
     * 主界面
     * @param cabinetCode
     * @return
     */
    CabinetHomePageVO getCabinetHomePage(String cabinetCode);

    /**
     * 物资检查表
     * @param cabinetCode
     * @return
     */
    MaterialsCheckInitVO getCheckMaterialsByCabinetCode(String cabinetCode, Long planId);

    /**
     * 提交物资检查记录
     * @param dto
     * @return
     */
    Boolean insertCheckRecord(CheckParamDTO dto);

    /**
     * 最终提交物资检查记录
     * @param dto
     * @return
     */
    Boolean insertSubmitPlan(SubmitPlanDTO dto);

    /**
     * 检查签名
     * @param dto
     * @return
     */
    Boolean insertSign(SignDTO dto);

    /**
     * 自动更换
     * @param dto
     * @return
     */
    AutoReplaceReportVO insertAutoChange(AutoChangeDTO dto);

    /**
     * 开始检查
     * @param dto
     * @return
     */
    Boolean startCheckPlan(StartCheckPlanDTO dto);

}
