package kr.or.bok.rtgs.common.iso20022

/**
 * ISO 20022 전문 모델(정식 스키마 기반, 2026-07-10 전환).
 *
 * 접수 전문은 **정식 pacs.008.001.08**(FIToFICustomerCreditTransfer), 결과통보는
 * **정식 pacs.002.001.10**(FIToFIPaymentStatusReport) 구조를 따른다. 검증은 iso20022.org가
 * 배포하는 공식 XSD(resources/iso20022/xsd/)로 수행한다.
 *
 * - pacs.008은 깊은 중첩 + 네임스페이스라 Jackson DTO 대신 **DOM 파싱**(Iso20022Codec)으로 핵심항목을
 *   추출한다(네임스페이스에 견고). 여기서는 추출 결과를 담는 경량 뷰(Pacs008View)만 정의한다.
 * - pacs.002는 응답 전용이라 **템플릿 문자열**로 정식 네임스페이스 전문을 생성한다(Pacs002 = 생성 파라미터).
 */

/** pacs.008에서 추출한 핵심 항목(결제에 필요한 최소 집합). */
data class Pacs008View(
    val bizMsgIdr: String?,   // EndToEndId(거래식별자 BMI). 없으면 접수센터가 부여
    val msgDefIdr: String,    // 메시지 정의(pacs.008.001.08)
    val from: String,         // 송신기관 코드 = DbtrAgt/FinInstnId/ClrSysMmbId/MmbId
    val to: String,           // 수신기관 코드 = CdtrAgt/FinInstnId/ClrSysMmbId/MmbId
    val dbtrAcct: String,     // 의뢰인(당좌) 계좌 = DbtrAcct/Id/Othr/Id
    val cdtrAcct: String,     // 수취인(당좌) 계좌 = CdtrAcct/Id/Othr/Id
    val ccy: String,          // 통화 = IntrBkSttlmAmt/@Ccy
    val amount: Long,         // 이체금액 = IntrBkSttlmAmt(text)
    val creDtTm: String?,     // 생성시각 = GrpHdr/CreDtTm
)

/** pacs.002(결과통보) 생성 파라미터. 실제 XML은 Iso20022Codec.writePacs002가 정식 구조로 직렬화. */
data class Pacs002(
    val orgnlBizMsgIdr: String = "",   // 원거래 BMI → OrgnlEndToEndId
    val msgDefIdr: String = "pacs.002.001.10",
    val from: String = "",             // 정보용(GrpHdr 참고)
    val to: String = "",
    val txSts: String = "",            // RCVD/ACTC/ACSP/ACCC/RJCT/PDNG → TxSts
    val clrSysRef: String? = null,     // 결제시스템 참조(전역순번/사유) → ClrSysRef
    val creDtTm: String? = null,
)
