<?php

namespace Tests\Fhp\Integration\KSK;

use Fhp\Model\SEPAAccount;
use Tests\Fhp\FinTsTestCase;

class KSKIntegrationTestBase extends FinTsTestCase
{
    public const TEST_BANK_CODE = '71152570';
    public const TEST_TAN_MODE = '910';

    // Anonymous dialog to fetch BPD (HKVVB, then HKEND).
    public const ANONYMOUS_INIT_REQUEST = "HNHBK:1:3+000000000145+300+0+1'HKIDN:2:2+280:71152570+9999999999+0+0'HKVVB:3:3+0+0+0+123456789ABCDEF0123456789+1.0'HKTAN:4:6+4+HKIDN'HNHBS:5:1+1'";
    public const ANONYMOUS_INIT_RESPONSE = "HNHBK:1:3+000000010910+300+608736136310=678937716332BL8H=+1+608736136310=678937716332BL8H=:1'HIRMG:2:2+3060::Bitte beachten Sie die enthaltenen Warnungen/Hinweise.+0100::Dialog beendet.'HIRMS:3:2:3+3050::BPD nicht mehr aktuell, aktuelle Version enthalten.+0020::Informationen fehlerfrei entgegengenommen.'HIBPA:4:3:3+6+280:71152570+Kreissparkasse Miesbach-Tegernsee+3+1+300'HIKOM:5:4:3+280:71152570+1+3:banking-by2.s-fints-pt-by.de/fints30+2:banking-by2.s-fints-pt-by.de::MIM:1'HISHV:6:3:3+N+DDV:1+PIN:1'HICSUS:7:1:3+1+1+1+INTC;CORT:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03'HIPKBS:8:1:3+1+1+1+N'HIPKAS:9:1:3+1+1+1+N:N:N:N:N:N:N:N:N:N:N'HIPCRS:10:1:3+1+1+1'HIPWES:11:1:3+1+1+1'HIPWLS:12:1:3+1+1+1+N:J:J'HIPWBS:13:1:3+1+1+1+N:N'HIPWAS:14:1:3+1+1+1'HIBMBS:15:1:3+1+1+1+J:J'HIDMLS:16:1:3+1+1+1'HIBMLS:17:1:3+1+1+1'HIDMBS:18:1:3+1+1+1+J:J'HIIPZS:19:1:3+1+1+1+;:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03'HIIPSS:20:1:3+1+1+1+10:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03'DIWOKS:21:1:3+1+1+1+9999999,99:EUR'DIWDHS:22:1:3+1+1+1+J:N:730'DIBVES:23:1:3+1+1+1+E'DIPTZS:24:1:3+1+1+1+J'DIEEAS:25:1:3+1+1+1+DKPTZ:1:N'DIALES:26:1:3+1+1+1+V-EC-KARTE:V-S-CARD:V-WERTKARTE'DIALLS:27:1:3+1+1+1'DIALNS:28:1:3+1+1+1+V-EC-KARTE:V-S-CARD:V-WERTKARTE'DIANAS:29:1:3+1+1+1+1:15'DIANLS:30:1:3+1+1+1'DIBAZS:31:2:3+1+1+1+J:J'DIBKDS:32:3:3+1+1+1'DIBKDS:33:4:3+1+1+1'DIBKUS:34:3:3+1+1+1+J:N'DIBUMS:35:3:3+1+1+1+N'DIBVAS:36:1:3+1+1+1'DIBVBS:37:1:3+1+1+1'DIBVDS:38:1:3+1+1+1'DIBVKS:39:1:3+1+1+1+J:V-EC-KARTE:V-S-CARD:V-WERTKARTE'DIBVPS:40:1:3+1+1+1+8:20'DIBVRS:41:1:3+1+1+1+8:20::N:N'DIBVSS:42:1:3+1+1+1'DIBVSS:43:2:3+1+1+1'DIDFAS:44:1:3+1+1+1+N'DIDFBS:45:1:3+1+1+1'DIDFCS:46:1:3+1+1+1'DIDFDS:47:1:3+1+1+1'DIDFLS:48:1:3+1+1+1'DIDFUS:49:1:3+1+1+1+N'DIDFUS:50:2:3+1+1+1+N'DIDIHS:51:1:3+1+1+1'DIDFSS:52:2:3+1+1+1+N:1;DekaBank-Konzern;5;Swisscanto;7;JPMorgan Fleming;8;Lombard Odier;10;Franklin Templeton;11;Gartmore;12;Goldman Sachs;13;Black Rock Merrill;14;Threadneedle;15;UBS;16;Schroders:10_10:Aktienfonds Asien - Pazifik ohne Japan:10_20:Aktienfonds Branche:10_30:Aktienfonds Deutschland:10_40:Aktienfonds Emerging Markets:10_50:Aktienfonds Euroland:10_60:Aktienfonds Europa Lander:10_70:Aktienfonds Europa:10_80:Aktienfonds Japan:10_90:Aktienfonds Lateinamerika:10_100:Aktienfonds Nordamerika:10_110:Aktienfonds Osteuropa:10_120:Aktienfonds Welt:10_400:Aktienfonds Afrika:10_410:Aktienfonds Mittlerer Osten:10_420:Aktienfonds Nordeuropa:20_130:Dachfonds Chance Plus:20_140:Dachfonds Chance:20_150:Dachfonds Ertrag Plus:20_160:Dachfonds Ertrag:20_170:Dachfonds Wachstum:20_180:Dachfonds laufzeitbegrenzt:30_430:Garantiefonds:40_200:Geldmarktfonds:40_210:Geldmarktnahe Fonds:50_220:Alternative Investmentfonds Hedgefonds:50_230:Alternative Investmentfonds Private Equity:50_240:Alternative Investmentfonds Rohstofffonds:60_250:Sonderkonzepte Absolute-/Total-Returnstrategiefonds:60_260:Sonderkonzepte Altersvorsorgefonds:60_270:Sonderkonzepte Institutionelle Fondskonzepte:60_280:Sonderkonzepte Steuerorientierte Fonds:70_30:Immobilienfonds Deutschland:70_70:Immobilienfonds Europa:70_120:Immobilienfonds Welt:80_50:Mischfonds Euroland:80_290:Mischfonds ausgewogen:80_300:Mischfonds dynamisch:80_310:Mischfonds flexibel:80_320:Mischfonds konservativ:90_330:Rentenfonds Inflationsindexierte Anleihen:90_340:Rentenfonds Laufzeitfonds:90_350:Rentenfonds MBS:90_360:Rentenfonds Nachranganleihen:90_370:Rentenfonds Staatsanleihen:90_380:Rentenfonds Unternehmensanleihen:90_390:Rentenfonds Wandelanleihen'DIDDIS:53:1:3+1+1+1+DKDOF;2:DKDFO;2'DIDFOS:54:2:3+1+1+1'DIDFPS:55:2:3+1+1+1'DIDPFS:56:2:3+1+1+1'DIDFES:57:2:3+1+1+1'DIDEFS:58:2:3+1+1+1'DIDOFS:59:2:3+1+1+1'DIFAFS:60:2:3+1+1+1+N:N'DIGBAS:61:1:3+1+1+1'DIGBSS:62:1:3+1+1+1+J'DIKAUS:63:3:3+1+1+1+N'DIKKAS:64:2:3+1+1+1+N:N:2'DIKKSS:65:3:3+1+1+1'DIKKUS:66:2:3+1+1+1+90:N:J'DIKSBS:67:1:3+3+1+1+J'DIKSPS:68:1:3+3+1+1+;:sepade.pain.001.001.02.xsd:sepade.pain.001.002.02.xsd:sepade.pain.001.002.03.xsd:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03'DIPAES:69:1:3+1+1'DIPSAS:70:1:3+1+1'DIPSPS:71:1:3+1+1'DIQUOS:72:1:3+1+1+1'DIQUTS:73:1:3+1+1+1'DITLAS:74:1:3+1+1'DITLFS:75:1:3+1+1+N'DITLFS:76:2:3+1+1+N'DITSPS:77:1:3+1+1+N'DIVVDS:78:1:3+3+1+1'DIVVUS:79:1:3+3+1+1+N:J'DIWAPS:80:1:3+1+1+J:STOP;SLOS;LMTO;MAKT:J:J:GDAY;GTMO;GTHD:J:1:N:N:N:9999999,99:EUR'DIWAPS:81:4:3+1+1+1+J:STOP;STLI;LMTO;MAKT;OCOO;TRST:J:J:J:J:J:GDAY;GTMO;GTHD:J:1:N:N:N:9999999,99:EUR'DIWDGS:82:1:3+1+1+1+J:N:N'DIWGVS:83:1:3+1+1+1+J:730:N'DIWLVS:84:1:3+1+1+1+J:365:N'DINZPS:85:3:3+1+1+1+N:N:4:N:N:::N:J'DIFOPS:86:3:3+1+1+1+N:4:N:N:N::::MAKT:N:J'DIFPOS:87:3:3+1+1+1+N:4:N:N:::N:J'DIWOPS:88:5:3+1+1+1+0:N:4:N:N::::9999999,99:EUR:STOP;STLI;LMTO;MAKT;OCOO;TRST:BUYI;SELL;AUCT;CONT;ALNO;DIHA:GDAY;GTMO;GTHD;GTCA;IOCA;OPEN;CLOS;FIKI:N:J'DIWVBS:89:1:3+1+1+1+N:N'DIZDFS:90:2:3+1+1+1'DIZDLS:91:2:3+1+1+1'HIAUBS:92:5:3+1+1+1'HIBMES:93:1:3+1+1+1+2:28:2:28:1000:J:N'HIBSES:94:1:3+1+1+1+2:28:2:28'HICAZS:95:1:3+1+1+1+450:N:N:urn?:iso?:std?:iso?:20022?:tech?:xsd?:camt.052.001.02'HICCMS:96:1:3+1+1+1+1000:J:N'HICCSS:97:1:3+1+1+1'HICDBS:98:1:3+3+1+1+N'HICDES:99:1:3+3+1+1+4:0:9999:0102030612:01020304050607080910111213141516171819202122232425262728293099'HICDLS:100:1:3+3+1+1+0:9999:J:J'HICDNS:101:1:3+3+1+1+0:0:9999:J:J:J:J:J:N:J:J:J:0102030612:01020304050607080910111213141516171819202122232425262728293099'HICDUS:102:1:3+3+1+1+1:0:9999:1:N:N'HICMBS:103:1:3+1+1+1+N:J'HICMES:104:1:3+1+1+1+1:360:1000:J:N'HICMLS:105:1:3+1+1+1'HICSAS:106:1:3+1+1+1+1:360'HICSBS:107:1:3+1+1+1+N:J'HICSES:108:1:3+1+1+1+1:360'HICSLS:109:1:3+1+1+1+J'HICUBS:110:1:3+3+1+1+J'HICUMS:111:1:3+3+1+1+;:sepade.pain.001.001.02.xsd:sepade.pain.001.002.02.xsd:sepade.pain.001.002.03.xsd:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03'HIDMCS:112:1:3+1+1+1+1000:J:N:2:28:2:28::urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02'HIDMES:113:1:3+1+1+1+2:28:2:28:1000:J:N'HIDSBS:114:1:3+3+1+1+J:J:56'HIDSCS:115:1:3+1+1+1+2:28:2:28::urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02'HIDSES:116:1:3+1+1+1+2:28:2:28'HIDSWS:117:1:3+1+1+1+N'HIEKAS:118:2:3+1+1+1+J:J:N:1'HIEKAS:119:3:3+1+1+1+J:J:N:1'HIEKPS:120:1:3+1+1+1+J:J:N'HIFGBS:121:2:3+3+1'HIFGBS:122:3:3+3+1'HIFRDS:123:1:3+1+1'HIFRDS:124:4:3+1+1+1+N:J:N:0:Kreditinstitut:1:DekaBank'HIKAZS:125:4:3+1+1+360:J'HIKAZS:126:5:3+1+1+360:J:N'HIKDMS:127:2:3+3+0+2048'HIKDMS:128:3:3+3+0+2048'HIKDMS:129:4:3+3+0+2048'HIKIFS:130:1:3+1+1'HIKIFS:131:4:3+1+1+1+J:J'HIKIFS:132:5:3+1+1+1+J:J'HIKIFS:133:6:3+1+1+1+J:J'HIMTAS:134:1:3+1+1+1+N'HIMTAS:135:2:3+1+1+1+N:J'HIMTFS:136:1:3+1+1+1'HIMTRS:137:1:3+1+1+1+N'HIMTRS:138:2:3+1+1+1+N:J'HINEAS:139:1:3+1+1+1:2:3:4'HINEZS:140:3:3+1+1+1+N:N:4:N:N:::N:J'HIWFOS:141:3:3+1+1+1+N:4:N:N:N::::MAKT:N:J'HIWPOS:142:5:3+1+1+1+0:N:4:N:N::::9999999,99:EUR:STOP;STLI;LMTO;MAKT;OCOO;TRST:BUYI;SELL;AUCT;CONT;ALNO;DIHA:GDAY;GTMO;GTHD;GTCA;IOCA;OPEN;CLOS;FIKI:N:J'HIWSDS:143:5:3+3+1+1+J:A;Inland DAX:B;Inland Sonstige:C;Ausland Europa:D;Ausland Sonstige'HIFPOS:144:3:3+1+1+1+N:4:N:N:::N:J'HIPAES:145:1:3+1+1+1'HIPPDS:146:1:3+1+1+1+1:Telekom:Xtra-Card:N:::15;30;50:2:Vodafone:CallYa:N:::15;25;50:3:E-Plus:Free and easy:N:::15;20;30:4:O2:Loop:N:::15;20;30:5:congstar:congstar:N:::15;30;50:6:blau:blau:N:::15;20;30:8:o.tel.o:o.tel.o:N:::9;19;29:9:SIM Guthaben:SIM Guthaben:N:::15;30;50'HIQTGS:147:1:3+1+1+1'HISALS:148:3:3+1+1'HISALS:149:4:3+1+1'HISALS:150:5:3+1+1'HISPAS:151:1:3+1+1+1+J:N:N:sepade.pain.001.001.02.xsd:sepade.pain.001.002.02.xsd:sepade.pain.001.002.03.xsd:sepade.pain.008.002.02.xsd:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02'HISPAS:152:2:3+1+1+1+J:N:N:N:sepade.pain.001.001.02.xsd:sepade.pain.001.002.02.xsd:sepade.pain.001.002.03.xsd:sepade.pain.008.002.02.xsd:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.003.02:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03:urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.001.02'HITABS:153:2:3+1+1+1'HITABS:154:3:3+1+1+1'HITABS:155:4:3+1+1+1'HITAUS:156:1:3+1+1+1+N:N:J'HITAZS:157:1:3+1+1+1'HITAZS:158:2:3+1+1+1'HITMLS:159:1:3+1+1+1'HITSYS:160:1:3+1+1+1+N:N'HIWDUS:161:4:3+3+1+999'HIWFPS:162:2:3+3+1+RENTEN:INVESTMENTFONDS:GENUSSSCHEINE:SPARBRIEFE:UNTERNEHMENSANLEIHEN:EMERGING MARKET ANLEIHEN:STRUKTURIERTE ANLEIHEN:ZERTIFIKATE:AKTIEN:OPTIONSSCHEINE:ALLE ANGEBOTE EIGENES INSTITUT:ALLE ANGEBOTE UEBERGEORD. INSTITUTE'HIWOAS:163:2:3+1+1+J:STOP;SLOS;LMTO;MAKT:J:J:GDAY;GTMO;GTHD:J:1:N:N:N:9999999,99:EUR'HIWOAS:164:4:3+1+1+1+J:STOP;STLI;LMTO;MAKT;OCOO;TRST:J:J:J:J:J:GDAY;GTMO;GTHD:J:1:N:N:N:9999999,99:EUR'HIWPDS:165:5:3+1+1+J:N:N'HIWPKS:166:1:3+3+0'HIWPRS:167:1:3+3+1+J:J:N:N::Aktien:Festverzinsliche Wertpapiere:Fonds:Fremdwahrungsanleihen:Genussscheine:Indexzertifikate:Optionsscheine:Wandel- und Optionsanleihen cum'HIWPSS:168:1:3+3+1+J'HIWSOS:169:4:3+3+1+1+J:J:90:1:2:3:4:5:6:7:8:9:10:11'HIWSOS:170:5:3+3+1+1+J:J:90:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17'HITANS:171:6:3+1+1+1+J:N:0:910:2:HHD1.3.0:::chipTAN manuell:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:911:2:HHD1.3.2OPT:HHDOPT1:1.3.2:chipTAN optisch:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:912:2:HHD1.3.2USB:HHDUSB1:1.3.2:chipTAN-USB:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:913:2:Q1S:Secoder_UC:1.2.0:chipTAN-QR:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:1:920:2:smsTAN:::smsTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:5:921:2:pushTAN:::pushTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:2:N:2:900:2:iTAN:::iTAN:6:1:TAN-Nummer:3:J:2:N:0:0:N:N:00:0:N:0'HIPINS:172:1:3+1+1+0+5:38:6:USERID:CUSTID:HKAUB:J:HKBME:J:HKBSE:J:HKCAZ:J:HKCCM:J:HKCCS:J:HKCDB:N:HKBMB:N:HKBML:J:HKDMB:N:HKDME:J:HKDML:J:HKCDE:J:HKCDL:J:HKCDN:J:HKCDU:J:HKCMB:N:HKCME:J:HKCML:J:HKCSA:J:HKCSB:N:HKCSE:J:HKCSL:J:HKCSU:J:HKIPZ:J:HKIPS:N:HKPKB:N:HKPKA:J:HKPWE:J:HKPWL:N:HKPWB:N:HKPWA:J:HKCUB:N:HKCUM:J:HKDMC:J:HKDSB:N:HKDSC:J:HKDSE:J:HKDSW:J:HKEKA:N:HKEKP:N:HKFGB:N:HKFRD:N:HKKAZ:J:HKKDM:J:HKKIF:J:HKMTA:J:HKMTF:N:HKMTR:J:HKNEA:N:HKNEZ:J:HKWFO:J:HKWPO:J:HKFPO:J:HKWSD:N:HKPAE:J:HKPPD:J:HKQTG:N:HKSAL:J:HKSPA:N:HKTAB:N:HKTAU:N:HKTAZ:N:HKTML:N:HKTSY:N:HKUTA:N:HKWDU:N:HKWFP:N:HKWOA:J:HKWPD:N:HKWPK:N:HKWPR:N:HKWPS:J:HKWSO:N:HKTAN:N:DKBKD:N:DKBKU:N:DKBUM:N:DKFDA:N:DKPAE:N:DKPSA:J:DKPSP:N:DKTLA:N:DKTLF:J:DKTSP:N:DKWAP:N:DKALE:J:DKALL:J:DKALN:J:DKANA:J:DKANL:J:DKBAZ:N:DKBVA:J:DKBVB:J:DKBVD:N:DKBVK:N:DKBVP:J:DKBVR:J:DKBVS:N:DKDFA:N:DKDFB:N:DKDFC:J:DKDFD:N:DKDFL:J:DKDFU:N:DKDIH:J:DKDFS:N:DKDDI:N:DKDFO:J:DKDFP:J:DKDPF:N:DKDFE:J:DKDEF:N:DKDOF:N:DKFAF:N:DKGBA:J:DKGBS:J:DKKAU:N:DKKKA:N:DKKKS:N:DKKKU:N:DKKSB:N:DKKSP:J:DKQUO:N:DKQUT:N:DKVVD:N:DKVVU:N:DKWDG:N:DKWGV:N:DKWLV:N:DKNZP:N:DKFOP:N:DKFPO:N:DKWOP:N:DKWVB:N:DKZDF:J:DKZDL:J:DKWOK:N:DKWDH:N:DKBVE:J:DKPTZ:N:DKEEA:N'HITAN:173:6:4+4++noref+nochallenge'HNHBS:174:1+1'";
    public const ANONYMOUS_END_REQUEST = "HNHBK:1:3+000000000113+300+608736136310=678937716332BL8H=+2'HKEND:2:1+608736136310=678937716332BL8H='HNHBS:3:1+2'";
    public const ANONYMOUS_END_RESPONSE = "HNHBK:1:3+000000000171+300+608736136310=678937716332BL8H=+2+608736136310=678937716332BL8H=:2'HIRMG:2:2+0010::Nachricht entgegengenommen.+0100::Dialog beendet.'HNHBS:3:1+2'";

