package com.njcn.gather.device.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.common.pojo.poi.PullDown;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.gather.device.pojo.dto.DataCheckResDTO;
import com.njcn.gather.device.pojo.enums.TimeCheckResultEnum;
import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqDev;
import com.njcn.gather.device.pojo.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * @author caozehui
 * @date 2024/11/06
 */
public interface IPqDevService extends IService<PqDev> {

    /**
     * 分页查询被检设备列表
     *
     * @param queryParam 查询参数
     * @return 分页数据，包含被检设备列表
     */
    Page<PqDevVO> listPqDevs(PqDevParam.QueryParam queryParam);

    /**
     * 新增被检设备信息
     *
     * @param pqDevParam 被检设备信息
     * @return 新增成功返回true，否则返回false
     */
    boolean addPqDev(PqDevParam pqDevParam);

    /**
     * 修改被检设备信息
     *
     * @param updateParam 被检设备信息
     * @return 修改成功返回true，否则返回false
     */
    boolean updatePqDev(PqDevParam.UpdateParam updateParam);

    /**
     * 删除被检设备信息
     *
     * @param param 被检设备信息
     * @return 删除成功返回true，否则返回false
     */
    boolean deletePqDev(PqDevParam.DeleteParam param);

    /**
     * 批量更新被检设备守时检测结果
     *
     * @param ids    被检设备id列表
     * @param result 守时检测结果
     * @return 更新成功返回true，否则返回false
     */
    boolean updatePqDevTimeCheckResult(List<String> ids, TimeCheckResultEnum result);

    /**
     * 获取所有未绑定的设备
     *
     * @param pattern 模式Id
     * @return 未绑定的设备列表
     */
    List<Map<String, Object>> listUnbound(String pattern);

    /**
     * 根据计划id获取绑定的设备
     *
     * @param param 计划id
     * @return 绑定的设备列表
     */
    List<PqDevVO> listByPlanId(PqDevParam.QueryParam param);

    /**
     * 绑定计划
     *
     * @param planId 计划id
     * @param devIds 设备id列表
     * @return 绑定成功返回true，否则返回false
     */
    Integer bind(String planId, List<String> devIds);

    /**
     * 根据id获取被检设备信息
     *
     * @param id 被检设备id
     * @return
     */
    PqDevVO getPqDevById(String id);

    /**
     * 下载设备图片
     *
     * @param id 设备id
     * @param response 响应
     */
    void previewImage(String id, String fileName, HttpServletResponse response);

    void downloadImage(String id, String fileName, HttpServletResponse response);

    /**
     * 获取装置信息和装置下监测点信息
     *
     * @param devIds
     * @return: java.util.List<com.njcn.gather.device.pojo.vo.PreDetection>
     * @Author: wr
     * @Date: 2024/12/12 15:50
     */
    List<PreDetection> getDevInfo(@Param("devIds") List<String> devIds);


    /**
     * 正式监测完成，修改中断状态
     *
     * @param ids
     * @param adType
     * @param code
     * @param userId
     * @param temperature
     * @param humidity
     * @param updateCheckNum 是否更新检测次数
     * @return
     */
    boolean updateResult(List<String> ids, List<String> adType, String code, String userId, Float temperature, Float humidity, boolean updateCheckNum);

    /**
     * 新一轮正式检测真正开始前，仅清理原检测中设备的暂存耗时，并把本次设备置为检测中。
     */
    void clearFormalProgressForNewRun(List<String> devIds);

    Integer getMinFormalCheckTime(List<String> devIds);

    /**
     * 比对式-修改设备状态
     *
     * @param devId
     * @param userId
     */
    void updateResult(String devId, String userId);

    void updatePqDevReportState(String devId, int i);

    long countUnReportDev(String planId);

    /**
     * 根据计划id列表获取设备列表
     *
     * @param planIds
     * @return
     */
    List<PqDev> listByPlanIds(List<String> planIds);

