package kr.or.bok.rtgs.common

/**
 * 정족수 컨텍스트 — 센터 구성과 과반(quorum) 판정.
 * 복원력방안 2.1/2.3: 홀수 3센터라야 split-brain 차단. 완결 규율은 "과반 센터가 해당 순번을
 * 확정한 시점"이 대외 효력을 갖는다.
 *
 * 로컬 1센터 개발 시 centerCount=1 → 과반=1(자기 자신)로 즉시 완결. N센터 확장 시 활성.
 */
data class QuorumContext(
    val centerId: String,       // 이 인스턴스의 센터 (DC1/DC2/DC3)
    val centerCount: Int = 1,   // 전체 근거리 동기 센터 수
) {
    init {
        require(centerCount >= 1) { "centerCount must be >= 1" }
    }

    /** 과반 임계값 = floor(N/2)+1. (1->1, 2->2, 3->2) */
    val quorum: Int get() = centerCount / 2 + 1

    /** 주어진 확정 센터 수가 과반을 충족하는가. */
    fun hasQuorum(confirmations: Int): Boolean = confirmations >= quorum

    /** 살아있는 센터 수로 서비스 지속 가능 여부(가용성): 과반 유지 시 지속. */
    fun canServe(aliveCenters: Int): Boolean = aliveCenters >= quorum
}
