package cn.aagro.pp.module.promotion.service.kefu;

import cn.aagro.pp.module.promotion.controller.admin.kefu.vo.conversation.KeFuConversationUpdatePinnedReqVO;
import cn.aagro.pp.module.promotion.dal.dataobject.kefu.KeFuConversationDO;
import cn.aagro.pp.module.promotion.dal.dataobject.kefu.KeFuMessageDO;

import java.util.List;

/**
 * 客服会话 Service 接口
 *
 * @author HUIHUI
 */
public interface KeFuConversationService {

    /**
     * 获得客服会话
     *
     * @param id 编号
     * @return 客服会话
     */
    KeFuConversationDO getConversation(Long id);

    /**
     * 【管理员】删除客服会话
     *
     * @param id 编号
     */
    void deleteKefuConversation(Long id);

    /**
     * 【管理员】客服会话置顶
     *
     * @param updateReqVO 请求
     */
    void updateConversationPinnedByAdmin(KeFuConversationUpdatePinnedReqVO updateReqVO);

    /**
     * 更新会话客服消息冗余信息
     *
     * @param kefuMessage 消息
     */
    void updateConversationLastMessage(KeFuMessageDO kefuMessage);

    /**
     * 【管理员】将管理员未读消息计数更新为零
     *
     * @param id 编号
     */
    void updateAdminUnreadMessageCountToZero(Long id);

    /**
     * 【管理员】更新会话对于管理员是否可见
     *
     * @param id           编号
     * @param adminDeleted 管理员是否可见
     */
    void updateConversationAdminDeleted(Long id, Boolean adminDeleted);

    /**
     * 【管理员】获得客服会话列表
     *
     * @return 会话列表
     */
    List<KeFuConversationDO> getKefuConversationList();

    /**
     * 【会员】获得或创建会话
     *
     * 对于【会员】来说，有且仅有一个对话
     *
     * @param userId 用户编号
     * @return 客服会话
     */
    KeFuConversationDO getOrCreateConversation(Long userId);

    /**
     * 校验客服会话是否存在
     *
     * @param id 编号
     * @return 客服会话
     */
    KeFuConversationDO validateKefuConversationExists(Long id);

    /**
     * 【会员】获得客服会话
     *
     * @param userId 用户编号
     * @return 客服会话
     */
    KeFuConversationDO getConversationByUserId(Long userId);

}