/**
 * VNLH-VND SDK — Core Types & Domain Model
 * Ngân hàng Nhà nước Việt Nam — Hạ tầng Thanh toán Số Quốc gia
 *
 * Kiến trúc tổng thể:
 *   SBV (NHNN) là trung tâm kết nối:
 *     ┌──────────────────────────────────────────────────────────────────┐
 *     │  NHTM trong nước  ──► NAPAS ──► SBV VNLH-GW ──► SWIFT/mBridge  │
 *     │  IBPS legacy      ──► Transformer ──► ISO 20022 core             │
 *     │  CBDC pilot       ──► Gov-Chain anchor ──► VNLH ledger           │
 *     └──────────────────────────────────────────────────────────────────┘
 *
 * Phân tầng trách nhiệm thể chế:
 *   - Lập pháp   : Khung pháp lý ISO 20022, Luật NHNN, Luật PCRT
 *   - Hành pháp  : NHNN điều hành hạ tầng VNLH, cấp phép NHTM
 *   - Tư pháp    : Xác thực tranh chấp dựa trên audit trail Gov-Chain
 *   - Kiểm toán  : KTNN kiểm tra audit log immutable on-chain
 *   - Địa phương : Tích hợp ngân sách tỉnh qua VNLH-GOV channel
 */

// ─── Phân loại thể chế ───────────────────────────────────────────────────────

export type InstitutionRole =
  | 'SBV'           // Ngân hàng Nhà nước Việt Nam
  | 'NAPAS'         // Công ty Cổ phần Thanh toán Quốc gia Việt Nam
  | 'SOB'           // State-owned Bank (Vietcombank, BIDV, Agribank, VietinBank)
  | 'JSB'           // Joint-Stock Commercial Bank
  | 'FBB'           // Foreign Bank Branch
  | 'MFI'           // Microfinance Institution
  | 'PSP'           // Payment Service Provider (ví điện tử)
  | 'GOV_TREASURY'  // Kho bạc Nhà nước
  | 'GOV_LOCAL'     // Chính quyền địa phương (HCMC, HN, ...)
  | 'SAA'           // State Audit Authority (Kiểm toán Nhà nước)
  | 'MOF'           // Bộ Tài chính
  | 'MBRIDGE_PEER'; // Đối tác ASEAN mBridge

// ─── Kênh kết nối ────────────────────────────────────────────────────────────

export type SettlementChannel =
  | 'NAPAS_DOMESTIC'   // Thanh toán bù trừ nội địa qua NAPAS
  | 'ASEAN_MBRIDGE'    // Chuyển vốn xuyên biên giới ASEAN mBridge
  | 'SWIFT_SIPN'       // Kết nối SWIFT MV-SIPN (live/pilot)
  | 'SWIFT_SANDBOX'    // SWIFT Developer Sandbox
  | 'SBV_SUPERVISORY'  // Kênh giám sát nội bộ NHNN
  | 'SBV_ACCOUNT_MGT'  // Quản lý tài khoản Nostro/Vostro
  | 'VNLH_GOV'         // Kênh NSNN / Kho bạc Nhà nước
  | 'CBDC_PILOT';      // Thử nghiệm CBDC (giai đoạn M3+)

// ─── Loại tiền tệ có cơ chế kiểm soát đặc biệt ──────────────────────────────

export type ControlledCurrency =
  | 'VND'   // Đồng Việt Nam — tiền tệ quốc gia, kiểm soát NHNN
  | 'USD'   // US Dollar — phải tuân thủ Nghị định 70/2014/NĐ-CP
  | 'EUR'   // Euro
  | 'CNY'   // Nhân dân tệ — theo dõi đặc biệt mBridge
  | 'THB'   // Thai Baht — ASEAN payment
  | 'SGD'   // Singapore Dollar — ASEAN payment
  | 'MYR'   // Malaysian Ringgit — ASEAN payment
  | 'PHP';  // Philippine Peso — ASEAN payment

// ─── AML/CFT Risk Level ───────────────────────────────────────────────────────

export type AmlRiskLevel = 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';

export interface AmlScreeningResult {
  uetr:         string;
  riskLevel:    AmlRiskLevel;
  /** Lý do nếu bị gắn cờ HIGH/CRITICAL */
  flags:        AmlFlag[];
  /** Giao dịch có được phép tiếp tục không */
  permitted:    boolean;
  /** Yêu cầu Enhanced Due Diligence */
  requiresEDD:  boolean;
  screenedAt:   string;
}

