package com.xinelu.manage.service.signpatientmanageroutenode;

import com.xinelu.manage.domain.patientnodeparamscurrent.PatientNodeParamsCurrent;
import com.xinelu.manage.domain.patientvisitrecord.PatientVisitRecord;
import com.xinelu.manage.domain.signpatientmanageroutenode.SignPatientManageRouteNode;
import com.xinelu.manage.dto.signpatientmanageroutenode.*;
import com.xinelu.manage.vo.labelfieldcontent.LabelFieldInfoContentVo;
import com.xinelu.manage.vo.signpatientmanageroutenode.*;
import com.xinelu.manage.vo.specialdiseasenode.PatientSpecialDiseaseNodeVo;
import com.xinelu.manage.vo.specialdiseasenode.SpecialDiseaseNodeVO;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;

/**
 * 签约患者管理任务路径节点Service接口
 *
 * @author haown
 * @date 2024-03-18
 */
public interface ISignPatientManageRouteNodeService {
    /**
     * 查询签约患者管理任务路径节点
     *
     * @param id 签约患者管理任务路径节点主键
     * @return 签约患者管理任务路径节点
     */
    PatientManageNodeInfoVo selectSignPatientManageRouteNodeById(Long id);

	/**
	 * 查询患者管理路径节点
	 * @param signPatientRecordId 签约记录主键
	 * @return 患者管理任务路径节点
	 * @Author haown
	 * @Date 2024-08-01 15:23
	 */
	List<SignPatientTaskVo> getNodeList(Long signPatientRecordId);

	/**
	 * 根据节点类型查询节点列表详情
	 * @param patientTaskDto 任务查询传输对象
	 * @return 患者管理任务路径节点
	 */
	List<PatientManageNodeInfoVo> getNodeListByPatient(PatientTaskDto patientTaskDto);

	/**
	 * 查询患者管理路径节点
	 *
	 * @param patientTaskDto 任务查询传输对象
	 * @return 患者管理任务路径节点
	 */
	List<SignPatientManageRouteNodeVo> getRouteNodeList(PatientTaskDto patientTaskDto);

    /**
     * 查询签约患者管理任务路径节点列表
     *
     * @param signPatientManageRouteNodeDto 签约患者管理任务路径节点查询传输对象
     * @return 签约患者管理任务路径节点集合
     */
    List<SignPatientManageRouteNode> selectSignPatientManageRouteNodeList(SignPatientManageRouteNodeDto signPatientManageRouteNodeDto);

	/**
	 * 查询患者任务节点
	 *
	 * @param signPatientManageRouteNodeDto 签约患者管理任务路径节点查询传输对象
	 * @return 签约患者管理任务节点集合
	 */
	List<PatientManageNodeListVo> selectPatientManageNodeList(SignPatientManageRouteNodeDto signPatientManageRouteNodeDto);

    /**
     * 新增签约患者管理任务路径节点
     *
     * @param signPatientManageRouteNode 签约患者管理任务路径节点
     * @return 结果
     */
    int insertSignPatientManageRouteNode(SignPatientManageRouteNode signPatientManageRouteNode);

    /**
     * 修改签约患者管理任务路径节点
     *
     * @param signPatientManageRouteNode 签约患者管理任务路径节点
     * @return 结果
     */
    public int updateSignPatientManageRouteNode(SignPatientManageRouteNode signPatientManageRouteNode);

    /**
     * 批量删除签约患者管理任务路径节点
     *
     * @param ids 需要删除的签约患者管理任务路径节点主键集合
     * @return 结果
     */
    public int deleteSignPatientManageRouteNodeByIds(Long[] ids);

    /**
     * 删除签约患者管理任务路径节点信息
     *
     * @param id 签约患者管理任务路径节点主键
     * @return 结果
     */
    public int deleteSignPatientManageRouteNodeById(Long id);

	/**
	 * 查询患者任务列表
	 * @param patientTaskDto 患者任务列表查询传输对象
	 * @return 患者任务列表
	 */
	List<PatientTaskVo> selectPatientTaskList(PatientTaskDto patientTaskDto);

	/**
	 * 审核任务
	 * @param routeNodeCheckDto 任务审核传输对象
	 * @return 结果
	 */
	int audit(RouteNodeCheckDto routeNodeCheckDto);

	/**
	 * 小程序端任务列表
	 * @param appletPatientTaskDto 小程序任务列表查询传输对象
	 * @return 小程序患者管理路径节点列表
	 */
	List<AppletRouteNodeListVo> getAppletTaskList(AppletPatientTaskDto appletPatientTaskDto);

