package shop.alien.lawyer.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartRequest;
import shop.alien.entity.result.R;
import shop.alien.entity.store.StoreComment;
import shop.alien.entity.store.dto.OrderReviewDto;
import shop.alien.entity.store.dto.ReviewCommentRequestDto;
import shop.alien.entity.store.dto.ReviewReplyDto;
import shop.alien.entity.store.vo.LifeUserOrderCommentVo;
import shop.alien.entity.store.vo.OrderReviewDetailVo;
import shop.alien.entity.store.vo.OrderReviewVo;
import shop.alien.entity.store.vo.ReviewCommentVo;
import shop.alien.entity.store.vo.StoreCommentCountVo;
import shop.alien.entity.store.vo.StoreCommentVo;
import shop.alien.entity.store.vo.StoreCommitPercentVo;

import java.util.List;
import java.util.Map;

/**
 * 评论表 服务类
 *
 * @author ssk
 * @since 2025-01-02
 */
public interface StoreCommentService extends IService<StoreComment> {

    /**
     * 评论列表
     *
     * @param pageNum      页数
     * @param pageSize     页容
     * @param businessId   业务id
     * @param businessType 业务类型(1:订单评论, 2:动态社区评论, 3:活动评论, 4:店铺打卡评论, 5:订单评价, 6:订单评论的评论)
     * @param storeId      门店id
     * @param replyStatus  回复状态(0:全部, 1:已回复, 2:未回复)
     * @param commentLevel 评论等级(0:全部, 1:好评, 2:中评, 3:差评)
     * @param days         查询时间, 多少天前
     * @param phoneId      消息标识
     * @param userType     评论的用户类型(0:商家, 其他:用户)
     * @param tagId        标签id
     * @param hasImage     是否有图片(0否/1是)
     * @return IPage<StoreComment>
     */
    IPage<StoreCommentVo> getList(Integer pageNum, Integer pageSize, Integer businessId, Integer businessType, Integer storeId, Integer replyStatus, Integer commentLevel, Integer days, String phoneId, Integer userType, Integer tagId, Boolean hasImage);

    /**
     * 获取最新一条评论/评价
     *
     * @param businessId   业务id
     * @param businessType 业务类型(1:订单评论, 2:动态社区评论, 3:活动评论,4:店铺打卡评论)
     * @param storeId      门店id
     * @return StoreCommentVo
     */
    StoreCommentVo getOne(Integer businessId, Integer businessType, Integer storeId);

    /**
     * 评论/评价数量和评分
     *
     * @param businessId   业务id
     * @param businessType 业务类型(1:订单评论, 2:动态社区评论, 3:活动评论,4:店铺打卡评论)
     * @param storeId      门店id
     * @return Integer
     */
    Map<String, Object> getCommitCountAndScore(Integer businessId, Integer businessType, Integer storeId, String phoneId, Integer days);

    /**
     * 评论
     *
     * @param multipartRequest 文件
     * @param businessId       业务id
     * @param businessType     业务类型(1:订单评论, 2:动态社区评论, 3:活动评论,4:店铺打卡评论)
     * @param storeId          门店id
     * @param userId           用户id
     * @param replyId          回复id
     * @param commentContent   评价内容
     * @return 0:成功, 1:失败, 2:文本内容异常, 3:图片内容异常
     */
    Integer userComment(MultipartRequest multipartRequest, Integer businessId, Integer businessType, Integer storeId, Integer userId, Integer replyId, String commentContent);

    /**
     * 新增或修改评论/评价
     *
     * @param multipartRequest 文件
     * @param id               主键
     * @param businessId       业务id
     * @param businessType     业务类型(1:订单评论, 2:动态社区评论, 3:活动评论,4:店铺打卡评论)
     * @param storeId          门店id
     * @param userId           用户id
     * @param replyId          回复id
     * @param commentContent   评价内容
     * @param score            评分
     * @param otherScore       其他评分
     * @param isAnonymous      是否匿名(0:否(默认), 1:是)
     * @param evaluationTags   评价标签
     * @param phoneId          用户id
     * @return 0:成功, 1:失败, 2:文本内容异常, 3:图片内容异常
     */
    Integer addComment(MultipartRequest multipartRequest, Integer id, Integer businessId, Integer businessType, Integer storeId, Integer userId, Integer replyId, String commentContent, Double score, String otherScore, Integer isAnonymous, String evaluationTags, String phoneId);

