namespace Domain.Entities.Members;
///
/// 예측 트랙레코드 배지 등급 (D2 M4 예측 채점+트랙레코드, d2 §③).
/// 채점된 표본(Hits+Misses)이 미만이면 무배지(None).
/// 그 이상은 적중률(HitRate %) 구간으로 브론즈/실버/골드, 최상위는 황금개미(GoldAnt).
///
public enum TrackRecordTier : byte
{
/// 무배지 — 표본 부족(< 10) 또는 적중률 50% 미만
None = 0,
/// 브론즈 — 적중률 50% 이상
Bronze = 1,
/// 실버 — 적중률 60% 이상
Silver = 2,
/// 골드 — 적중률 70% 이상
Gold = 3,
/// 황금개미 — 적중률 80% 이상 + 표본 30 이상 (고신뢰 상위 배지)
GoldAnt = 4
}
///
/// 트랙레코드 등급 임계값 (d2 §③ — 50/60/70% = 브론즈/실버/골드).
/// 황금개미는 d2 가 수치를 열어둔 항목으로, 소표본 어뷰징을 막기 위해 적중률 80% + 표본 30 이상을 채택한다.
///
public static class TrackRecordTiers
{
/// 배지 부여 최소 채점 표본 (Hits+Misses). 미만이면 항상 None (d2 §③ 표본 10+ 게이트).
public const int MinSample = 10;
/// 브론즈 임계 적중률 (%)
public const decimal BronzeHitRate = 50m;
/// 실버 임계 적중률 (%)
public const decimal SilverHitRate = 60m;
/// 골드 임계 적중률 (%)
public const decimal GoldHitRate = 70m;
/// 황금개미 임계 적중률 (%)
public const decimal GoldAntHitRate = 80m;
/// 황금개미 임계 표본 (Hits+Misses) — 소표본 고승률 어뷰징 차단
public const int GoldAntMinSample = 30;
/// 표본(sample=Hits+Misses)과 적중률(%)로 등급 산정.
public static TrackRecordTier Resolve(int sample, decimal hitRate)
{
if (sample < MinSample)
{
return TrackRecordTier.None;
}
if (hitRate >= GoldAntHitRate && sample >= GoldAntMinSample)
{
return TrackRecordTier.GoldAnt;
}
if (hitRate >= GoldHitRate)
{
return TrackRecordTier.Gold;
}
if (hitRate >= SilverHitRate)
{
return TrackRecordTier.Silver;
}
if (hitRate >= BronzeHitRate)
{
return TrackRecordTier.Bronze;
}
return TrackRecordTier.None;
}
}