	List<PatientSpecialDiseaseNodeVo> getSpecialDiseaseNode(PatientTaskDto patientTaskDto);

	/**
	 * @description 根据任务主键获取最新一次的电话拨打录音及通话记录
	 * @Param  id 任务主键
	 * @return 电话拨打录音及通话记录
	 * @Author haown
	 * @Date 2024-11-8 14:43
	 */
	AIDialRecordVo getPhoneDialVideo(Long id);

	/**
	 * 根据参数列表修改任务
	 * @param paramsCurrentLists 参数列表
	 */
	void updateTaskWithParam(List<List<PatientNodeParamsCurrent>> paramsCurrentLists);

	LocalDateTime getExecuteTime(LocalTime executeTime, String routeNodeName, Integer routeNodeDay, PatientVisitRecord patientVisitRecord);

	/**
	 * 画像审核通过/路径审核通过后生成主路径任务
	 * @param signRecordId 签约记录主键
	 */
	void generateMainRouteTask(Long signRecordId);

	/**
	 * 手动创建的任务标签替换
	 * @param signRecordId 签约记录主键
	 */
	void manualCreateTaskLabelReplace(Long signRecordId);
	/**
	 * 手动创建的任务标签替换
	 * @param patientId 患者Id
	 */
	void manualCreateTaskLabelReplaceByPatientId(Long patientId);

	/**
	 * 根据触发条件生成子路径任务
	 * @param patientId 患者主键
	 * @param signPatientRecordId 签约记录表主键
	 * @param specialDiseaseRouteId 专病管理路径子路径主键
	 */
	void generateChildRouteTask(Long patientId, Long signPatientRecordId, Long specialDiseaseRouteId);

	/**
	 * 替换节点标签内容
	 * @param manageRouteNode 签约管理路径节点
	 * @param taskPartitionDictId 专病节点任务细分
	 * @param labelFieldContentList 患者画像
	 * @return 签约路径节点列表
	 */
	List<SignPatientManageNodeAuditVo> replaceNodeContent(SignPatientManageNodeAuditVo manageRouteNode, Long taskPartitionDictId, List<LabelFieldInfoContentVo> labelFieldContentList);

	/**
	 * 话术json参数替换
	 * @param flowScheme 话术json
	 * @param labelFieldContentList 患者画像信息
	 * @return 替换标签后的话术json
	 */
	String getFlowScheme(String flowScheme, List<LabelFieldInfoContentVo> labelFieldContentList);

	/**
	 * 替换公众号、小程序模板内容
	 * @param templateId 微信库模板id
	 * @param labelFieldContentList 患者画像信息
	 */
	String replaceWeChatTemplate(Long templateId, List<LabelFieldInfoContentVo> labelFieldContentList);

	/**
	 * * 短信模板内容
	 * @param messageTemplateId 短信模板主键
	 * @param labelFieldContentList 患者画像信息
	 * @return 替换标签后的内容
	 */
	String replaceMessageInfo(Long messageTemplateId, List<LabelFieldInfoContentVo> labelFieldContentList);

	/**
	 * 查询专病路径触发条件是否满足
	 * @param specialDiseaseRouteId 专病管理路径主键
	 * @param patientId 患者主键
	 * @return 是否满足触发条件，true:满足，false:不满足
	 */
	Boolean getTriggerConditon(Long specialDiseaseRouteId, Long patientId);

	/**
	 * 查询手动创建路径触发条件是否满足
	 * @param signPatientManageRouteId 专病管理路径主键
	 * @param patientId 患者主键
	 * @return 是否满足触发条件，true:满足，false:不满足
	 */
	Boolean getSignTriggerConditon(Long signPatientManageRouteId, Long patientId);

	/**
	 * 测试生成患者档案列表数据用
	 */
	void generateStatistic();

	/**
	 * @description 专病路径修改时修改任务，已经执行的任务不修改，未执行的任务进行删除或修改
	 * @Param routeId 专病路径主键
	 * @return null
	 * @Author haown
	 * @Date 2024-11-15 10:52
	 */
	void updateBySpecialDiseaseRoute(List<Long> delDiseaseNodeIds, List<SpecialDiseaseNodeVO> updateList, List<SpecialDiseaseNodeVO> addDiseaseNodeList);

	/**
	 * 外呼记录
	 *
	 * @param uploadRobotPublishRecordDto 时间信息
	 * @return UploadRobotPublishRecordVo
	 */
	List<UploadRobotPublishRecordVo> uploadRobotPublishRecord(UploadRobotPublishRecordDto uploadRobotPublishRecordDto);
}
