package shop.alien.lawyer.service;

import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.result.R;
import shop.alien.entity.store.ReviewComment;
import shop.alien.entity.store.dto.LawyerReplyDto;
import shop.alien.entity.store.dto.ReviewCommentRequestDto;
import shop.alien.entity.store.dto.ReviewReplyDto;
import shop.alien.entity.store.vo.ReviewCommentVo;

import java.util.List;

/**
 * 评价评论 服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface ReviewCommentService extends IService<ReviewComment> {

    /**
     * 创建评论（其他用户对评价的评论）
     *
     * @param comment 评论实体
     * @return R<ReviewComment>
     */
    R<ReviewComment> createComment(ReviewComment comment);

    /**
     * 根据评价ID查询评论列表
     *
     * @param reviewId 评价ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<List<ReviewCommentVo>>
     */
    R<List<ReviewCommentVo>> getCommentListByReviewId(Integer reviewId, Integer currentUserId);

    /**
     * 点赞评论
     *
     * @param requestDto 请求DTO
     * @return R<Boolean>
     */
    R<Boolean> likeComment(ReviewCommentRequestDto requestDto);

    /**
     * 取消点赞评论
     *
     * @param requestDto 请求DTO
     * @return R<Boolean>
     */
    R<Boolean> cancelLikeComment(ReviewCommentRequestDto requestDto);

    /**
     * 创建回复（用户对评论的回复）
     *
     * @param replyDto 回复DTO
     * @return R<ReviewComment>
     */
    R<ReviewComment> createReply(ReviewReplyDto replyDto);

    /**
     * 根据首评ID查询回复列表
     *
     * @param headId 首评ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<List<ReviewCommentVo>>
     */
    R<List<ReviewCommentVo>> getReplyListByHeadId(Integer headId, Integer currentUserId);

    /**
     * 删除回复
     *
     * @param replyId 回复ID
     * @param userId 用户ID
     * @return R<Boolean>
     */
    R<Boolean> deleteReply(Integer replyId, Integer userId);

    /**
     * 删除评论（根据ID，物理删除）
     * userId有值时只能删除自己发布的评论，userId为空时允许删除任何评论（管理员删除）
     *
     * @param reviewComment 评论对象（包含id和userId，userId可选）
     * @return R<Boolean>
     */
    R<Boolean> deleteReviewComment(ReviewComment reviewComment);

    /**
     * 律师回复（律师对用户的评价或评论的回复）
     * 
     * @deprecated 已废弃，请使用 createComment（回复评价）或 createReply（回复评论）接口
     *             通过 sendUserType=2 标识律师身份，系统会自动进行权限校验
     * @param replyDto 律师回复DTO
     * @return R<ReviewComment>
     */
    @Deprecated
    R<ReviewComment> lawyerReply(LawyerReplyDto replyDto);
}