    /**
     * 导出设备数据
     *
     * @param queryParam
     */
    void exportDev(PqDevParam.QueryParam queryParam);

    /**
     * 下载模板文件
     *
     * @param patternId 模式Id
     */
    void downloadTemplate(String patternId);

    /**
     * 导入设备数据
     *
     * @param file      上传的文件
     * @param patternId 模式Id
     * @param planId    计划Id
     * @param response  响应
     */
    HttpResult importDev(MultipartFile file, String patternId, String planId, HttpServletResponse response, Integer cover);

    /**
     * 导入灿能二楼设备数据
     *
     * @param file      上传的文件
     * @param patternId 模式Id
     * @param planId    计划Id
     * @param response  响应
     */
    boolean importCNDev(MultipartFile file, String patternId, String planId, HttpServletResponse response);

    /**
     * 导入灿能二楼设备数据
     *
     * @param cnDevExcelList
     * @param patternId
     * @param planId
     */
    boolean importCNDev(List<CNDevExcel> cnDevExcelList, String patternId, String planId);

    /**
     * 可视化-灿能二楼设备
     *
     * @param pqDevs
     */
    void visualizeCNDev(List<PqDevVO> pqDevs);

    /**
     * 逆向可视化-灿能二楼设备
     *
     * @param pqDevs    设备列表
     * @param patternId 模式Id
     */
    void reverseVisualizeCNDev(List<PqDev> pqDevs, String patternId);

    /**
     * 导入省级平台设备数据
     *
     * @param file      上传的文件
     * @param patternId 模式Id
     * @param planId    计划Id
     * @param response  响应
     */
    boolean importProvinceDev(MultipartFile file, String patternId, String planId, HttpServletResponse response);

    /**
     * 导入省级平台设备数据
     *
     * @param proviceDevExcelList
     * @param patternId
     * @param planId
     */
    boolean importProvinceDev(List<ProvinceDevExcel> proviceDevExcelList, String patternId, String planId);

    /**
     * 可视化-省级平台设备
     *
     * @param pqDevs
     */
    void visualizeProvinceDev(List<PqDevVO> pqDevs);

    /**
     * 逆向可视化-省级平台设备
     *
     * @param pqDevs    设备列表
     * @param patternId 模式Id
     */
    void reverseVisualizeProvinceDev(List<PqDev> pqDevs, String patternId);

    /**
     * 获取省级平台设备导出、导出文件模板的下拉列表
     *
     * @param startCol 开始列
     * @return
     */
    List<PullDown> getProvinceDevPullDownList(int startCol);

    /**
     * 获取灿能二楼设备导出、导出文件模板的下拉列表
     *
     * @param startCol 开始列
     * @return
     */
    List<PullDown> getCNDevPullDownList(int startCol);

    /**
     * 导入比对式设备数据
     *
     * @param file      上传的文件
     * @param patternId 模式Id
     * @param planId    计划Id
     * @param response  响应
     */
    HttpResult importContrastDev(MultipartFile file, String patternId, String planId, HttpServletResponse response, Integer cover);

    /**
     * 导入比对式设备数据
     *
     * @param contrastDevExcelList
     * @param patternId
     */
    HttpResult importContrastDev(List<ContrastDevExcel> contrastDevExcelList, String patternId, String planId, Integer cover);

    /**
     * 获取比对式设备导出、导出文件模板的下拉列表
     *
     * @param startCol
     * @return
     */
    List<PullDown> getContrastDevPullDownList(int startCol);

    /**
     * 根据历史记录来获取下拉框内容
     *
     * @param pattern
     * @return
     */
    Map<String, List<String>> listSelectOptions(String pattern);

    /**
     * 获取比对式设备导出数据
     *
     * @param pqDevVOList 设备id列表
     * @return
     */
    List<ContrastDevExcel> getExportContrastDevData(List<PqDevVO> pqDevVOList);

    /**
     * 获取接入测试-数据校验结果
     * @param monitorId
     * @return
     */
    DataCheckResDTO getDataCheckRes(String monitorId);
}