    // Dialog initialization with synchronization (HKSYN). Note that the account is locked, which the bank remarks as
    // a warning (3938) in its response, but the synchronization still goes through and a Kundensystem-ID is issued.
    public const SYNC_REQUEST = "HNHBK:1:3+000000000387+300+0+1'HNVSK:998:3+PIN:1+998+1+1::0+1:20190102:030405+2:2:13:@8@00000000:5:1+280:71152570:test?@user:V:0:0+0'HNVSD:999:1+@224@HNSHK:2:4+PIN:1+999+9999999+1+1+1::0+1+1:20190102:030405+1:999:1+6:10:19+280:71152570:test?@user:S:0:0'HKIDN:3:2+280:71152570+test?@user+0+1'HKVVB:4:3+6+0+0+123456789ABCDEF0123456789+1.0'HKSYN:5:3+0'HNSHA:6:2+9999999++12345''HNHBS:7:1+1'";
    public const SYNC_RESPONSE = "HNHBK:1:3+000000000619+300+FAKEDIALOGIDabcdefghijklmnopqr+1+FAKEDIALOGIDabcdefghijklmnopqr:1'HNVSK:998:3+PIN:1+998+1+2::0+1:20200527:224900+2:2:13:@8@00000000:5:1+280:71152570:test?@user:V:0:0+0'HNVSD:999:1+@394@HNSHK:2:4+PIN:1+999+9999999+1+1+2::0+1+1:20200527:224900+1:999:1+6:10:19+280:71152570:test?@user:S:0:0'HIRMG:3:2+3060::Bitte beachten Sie die enthaltenen Warnungen/Hinweise.'HIRMS:4:2:5+0020::Auftrag ausgefuhrt.'HIRMS:5:2:4+3920::Zugelassene Zwei-Schritt-Verfahren fur den Benutzer.:910:911:912:913+0020::Der Auftrag wurde ausgefuhrt.'HISYN:6:4:5+FAKEKUNDENSYSTEMIDabcdefghij'HNSHA:7:2+9999999''HNHBS:8:1+1'";
    public const SYNC_END_REQUEST = "HNHBK:1:3+000000000415+300+FAKEDIALOGIDabcdefghijklmnopqr+2'HNVSK:998:3+PIN:1+998+1+1::FAKEKUNDENSYSTEMIDabcdefghij+1:20190102:030405+2:2:13:@8@00000000:5:1+280:71152570:test?@user:V:0:0+0'HNVSD:999:1+@196@HNSHK:2:4+PIN:1+999+9999999+1+1+1::FAKEKUNDENSYSTEMIDabcdefghij+1+1:20190102:030405+1:999:1+6:10:19+280:71152570:test?@user:S:0:0'HKEND:3:1+FAKEDIALOGIDabcdefghijklmnopqr'HNSHA:4:2+9999999++12345''HNHBS:5:1+2'";
    public const SYNC_END_RESPONSE = "HNHBK:1:3+000000000434+300+FAKEDIALOGIDabcdefghijklmnopqr+2+FAKEDIALOGIDabcdefghijklmnopqr:2'HNVSK:998:3+PIN:1+998+1+2::FAKEKUNDENSYSTEMIDabcdefghij+1+2:2:13:@8@00000000:5:1+280:71152570:test?@user:V:0:0+0'HNVSD:999:1+@198@HNSHK:2:4+PIN:1+999+9999999+1+1+2::FAKEKUNDENSYSTEMIDabcdefghij+1+1+1:999:1+6:10:19+280:71152570:test?@user:S:0:0'HIRMG:3:2+0010::Nachricht entgegengenommen.+0100::Dialog beendet.'HNSHA:4:2+9999999''HNHBS:5:1+2'";

