package com.njcn.gather.plan.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqStandardDev;
import com.njcn.gather.plan.pojo.param.AdPlanParam;
import com.njcn.gather.plan.pojo.po.AdPlan;
import com.njcn.gather.plan.pojo.vo.AdPlanVO;
import com.njcn.gather.plan.pojo.vo.PlanStatisticsVO;
import org.springframework.web.multipart.MultipartFile;

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

/**
 * @author caozehui
 * @date 2024-12-09
 */
public interface IAdPlanService extends IService<AdPlan> {

    /**
     * 分页查询检测计划
     *
     * @param queryParam 分页查询参数
     * @return 分页查询结果
     */
    List<AdPlanVO> listAdPlan(AdPlanParam.QueryParam queryParam);

    /**
     * 新增检测计划
     *
     * @param param 检测计划参数
     * @return 新增成功则返回true，否则返回false
     */
    boolean addAdPlan(AdPlanParam param);

    /**
     * 更新检测计划
     *
     * @param param 更新参数
     * @return 更新成功则返回true，否则返回false
     */
    boolean updateAdPlan(AdPlanParam.UpdateParam param);

    /**
     * 删除检测计划
     *
     * @param ids     检测计划id列表
     * @param pattern 模式Id
     * @return 删除成功则返回true，否则返回false
     */
    boolean deleteAdPlan(List<String> ids, String pattern);

    /**
     * 根据模式查询检测计划
     *
     * @param pattern 模式Id
     * @return 检测计划列表
     */
    List<Map<String, Object>> listByPattern(String pattern);

    /**
     * 可视化
     *
     * @param planList 检测计划列表
     */
    void visualize(List<AdPlan> planList);

    /**
     * 获取检测大项
     *
     * @param reCheckType 0:不合格项复检 1:全部复检
     * @param planId      检测计划Id
     * @param devIds      设备Id列表
     * @param patternId   模式Id
     * @param scriptType  脚本类型
     * @return
     */
    List<Map<String, String>> getBigTestItem(Integer reCheckType, String planId, List<String> devIds, String patternId, String scriptType);

    /**
     * 修改计划状态
     *
     * @param planId
     * @param devIds
     * @return
     */
    //boolean updateTestState(String planId, List<String> devIds);

    /**
     * 数据状态回退
     *
     * @param planId
     * @param devIds
     * @return
     */
    boolean updateBackTestState(String planId, List<String> devIds);

    void finishPlan(String planId);

    /**
     * 数据分析
     *
     * @param ids
     */
    void analyse(List<String> ids);

    /**
     * 统计检测计划结果。
     *
     * @param planId 检测计划ID
     * @return 检测计划统计结果
     */
    PlanStatisticsVO statistics(AdPlanParam.StatisticsParam param);

    /**
     * 导出检测计划数据
     *
     * @param queryParam
     */
    void exportPlan(AdPlanParam.QueryParam queryParam);

    /**
     * 下载检测计划模板
     *
     * @param patternId
     */
    void downloadTemplate(String patternId);

    /**
     * 导入检测计划数据
     *
     * @param file
     * @param patternId
     * @param response
     */
    boolean importPlan(MultipartFile file, String patternId, HttpServletResponse response);


    /**
     * 根据父计划Id获取未被子计划绑定的标准设备
     *
     * @param fatherPlanId
     * @return
     */
    List<PqStandardDev> getUnBoundStandardDev(String fatherPlanId);

    /**
     * 根据计划Id获取已绑定标准设备
     *
     * @param planId
     * @param all
     * @return
     */
    List<PqStandardDev> getBoundStandardDev(String planId, Integer all);

    /**
     * 修改子计划名称
     *
     * @param planId
     * @param name
     * @return
     */
    boolean updateSubPlanName(String planId, String name);

    /**
     * 子计划绑定/解绑被检设备
     *
     * @param param
     * @return
     */
    boolean updateBindDev(PqDevParam.BindPlanParam param);

    /**
     * 子计划绑定/解绑标准设备
     *
     * @param planId
     * @param standardDevIds
     * @return
     */
    boolean updateBindStandardDev(String planId, List<String> standardDevIds);

    /**
     * 项目负责人导出子计划元信息
     *
     * @param planId
     * @param response
     */
    void exportSubPlanDataZip(String planId, HttpServletResponse response);

    /**
     * 项目成员导入子计划元信息
     *
     * @param file
     * @param patternId
     * @param response
     */
    boolean importSubPlanDataZip(MultipartFile file, String patternId, HttpServletResponse response);

    /**
     * 导出计划检测结果数据
     *
     * @param planId
     * @param devIds
     * @param report
     * @param response
     */
    void exportPlanCheckDataZip(String planId, List<String> devIds, Integer report, HttpServletResponse response);

    /**
     * 比对模式下计划的检测大项获取
     * @param planId 计划ID
     * @return 检测项集合
     */
    List<String> getScriptListContrast(String planId);
}
