package kr.or.bok.rtgs.dior

import com.fasterxml.jackson.databind.ObjectMapper
import kr.or.bok.rtgs.common.JournalEntry
import kr.or.bok.rtgs.common.Topics
import org.slf4j.LoggerFactory
import org.springframework.kafka.annotation.KafkaListener
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

/**
 * DIOR(접수동기화) — 저널(rtgs.journal)을 구독해 접수 내역을 권위 원장(PostgreSQL)에
 * 대기상태(PDNG)로 영구 저장한다. BMI 중복체크로 멱등성 보장(센터 간 동일 저널 재생).
 */
@Service
class DiorService(
    private val transfers: TransferRepository,
    private val mapper: ObjectMapper,
) {
    private val log = LoggerFactory.getLogger(javaClass)

    // 센터별 그룹(dior-DC1/DC2/DC3): 각 센터가 저널 전량을 독립 재생.
    @KafkaListener(topics = [Topics.JOURNAL], groupId = "dior-\${rtgs.center-id:DC1}", concurrency = "1")
    @Transactional
    fun onJournal(payload: String) {
        val e = mapper.readValue(payload, JournalEntry::class.java)
        val now = System.currentTimeMillis()
        // 원자적 upsert: 신규면 PDNG로 삽입, 이미 있으면 pdng_at(기록시각)만 채움 → 중복키 예외 없음.
        transfers.insertPdngIfAbsent(
            bmi = e.core.bmi,
            seq = e.globalSeq,
            sender = e.core.senderCode,
            receiver = e.core.receiverCode,
            amount = e.core.amount,
            origin = e.originCenter,
            createdAt = e.seqEpochMillis,
            updatedAt = now,
            pdngAt = now,
        )
        log.info("PDNG seq=#{} bmi={}", e.globalSeq, e.core.bmi)
    }
}
