package com.qmth.themis.mq.service;

import com.qmth.themis.business.dto.MqDto;
import com.qmth.themis.business.enums.MqExecTypeEnum;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.common.message.MessageExt;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * @Description: mq执行逻辑
 * @Param:
 * @return:
 * @Author: wangliang
 * @Date: 2020/7/31
 */
public interface MqLogicService {

    /**
     * mq最大重试次数逻辑
     *
     * @param mqDto
     * @param key
     */
    public void execMqMaxReconsumeTime(MqDto mqDto, String key);

    /**
     * 用户轨迹逻辑
     *
     * @param mqDto
     * @param key
     */
    public void execMqUserLogLogic(MqDto mqDto, String key);

    /**
     * session逻辑
     *
     * @param mqDto
     * @param key
     */
    public void execMqSessionLogic(MqDto mqDto, String key);

    /**
     * task逻辑
     *
     * @param mqDto
     * @param key
     */
    public void execMqTaskLogic(MqDto mqDto, String key);

    /**
     * websocket超时退出逻辑
     *
     * @param mqDto
     * @param key
     */
    public void execMqWebsocketUnNormalLogic(MqDto mqDto, String key) throws NoSuchAlgorithmException;

    /**
     * 腾讯云视频回调逻辑
     *
     * @param mqDto
     * @param key
     */
    public void execMqTencentVideoLogic(MqDto mqDto, String key) throws NoSuchAlgorithmException, IOException;

    /**
     * 计算客观分逻辑
     *
     * @param mqDto
     * @param key
     */
//    public void execMqCalculateObjectiveScoreLogic(MqDto mqDto, String key);

    /**
     * 人脸验证保存
     *
     * @param mqDto
     * @param key
     */
    public void execMqFaceVerifySaveLogic(MqDto mqDto, String key);

    /**
     * 活体验证保存
     *
     * @param mqDto
     * @param key
     */
    public void execMqLivenessVerifySaveLogic(MqDto mqDto, String key);

    /**
     * 考试记录数据持久化
     *
     * @param mqDto
     * @param key
     */
    public void execMqRecordPersistedLogic(MqDto mqDto, String key);

    /**
     * 考试断点记录数据持久化
     *
     * @param mqDto
     * @param key
     */
    public void execMqRecordBreakHistoryPersistedLogic(MqDto mqDto, String key);

    /**
     * 考试记录数据更新
     *
     * @param mqDto
     * @param key
     */
    void execMqRecordUpdateLogic(MqDto mqDto, String key);

    /**
     * 监控通话申请逻辑
     *
     * @param mqDto
     * @param key
     */
    public void execMqLogLogic(MqDto mqDto, String key);

    /**
     * 重新算分
     *
     * @param mqDto
     * @param key
     */
    void execMqCalculateScoreLogic(MqDto mqDto, String key);

    /**
     * 更新考生信息
     */
    void execMqExamStudentUpdateLogic(MqDto mqDto, String key);

    /**
     * 考试断点
     *
     * @param mqDto
     * @param key
     */
    void execMqExamBreakLogic(MqDto mqDto, String key) throws NoSuchAlgorithmException;

    /**
     * 考试断点延时消息
     *
     * @param mqDto
     * @param key
     */
    void execMqExamBreakDelayLogic(MqDto mqDto, String key);

    /**
     * 普通消息
     *
     * @param msgs
     * @param consumeConcurrentlyContext
     * @param mqExecTypeEnum
     * @return
     */
    ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext, MqExecTypeEnum mqExecTypeEnum);

    /**
     * 延时消息
     *
     * @param msgs
     * @param consumeConcurrentlyContext
     * @param mqExecTypeEnum
     * @return
     */
    ConsumeConcurrentlyStatus consumeMessageDelay(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext, MqExecTypeEnum mqExecTypeEnum);
}
