package cn.axzo.msg.center.message.service;

import cn.axzo.msg.center.api.response.MessageDetailRes;
import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO;
import cn.axzo.msg.center.message.domain.dto.PendingMessageStatisticDTO;
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam;
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import cn.axzo.msg.center.service.pending.request.CompletePendingBySubCodeRequest;
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageByIdRequest;
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageByBizCodeRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageFixedTemplatePageRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageIterateRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageQueryRequest;
import cn.axzo.msg.center.service.pending.request.RevokePendingMessageByIdRequest;
import cn.axzo.msg.center.service.pending.request.SetHideRequest;
import cn.axzo.msg.center.service.pending.request.UpdatePendingMessageByIdRequest;
import cn.axzo.msg.center.service.pending.response.AnalysisPage;
import cn.axzo.msg.center.service.pending.response.PendingMessageIterateResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageSimpleDTO;
import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO;
import cn.azxo.framework.common.model.Page;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

/**
 * @description
 *   待办Service
 * @author cold_blade
 * @date 2023/9/20
 * @version 1.0
 */
public interface PendingMessageNewService {

    /**
     * 分类统计待办的待处理状态的数量
     *
     * @param param 统计入参
     * @return 分类信息及其对应的待处理的待办数量列表
     */
    List<PendingMessageStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param);

    /**
     * 统计个人在某个应用终端的待处理的待办数量
     *
     * @param param 统计入参
     * @return 待处理的待办数量
     */
    Integer countUncompleted(MessageGroupNodeStatisticParam param);

    /**
     * 根据模板id列表统计指定的自然人的待办数量
     *
     * @param personId     自然人id
     * @param templateIds  模板id列表
     * @return 指定的人的待办数量
     */
    Integer countUncompleted(Long personId, Collection<Long> templateIds);

    /**
     * 代办列表分页查询
     *
     * @param request 分页查询相关参数
     * @return 代办列表
     */
    AnalysisPage<PendingMessageResponse> pageQuery(PendingMessagePageRequest request);

    /**
     * 遍历待办数据
     * @param request
     * @return
     */
    Page<PendingMessageIterateResponse> iterate(PendingMessageIterateRequest request);

    /**
     * 查询可以用于分页查询的模版
     * @param request
     */
    List<String> determinePageQueryTemplateCodes(PendingMessagePageRequest request);

    /**
     * 代办列表分页查询
     *
     * @param request 分页查询相关参数
     * @return 代办列表
     */
    List<PendingMessageResponse>  getPendingMessageByAppWorker(PendingMessageFixedTemplatePageRequest request);

    /**
     * 代办列表分页查询
     *
     * @param request 分页查询相关参数
     * @return 代办列表
     */
    Page<MessageDetailRes> compatiblePageQuery(PendingMessagePageRequest request);

    /**
     * 代办列表指定item查询
     *
     * @param request 查询相关参数
     * @return 指定的item数据
     */
    PendingMessageResponse query(PendingMessageQueryRequest request);

    /**
     * 查询代办详情
     *
     * @param msgIdentityCode 消息的唯一标识
     * @param terminalType    APP终端类型
     * @return 代办详情
     */
    Optional<PendingMessageDTO> detail(String msgIdentityCode, TerminalTypeEnum terminalType);

    /**
     * 发送代办
     *
     * @param param 代办核心参数
     * @return 代办唯一标识
     */
    List<PushPendingMessageDTO> push(PendingMessagePushParam param);

    /**
     * 完成代办
     *
     * @param requestNo 代办唯一标识
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean complete(String requestNo);

    /**
     * 完成代办
     *
     * @param param 代办唯一标识
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean completeById(CompletePendingMessageByIdRequest param);

    /**
     * 撤销代办
     *
     * @param requestNo 代办唯一标识
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean revoke(String requestNo);

    /**
     * 通过ID撤销代办
     *
     * @param msgId 代办唯一标识
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean revokeByMsgId(String msgId);

    /**
     * 通过业务编码和模版编码完成代办
     *
     * @param param
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean completeByTemplateCodeBizCode(CompletePendingMessageRequest param);

    /**
     * 通过业务和子业务编码和模版编码完成代办
     *
     * @param param
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean completeByTemplateCodeSubBizCode(CompletePendingBySubCodeRequest param);

    /**
     * 通过业务编码和模版编码撤销代办
     *
     * @param param
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean revokeByTemplateCodeBizCode(CompletePendingMessageRequest param);

    /**
     * 通过ID撤销代办
     *
     * @param param
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean revokeById(RevokePendingMessageByIdRequest param);

    /**
     * 通过ID编辑代办bizParam
     *
     * @param param
     * @return 成功返回 {@code true} 失败返回 {@code false}
     */
    Boolean updateById(UpdatePendingMessageByIdRequest param);

    /**
     * 通过BizCode获取最新代办
     * @param bizCode
     * @return
     */
    List<PendingMessageSimpleDTO> getLatestByBizCode(PendingMessageByBizCodeRequest bizCode);

    /**
     * 将待办设置为隐藏
     */
    Boolean setHide(SetHideRequest req);
}
