package kr.or.bok.rtgs.common

import java.security.MessageDigest

/**
 * 경량 명령문(핵심 전문). 참가기관 원전문(pacs.008 XML, 수 KB)에서 원장 연산에 꼭 필요한
 * 최소 정보만 추출한 수백 바이트 구조체. 센터 간에는 이것만 저널로 복제한다(복원력방안 2.7).
 *
 * - origHash: 원전문(XML) SHA-256 — 무결성·부인방지 지문. 원전문 자체는 별도 저장소(MongoDB)에 보관.
 * - amount: 이체금액(원 단위 정수). 통화는 KRW 고정(프로토타입).
 */
data class CoreMessage(
    val bmi: String,          // 거래고유식별자 22자리 (Business Message Identifier)
    val msgType: String,      // 전문유형 (예: "pacs.008.001.11")
    val senderCode: String,   // 송신기관 코드 (ORG_S)
    val receiverCode: String, // 수신기관 코드 (ORG_R)
    val debtorAcct: String,   // 의뢰인(참가기관 당좌계좌 관점에서는 송신기관 계좌) 식별
    val creditorAcct: String, // 수취인 계좌 식별
    val amount: Long,         // 이체금액(원)
    val currency: String = "KRW",
    val origHash: String,     // 원전문 SHA-256(hex)
) {
    init {
        require(amount > 0) { "amount must be positive: $amount" }
        require(senderCode != receiverCode) { "sender and receiver must differ: $senderCode" }
    }

    companion object {
        fun sha256Hex(raw: String): String {
            val md = MessageDigest.getInstance("SHA-256")
            val bytes = md.digest(raw.toByteArray(Charsets.UTF_8))
            return bytes.joinToString("") { "%02x".format(it) }
        }
    }
}
