package org.dromara.mp.service;

import me.chanjar.weixin.mp.bean.result.WxMpUser;
import me.chanjar.weixin.mp.bean.result.WxMpUserList;
import me.chanjar.weixin.mp.bean.tag.WxTagListUser;
import me.chanjar.weixin.mp.bean.tag.WxUserTag;

import java.util.List;

/**
 * 微信公众号用户管理服务接口
 *
 * @author pengles
 */
public interface WxMpUserService {

    /**
     * 获取用户基本信息
     *
     * @param openId 用户openId
     * @return 用户信息
     */
    WxMpUser getUserInfo(String openId);

    /**
     * 获取用户列表
     *
     * @param nextOpenId 下一个openId，用于分页
     * @return 用户列表
     */
    WxMpUserList getUserList(String nextOpenId);

    /**
     * 获取所有用户列表
     *
     * @return 所有用户的openId列表
     */
    List<String> getAllUsers();

    /**
     * 创建标签
     *
     * @param tagName 标签名称
     * @return 标签对象
     */
    WxUserTag createTag(String tagName);

    /**
     * 获取所有标签
     *
     * @return 标签列表
     */
    List<WxUserTag> getTags();

    /**
     * 更新标签
     *
     * @param tagId   标签ID
     * @param tagName 新标签名称
     * @return 是否成功
     */
    boolean updateTag(Long tagId, String tagName);

    /**
     * 删除标签
     *
     * @param tagId 标签ID
     * @return 是否成功
     */
    boolean deleteTag(Long tagId);

    /**
     * 给用户打标签
     *
     * @param tagId   标签ID
     * @param openIds 用户openId列表
     * @return 是否成功
     */
    boolean tagUsers(Long tagId, String[] openIds);

    /**
     * 取消用户标签
     *
     * @param tagId   标签ID
     * @param openIds 用户openId列表
     * @return 是否成功
     */
    boolean untagUsers(Long tagId, String[] openIds);

    /**
     * 获取用户的标签列表
     *
     * @param openId 用户openId
     * @return 标签ID列表
     */
    List<Long> getUserTags(String openId);

    /**
     * 获取标签下的用户列表
     *
     * @param tagId      标签ID
     * @param nextOpenId 下一个openId，用于分页
     * @return 用户列表
     */
    WxTagListUser getUsersByTag(Long tagId, String nextOpenId);

    /**
     * 获取标签下的用户openId列表
     *
     * @param tagId      标签ID
     * @param nextOpenid 下一个openid，用于分页
     * @return 用户openId列表
     */
    List<String> getTagUsers(Long tagId, String nextOpenid);

    /**
     * 批量为用户打标签
     *
     * @param tagId      标签ID
     * @param openidList 用户openid列表
     * @return 操作结果
     */
    boolean batchTagging(Long tagId, List<String> openidList);

    /**
     * 批量为用户取消标签
     *
     * @param tagId      标签ID
     * @param openidList 用户openid列表
     * @return 操作结果
     */
    boolean batchUntagging(Long tagId, List<String> openidList);
}
