package org.lym.pom.service;

import org.lym.pom.repository.mongo.Comment;
import org.shoulder.core.dto.request.BasePageQuery;
import org.shoulder.core.dto.response.PageResult;

/**
 * 评论服务
 *
 * @author lym
 */
public interface CommentService {

    /**
     * 添加评论
     *
     * @param comment 评论信息
     * @return 添加成功返回true，否则返回false
     */
    Comment addComment(Comment comment);

    /**
     * 根据 id 删除单条评论
     *
     * @param comment 评论信息
     */
    void removeComment(Comment comment);

    /**
     * 分页查询某个 relatedId && relatedType 下的直接评论
     *
     * @param pageQuery 查询条件
     * @return result
     */
    PageResult<Comment> pageQueryDirectComments(BasePageQuery<Comment> pageQuery);

    /**
     * 分页查询某个评论下的子评论（ rootCommentId && type=Comment ）
     *
     * @param pageQuery 查询条件
     * @return result
     */
    PageResult<Comment> pageQuerySubComments(BasePageQuery<Comment> pageQuery);

    /**
     * 分页查询某个 relatedId && relatedType 下的直接评论（并把子评论分页填充）
     *
     * @param pageQuery 查询条件
     * @return result
     */
    PageResult<Comment> pageQueryDirectCommentsWithSubComments(BasePageQuery<Comment> pageQuery);

    /**
     * 根据 id 查询单条评论
     * @param commentId 评论 id
     * @return 评论详情
     */
    Comment queryCommentDetail(String commentId);

    /**
     * 分页查询某个用户被评论的所有评论【动态发表者视角】这个查通知列表，而非评论，性能原因
     *
     * @param pageQuery 查询条件
     * @return result
     */
    //PageResult<Comment> pageQueryComments(BasePageQuery<Comment> pageQuery);

    /**
     * 分页查询某个用户参与的评论【评论发表者视角】暂不开放，用户看到自己交互
     *
     * @param pageQuery 查询条件
     * @return result
     */
    //PageResult<Comment> pageQueryCommentsByCreator(BasePageQuery<Comment> pageQuery);

    //不实现：分页查询某个用户被@的评论【@我的评论视角】这个查通知列表，而非评论，性能原因

    /**
     * 查询评论数量
     *
     * @param relatedId     评论信息
     * @param relatedType   评论信息
     * @param rootCommentId 总数传 null，子评论回复数传具体父评论 id
     * @return 评论数量，若无评论返回0
     */
    long countCommentNumber(String relatedId, String relatedType, String rootCommentId);

}
