package com.pandoli365.bibimbap.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

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

/**
 * USER_RATING 트랙 소비 매퍼 — 잼 출품작(jam_entries) ⨝ game_review_stats(집계 VIEW)
 * 의 평균 별점/리뷰수를 단방향 SELECT 만 한다(W2-3 G4/F5 단방향, game_reviews/axes write 0).
 *
 * <p>game_review_stats 는 집계 VIEW → Map resultType camelCase alias 는 §33 케이스폴딩
 * 회피 위해 큰따옴표 필수(AS "avgRating"/"reviewCount" — GameReviewStatsMapper.java:13-15 선례).
 * gameId 는 jam_entries.game_id(일반 컬럼)이나 동일 SELECT 의 Map resultType 정합을 위해
 * 일관되게 큰따옴표 alias 사용.
 *
 * <p>F5 임계: review_count >= 3 미달 출품작 제외(부당 0점 회피). 리뷰 0개(VIEW 행 없음)는
 * LEFT JOIN 으로 NULL → review_count NULL → 임계 미달 제외. 6축 컬럼 미참조(단방향 G4).
 *
 * <p>정렬: avg_rating DESC NULLS LAST, game_id ASC(결정적 tiebreak). SQL 전부 `#{}`(`${}` 0).
 */
@Mapper
public interface JamReviewRatingMapper {

    @Select("""
            SELECT
                e.game_id     AS "gameId",
                st.avg_rating  AS "avgRating",
                st.review_count AS "reviewCount"
            FROM jam_entries e
            LEFT JOIN game_review_stats st ON st.game_id = e.game_id
            WHERE e.jam_id = #{jamId}
              AND e.is_delete IS NOT TRUE
              AND st.review_count >= 3
            ORDER BY st.avg_rating DESC NULLS LAST, e.game_id ASC
            """)
    List<Map<String, Object>> listAvgByJam(long jamId);
}
