package org.dromara.mp.service;

import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;

/**
 * 微信公众号消息处理服务接口
 *
 * @author pengles
 */
public interface WxMpMessageService {

    /**
     * 处理文本消息
     *
     * @param inMessage 接收到的消息
     * @return 回复消息
     */
    WxMpXmlOutMessage handleTextMessage(WxMpXmlMessage inMessage);

    /**
     * 处理图片消息
     *
     * @param inMessage 接收到的消息
     * @return 回复消息
     */
    WxMpXmlOutMessage handleImageMessage(WxMpXmlMessage inMessage);

    /**
     * 处理语音消息
     *
     * @param inMessage 接收到的消息
     * @return 回复消息
     */
    WxMpXmlOutMessage handleVoiceMessage(WxMpXmlMessage inMessage);

    /**
     * 处理视频消息
     *
     * @param inMessage 接收到的消息
     * @return 回复消息
     */
    WxMpXmlOutMessage handleVideoMessage(WxMpXmlMessage inMessage);

    /**
     * 处理位置消息
     *
     * @param inMessage 接收到的消息
     * @return 回复消息
     */
    WxMpXmlOutMessage handleLocationMessage(WxMpXmlMessage inMessage);

    /**
     * 处理链接消息
     *
     * @param inMessage 接收到的消息
     * @return 回复消息
     */
    WxMpXmlOutMessage handleLinkMessage(WxMpXmlMessage inMessage);

    /**
     * 处理事件消息
     *
     * @param inMessage 接收到的消息
     * @return 回复消息
     */
    WxMpXmlOutMessage handleEventMessage(WxMpXmlMessage inMessage);

    /**
     * 自动回复消息
     *
     * @param keyword 关键词
     * @param openId  用户openId
     * @return 回复内容
     */
    String getAutoReplyContent(String keyword, String openId);

    /**
     * 保存用户消息记录
     *
     * @param inMessage 接收到的消息
     */
    void saveUserMessage(WxMpXmlMessage inMessage);

    /**
     * 保存回复消息记录
     *
     * @param outMessage 回复的消息
     * @param openId     用户openId
     */
    void saveReplyMessage(WxMpXmlOutMessage outMessage, String openId);

    /**
     * 获取默认回复内容
     *
     * @return 默认回复内容
     */
    String getDefaultReplyContent();

    /**
     * 处理关注事件
     *
     * @param openId 用户openId
     * @return 欢迎消息
     */
    String handleSubscribeEvent(String openId);

    /**
     * 处理取消关注事件
     *
     * @param openId 用户openId
     */
    void handleUnsubscribeEvent(String openId);

    /**
     * 处理扫码事件
     *
     * @param openId   用户openId
     * @param sceneStr 场景值
     * @return 回复内容
     */
    String handleScanEvent(String openId, String sceneStr);
}