/**
 * SBV ISO 20022 — pacs.009 mBridge Builder Tests
 */

import { buildPacs009, Pacs009Input } from '../src/transformer/pacs009-mbridge-builder';

const SAMPLE_INPUT: Pacs009Input = {
  msgId:          'MBRIDGE20241215001',
  instructingBic: 'VBAAVNVX',    // Agribank
  instructedBic:  'BKKBTHBK',    // Bangkok Bank (ASEAN)
  amount:         50_000_000,
  currency:       'VND',
  settlementDate: '2024-12-15',
  underlyingCustomer: {
    endToEndId:    'KH20241215001',
    debtorName:    'NGUYEN VAN AN',
    debtorAcct:    '1400123456789',
    debtorBic:     'VBAAVNVX',
    creditorName:  'SOMCHAI JAIDEE',
    creditorAcct:  'TH9900001234567890123456789',
    creditorBic:   'BKKBTHBK',
    purposeCode:   'TRAD',
    remittanceInfo:'Thanh toan hang hoa hop dong 2024/THB-001',
  },
};

describe('buildPacs009 (ASEAN mBridge)', () => {

  test('should produce valid pacs.009 XML structure', () => {
    const result = buildPacs009(SAMPLE_INPUT);
    expect(result.isoXml).toContain('FICdtTrf');
    expect(result.isoXml).toContain('urn:iso:std:iso:20022:tech:xsd:pacs.009.001.09');
    expect(result.isoXml).toContain('MBRIDGE');
    expect(result.isoXml).toContain('VND');
  });

  test('should embed UndrlygCstmrCdtTrf for FATF R.16 compliance', () => {
    const result = buildPacs009(SAMPLE_INPUT);
    expect(result.isoXml).toContain('UndrlygCstmrCdtTrf');
    expect(result.isoXml).toContain('NGUYEN VAN AN');
    expect(result.isoXml).toContain('SOMCHAI JAIDEE');
    expect(result.isoXml).toContain('TRAD');
  });

  test('should include head.001 Business Application Header', () => {
    const result = buildPacs009(SAMPLE_INPUT);
    expect(result.businessAppHdr).toContain('head.001.001.03');
    expect(result.businessAppHdr).toContain('VBAAVNVX');
  });

  test('should generate valid UUID v4 UETR', () => {
    const result = buildPacs009(SAMPLE_INPUT);
    const uuidV4 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
    expect(result.uetr).toMatch(uuidV4);
  });

  test('should produce SHA-256 hash (64 hex chars)', () => {
    const result = buildPacs009(SAMPLE_INPUT);
    expect(result.messageHash).toHaveLength(64);
    expect(result.messageHash).toMatch(/^[0-9a-f]{64}$/);
  });

  test('two pacs.009 for same input should have different UETRs', () => {
    const r1 = buildPacs009(SAMPLE_INPUT);
    const r2 = buildPacs009(SAMPLE_INPUT);
    expect(r1.uetr).not.toEqual(r2.uetr);
  });

  test('should use CLRG settlement with MBRIDGE clearing system', () => {
    const result = buildPacs009(SAMPLE_INPUT);
    expect(result.isoXml).toContain('<SttlmMtd>CLRG</SttlmMtd>');
    expect(result.isoXml).toContain('<Cd>MBRIDGE</Cd>');
  });

  test('instructingBic and instructedBic should appear in XML', () => {
    const result = buildPacs009(SAMPLE_INPUT);
    expect(result.isoXml).toContain('VBAAVNVX');
    expect(result.isoXml).toContain('BKKBTHBK');
  });

});
