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.StoreStaffReview;
import shop.alien.entity.store.vo.StoreStaffReviewVo;

/**
 * 员工评价 Mapper 接口
 *
 * @author system
 * @since 2025-01-XX
 */
@Mapper
public interface StoreStaffReviewMapper extends BaseMapper<StoreStaffReview> {

    /**
     * 分页查询评价列表（包含用户和员工信息）
     *
     * @param page 分页对象
     * @param staffUserId 员工用户ID
     * @param userId 评价用户ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return 分页结果
     */
    IPage<StoreStaffReviewVo> getReviewListWithUser(
            IPage<StoreStaffReviewVo> page,
            @Param("staffUserId") Integer staffUserId,
            @Param("userId") Integer userId,
            @Param("currentUserId") Integer currentUserId
    );

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

    /**
     * 计算员工的平均评分（overallRating的平均值）
     *
     * @param staffUserId 员工用户ID
     * @return 平均评分（1-5星）
     */
    java.math.BigDecimal getAverageRatingByStaffUserId(@Param("staffUserId") Integer staffUserId);

    /**
     * 统计员工的全部评价数量
     *
     * @param staffUserId 员工用户ID
     * @return 全部评价数量
     */
    Integer getTotalReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);

    /**
     * 统计员工的好评数（4.5-5分）
     *
     * @param staffUserId 员工用户ID
     * @return 好评数
     */
    Integer getGoodReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);

    /**
     * 统计员工的中评数（3-4分）
     *
     * @param staffUserId 员工用户ID
     * @return 中评数
     */
    Integer getMediumReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);

    /**
     * 统计员工的差评数（0-2.5分）
     *
     * @param staffUserId 员工用户ID
     * @return 差评数
     */
    Integer getBadReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);

    /**
     * 统计员工的有图评价数量
     *
     * @param staffUserId 员工用户ID
     * @return 有图评价数量
     */
    Integer getImageReviewCountByStaffUserId(@Param("staffUserId") Integer staffUserId);

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