    // Attempted dialog initialization for main dialog (HKVVB), but the account is locked and so it fails (3938).
    public const INIT_REQUEST = "HNHBK:1:3+000000000474+300+0+1'HNVSK:998:3+PIN:2+998+1+1::FAKEKUNDENSYSTEMIDabcdefghij+1:20190102:030405+2:2:13:@8@00000000:5:1+280:71152570:test?@user:V:0:0+0'HNVSD:999:1+@284@HNSHK:2:4+PIN:2+910+9999999+1+1+1::FAKEKUNDENSYSTEMIDabcdefghij+1+1:20190102:030405+1:999:1+6:10:19+280:71152570:test?@user:S:0:0'HKIDN:3:2+280:71152570+test?@user+FAKEKUNDENSYSTEMIDabcdefghij+1'HKVVB:4:3+6+0+0+123456789ABCDEF0123456789+1.0'HKTAN:5:6+4+HKIDN'HNSHA:6:2+9999999++12345''HNHBS:7:1+1'";
    public const INIT_RESPONSE = 'TODO'; // Note that there's currently no "happy path" test case for KSK.

    /**
     * Executes dialog synchronization and initialization, so that BPD and UPD are filled.
     * @throws \Throwable
     */
    protected function initDialog()
    {
        // We already know the TAN mode, so it will only fetch the BPD (anonymously) to verify it.
        $this->expectMessage(static::ANONYMOUS_INIT_REQUEST, static::ANONYMOUS_INIT_RESPONSE);
        $this->expectMessage(static::ANONYMOUS_END_REQUEST, static::ANONYMOUS_END_RESPONSE);

        // Then when we initialize a dialog, it's going to request a Kundensystem-ID and UPD.
        $this->expectMessage(static::SYNC_REQUEST, mb_convert_encoding(static::SYNC_RESPONSE, 'ISO-8859-1', 'UTF-8'));
        $this->expectMessage(static::SYNC_END_REQUEST, static::SYNC_END_RESPONSE);
        // And finally it can initialize the main dialog.
        $this->expectMessage(static::INIT_REQUEST, mb_convert_encoding(static::INIT_RESPONSE, 'ISO-8859-1', 'UTF-8'));

        $this->fints->selectTanMode(intval(self::TEST_TAN_MODE));
        $login = $this->fints->login();
        $login->ensureDone(); // No TAN required upon login.
        $this->assertAllMessagesSeen();
    }

    protected function getTestAccount(): SEPAAccount
    {
        $sepaAccount = new SEPAAccount();
        $sepaAccount->setIban('DExxABCDEFGH1234567890');
        $sepaAccount->setBic('BYLADEM1MIB');
        $sepaAccount->setAccountNumber('1234567890');
        $sepaAccount->setBlz('71152570');
        return $sepaAccount;
    }
}
