package com.pandoli365.bibimbap.badge;

import org.springframework.stereotype.Service;

import com.pandoli365.bibimbap.mapper.ReputationEventsMapper;

@Service
public class ReputationService {

    private final ReputationEventsMapper reputationEventsMapper;
    private final BadgeService badgeService;

    public ReputationService(ReputationEventsMapper reputationEventsMapper, BadgeService badgeService) {
        this.reputationEventsMapper = reputationEventsMapper;
        this.badgeService = badgeService;
    }

    // 평판 이벤트 기록 + 해당 event_type 에 매핑된 배지 임계 재평가.
    // best-effort try/catch 는 호출자(컨트롤러 훅, 설계 S1)가 담당하므로 여기선 감싸지 않는다.
    // 단 evaluateAndSync 실패가 insertIgnore 를 무효화하지 않도록 순서: insert 먼저 → evaluate.
    public void record(long userId, String eventType, String sourceRef) {
        reputationEventsMapper.insertIgnore(userId, eventType, sourceRef);
        // event_type 1:1 매핑(REVIEW_WRITTEN→REVIEWER, GAME_UPLOADED→TECHNICIAN)에 해당하는 배지 재평가.
        for (BadgeKeys badge : BadgeKeys.values()) {
            if (badge.eventType().equals(eventType)) {
                badgeService.evaluateAndSync(userId, badge.name());
            }
        }
    }
}
