package shop.alien.lawyer.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.result.R;
import shop.alien.entity.store.OrderReview;
import shop.alien.entity.store.dto.OrderReviewDto;
import shop.alien.entity.store.vo.OrderReviewDetailVo;
import shop.alien.entity.store.vo.OrderReviewVo;
import shop.alien.entity.store.vo.PendingReviewVo;

/**
 * 订单评价 服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface OrderReviewService extends IService<OrderReview> {

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

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

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

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

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


    /**
     * 用户删除评价（只能删除自己的评价，删除评价时，会级联删除该评价下的所有评论和回复）
     *
     * @param reviewId 评价ID
     * @param userId 用户ID（必填，只能删除自己的评价）
     * @return R<Boolean>
     */
    R<Boolean> deleteReview(Integer reviewId, Integer userId);

    /**
     * 管理员删除评价（可以删除任何评价，删除评价时，会级联删除该评价下的所有评论和回复）
     *
     * @param reviewId 评价ID
     * @return R<Boolean>
     */
    R<Boolean> deleteReviewByAdmin(Integer reviewId);

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

    /**
     * 分页查询待评价列表（查询用户已完成但未评价的订单对应的律师信息）
     *
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param userId 用户ID
     * @return R<IPage<PendingReviewVo>>
     */
    R<IPage<PendingReviewVo>> getPendingReviewList(int pageNum, int pageSize, Integer userId);

    /**
     * 分页查询我的评价列表（查询当前用户的所有评价）
     *
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param userId 用户ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<IPage<OrderReviewVo>>
     */
    R<IPage<OrderReviewVo>> getMyReviewList(int pageNum, int pageSize, Integer userId, Integer currentUserId);

    /**
     * 根据律师ID和类型分页查询评价列表（不包含评论）
     *
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param lawyerUserId 律师用户ID
     * @param type 查询分类（1：好评，2：中评，3：差评，4：有图，为空时返回全部）
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<IPage<OrderReviewVo>>
     */
    R<IPage<OrderReviewVo>> getReviewListByLawyerAndType(int pageNum, int pageSize, Integer lawyerUserId, Integer type, Integer currentUserId);

    /**
     * 获取律师评价统计数据
     *
     * @param lawyerUserId 律师用户ID
     * @return R<LawyerReviewStatisticsVo>
     */
    R<shop.alien.entity.store.vo.LawyerReviewStatisticsVo> getLawyerReviewStatistics(Integer lawyerUserId);

    /**
     * 根据订单ID查询关联评价
     *
     * @param orderId 订单ID
     * @return R<OrderReviewVo>
     */
    R<OrderReviewVo> getOrderEvaluation(Integer orderId);

}