export interface AmlFlag {
  code:     string;  // e.g. 'THRESHOLD_EXCEEDED', 'PEP_MATCH', 'SANCTION_HIT'
  message:  string;
  field?:   string;
}

// ─── VNLH Transaction ─────────────────────────────────────────────────────────

export interface VnlhTransaction {
  /** Message ID ISO 20022 */
  msgId:          string;
  /** Unique End-to-end Transaction Reference (UUID v4) */
  uetr:           string;
  /** Message type theo ISO 20022 MsgDefIdr */
  msgDefId:       string;
  /** BIC ngân hàng gửi */
  senderBic:      string;
  /** Loại thể chế gửi */
  senderRole:     InstitutionRole;
  /** Số tiền */
  amount:         number;
  /** Tiền tệ */
  currency:       ControlledCurrency;
  /** Kênh thanh toán */
  channel:        SettlementChannel;
  /** SHA-256 hash message body */
  msgHash:        string;
  /** Trạng thái ISO 20022 */
  status:         Iso20022TransactionStatus;
  /** Kết quả AML screening */
  amlResult?:     AmlScreeningResult;
  /** Đã neo Gov-Chain chưa */
  govChainAnchored: boolean;
  /** Block hash Gov-Chain nếu đã anchored */
  govChainBlockHash?: string | null;
  createdAt:      string;
  updatedAt:      string;
}

// ─── ISO 20022 Status Codes ───────────────────────────────────────────────────

export type Iso20022TransactionStatus =
  | 'RCVD'  // Received — đã nhận, chưa xử lý
  | 'PDNG'  // Pending — đang chờ xử lý
  | 'ACCP'  // AcceptedCustomerProfile
  | 'ACSP'  // AcceptedSettlementInProcess
  | 'ACSC'  // AcceptedSettlementCompleted
  | 'ACFC'  // AcceptedFundsChecked (SWIFT gpi)
  | 'RJCT'  // Rejected
  | 'CANC'  // Cancelled
  | 'HOLD'; // Hold — tạm giữ chờ EDD/AML

// ─── Gov-Chain Anchor ─────────────────────────────────────────────────────────

export interface GovChainAnchor {
  msgHash:    string;
  uetr?:      string | null;
  msgDefId:   string;
  status:     'pending' | 'anchored' | 'failed';
  blockHash:  string | null;
  anchoredAt: number;
  error?:     string;
  /** Mã giao dịch trên Gov-Chain nếu đã anchored */
  chainTxId?: string;
  /** Block number trên VNLH ledger */
  blockNumber?: number;
}

// ─── SWIFT OAuth Session Config ───────────────────────────────────────────────

export interface SwiftOAuthConfig {
  /** https://api.swiftnet.sipn.swift.com hoặc sandbox */
  host:           string;
  consumerKey:    string;
  consumerSecret: string;
  scope:          string;
  audience:       string;
  tokenUrl:       string;
  /** JKS keystore path cho mTLS */
  certPath?:      string;
  certPassword?:  string;
  certAlias?:     string;
}

// ─── VND Settlement Netting ───────────────────────────────────────────────────

export interface VndNettingPosition {
  bic:        string;
  netAmount:  number;    // dương = có nhận, âm = phải trả
  currency:   'VND';
  valueDt:    string;    // YYYY-MM-DD
  txCount:    number;
}

// ─── Institutional Governance Policy ─────────────────────────────────────────

export interface GovernancePolicy {
  /** Tên chính sách */
  name:             string;
  /** Thiết chế chịu trách nhiệm */
  owner:            'LEGISLATIVE' | 'EXECUTIVE' | 'JUDICIAL' | 'AUDIT' | 'LOCAL_GOV';
  /** Message types áp dụng */
  applicableToMsgs: string[];   // e.g. ['pacs.008.*', 'auth.*']
  /** Ngưỡng kích hoạt kiểm tra bổ sung (VND) */
  thresholdVnd?:    number;
  /** Bắt buộc Gov-Chain anchor */
  requiresAnchor:   boolean;
  /** Bắt buộc AML EDD */
  requiresEDD:      boolean;
  /** Văn bản pháp lý tham chiếu */
  legalRef?:        string;
}
