package shop.alien.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import shop.alien.entity.store.OrderReview;
import shop.alien.entity.store.vo.OrderReviewVo;
import shop.alien.entity.store.vo.PendingReviewVo;

/**
 * 订单评价 Mapper 接口
 *
 * @author system
 * @since 2025-01-XX
 */
@Mapper
public interface OrderReviewMapper extends BaseMapper<OrderReview> {

    /**
     * 分页查询评价列表（包含用户和律师信息）
     *
     * @param page 分页对象
     * @param orderId 订单ID
     * @param lawyerUserId 律师用户ID
     * @param userId 评价用户ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @param filterAppealId 是否只查询申诉ID为空的评价（true：只查询申诉ID为空的评价，false或null：不过滤）
     * @return 分页结果
     */
    IPage<OrderReviewVo> getReviewListWithUser(
            IPage<OrderReviewVo> page,
            @Param("orderId") Integer orderId,
            @Param("lawyerUserId") Integer lawyerUserId,
            @Param("userId") Integer userId,
            @Param("currentUserId") Integer currentUserId,
            @Param("filterAppealId") Boolean filterAppealId
    );

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

    /**
     * 根据评价ID查询评价详情（包含用户和律师信息）
     *
     * @param reviewId 评价ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return 评价详情
     */
    OrderReviewVo getReviewDetailById(@Param("reviewId") Integer reviewId, @Param("currentUserId") Integer currentUserId);

    /**
     * 分页查询待评价列表（查询用户已完成但未评价的订单对应的律师信息）
     *
     * @param page 分页对象
     * @param userId 用户ID
     * @return 分页结果
     */
    IPage<PendingReviewVo> getPendingReviewList(
            IPage<PendingReviewVo> page,
            @Param("userId") Integer userId
    );

    /**
     * 计算律师的平均评分（overallRating的平均值）
     *
     * @param lawyerUserId 律师用户ID
     * @return 平均评分（1-5星）
     */
    Double getAverageRatingByLawyerUserId(@Param("lawyerUserId") Integer lawyerUserId);

    /**
     * 统计律师的好评数（4.5-5分）
     *
     * @param lawyerUserId 律师用户ID
     * @return 好评数
     */
    Integer getGoodReviewCountByLawyerUserId(@Param("lawyerUserId") Integer lawyerUserId);

    /**
     * 统计律师的中评数（3-4分）
     *
     * @param lawyerUserId 律师用户ID
     * @return 中评数
     */
    Integer getMediumReviewCountByLawyerUserId(@Param("lawyerUserId") Integer lawyerUserId);

    /**
     * 统计律师的差评数（0-2.5分）
     *
     * @param lawyerUserId 律师用户ID
     * @return 差评数
     */
    Integer getBadReviewCountByLawyerUserId(@Param("lawyerUserId") Integer lawyerUserId);

    /**
     * 根据律师ID和类型分页查询评价列表（包含用户和律师信息）
     *
     * @param page 分页对象
     * @param lawyerUserId 律师用户ID
     * @param type 查询分类（1：好评，2：中评，3：差评，4：有图，为空时返回全部）
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return 分页结果
     */
    IPage<OrderReviewVo> getReviewListByLawyerAndType(
            IPage<OrderReviewVo> page,
            @Param("lawyerUserId") Integer lawyerUserId,
            @Param("type") Integer type,
            @Param("currentUserId") Integer currentUserId
    );

    /**
     * 统计律师的全部评价数量
     *
     * @param lawyerUserId 律师用户ID
     * @return 全部评价数量
     */
    Integer getTotalReviewCountByLawyerUserId(@Param("lawyerUserId") Integer lawyerUserId);

    /**
     * 统计律师的有图评价数量
     *
     * @param lawyerUserId 律师用户ID
     * @return 有图评价数量
     */
    Integer getImageReviewCountByLawyerUserId(@Param("lawyerUserId") Integer lawyerUserId);

    /**
     * 根据订单ID查询关联评价
     *
     * @param orderId 订单ID
     * @return 评价信息
     */
    OrderReviewVo getOrderEvaluation(@Param("orderId") Integer orderId);
}