    /**
     * 新增或修改评论/评价
     *
     * @param multipartRequest 文件
     * @param id               主键
     * @param businessId       业务id
     * @param businessType     业务类型(1:订单评论, 2:动态社区评论, 3:活动评论,4:店铺打卡评论)
     * @param storeId          门店id
     * @param userId           用户id
     * @param replyId          回复id
     * @param commentContent   评价内容
     * @param score            评分
     * @param otherScore       其他评分
     * @param isAnonymous      是否匿名(0:否(默认), 1:是)
     * @param evaluationTags   评价标签
     * @param phoneId          用户id
     * @return 0:成功, 1:失败, 2:文本内容异常, 3:图片内容异常
     */
    Integer addCommentNew(MultipartRequest multipartRequest, Integer id, Integer businessId, Integer businessType, Integer storeId, Integer orderId, Integer lawyerId, Integer userId, Integer replyId, String commentContent, Double score, String otherScore, Integer isAnonymous, String evaluationTags, String phoneId);

    /**
     * 回复率, 评价比例
     *
     * @param storeId 门店id
     * @return StoreCommitPercentVo
     */
    StoreCommitPercentVo getCommitPercent(Integer storeId);

    /**
     * @param type 1:未评价, 2:已评价
     */
    IPage<LifeUserOrderCommentVo> getCommentOrderPage(Integer pageNum, Integer pageSize, Integer type, String userId);

    /**
     * 查询当前用户全部评价（店铺+律师），格式同 LifeUserOrderCommentVo
     */
    IPage<LifeUserOrderCommentVo> getUserAllCommentsPage(Integer pageNum, Integer pageSize, Integer userId);

    /**
     * 获取店铺评价计数统计
     *
     * @param storeId 门店id
     * @return StoreCommentCountVo
     */
    StoreCommentCountVo getAppraiseCount(Integer storeId);

    // ==================== 订单评价相关方法（迁移自 OrderReviewService）====================

    /**
     * 创建订单评价（只有订单用户才能评价）
     *
     * @param reviewDto 评价DTO
     * @return R<StoreComment>
     */
    R<StoreComment> createOrderReview(OrderReviewDto reviewDto);

    /**
     * 获取评价详情（包含评论和回复）
     *
     * @param orderId 评价ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<OrderReviewDetailVo>
     */
    R<OrderReviewDetailVo> getOrderReviewDetail(Integer orderId, Integer currentUserId);

    /**
     * 点赞评价
     *
     * @param reviewId 评价ID
     * @param userId 用户ID
     * @return R<Boolean>
     */
    R<Boolean> likeOrderReview(Integer reviewId, Integer userId);

    /**
     * 取消点赞评价
     *
     * @param reviewId 评价ID
     * @param userId 用户ID
     * @return R<Boolean>
     */
    R<Boolean> cancelLikeOrderReview(Integer reviewId, Integer userId);

    /**
     * 分页查询评价列表
     *
     * @param page 页码
     * @param size 页大小
     * @param orderId 订单ID（可选）
     * @param lawyerUserId 律师用户ID（可选）
     * @param userId 评价用户ID（可选）
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<IPage<OrderReviewVo>>
     */
    R<IPage<OrderReviewVo>> getOrderReviewList(int page, int size, Integer orderId, Integer lawyerUserId, Integer userId, Integer currentUserId);

    /**
     * 根据订单ID查询评价
     *
     * @param orderId 订单ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<OrderReviewVo>
     */
    R<OrderReviewVo> getOrderReviewByOrderId(Integer orderId, Integer currentUserId);

    // ==================== 评价评论相关方法（迁移自 ReviewCommentService）====================

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

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

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

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

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

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

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

}
