#!/usr/bin/python
from pyiso20022.pacs.pacs_008_001_08 import *
import pyiso20022.head.head_001_001_02 as hd
from xsdata.formats.dataclass.serializers import XmlSerializer
from xsdata.formats.dataclass.serializers.config import SerializerConfig
import uuid
from lxml import etree
from xsdata.models.datatype import XmlDateTime
#added by DANIEL
import sys
if len(sys.argv) <= 28: 
  print("ISO20022 - GENERATOR PAYMENT MESSAGE - PACS008");
  print("Usage: python generate_pacs008.py <s_SwiftCode> <s_BankName> <s_BankAddress> <s_AccountName> <s_AccountNumber> <Amount> <Currency> <Subject> <DateExecution> <r_SwiftCode> <r_BankName> <r_BankAddress> <r_AccountName> <r_AccountNumber> <messageId> <instructionID> <txID> <s_BuildingNumber>") 

  print(" <s_Streetname> <s_Town> <s_Country> <r_BuildingNumber> <r_StreetName> <r_Town> <r_Country> <TRN> <UETR> <shortDate>");
  sys.exit(1) 

# Retrieve the script name and the two numbers from sys.argv 
s_SwiftCode = sys.argv[1] 
s_BankName = sys.argv[2]
s_BankAddress = sys.argv[3]
s_AccountName = sys.argv[4]
s_AccountNumber = sys.argv[5]
Amount = sys.argv[6]
Currency = sys.argv[7]
Subject = sys.argv[8]
DateExecution = sys.argv[9]
r_SwiftCode = sys.argv[10]
r_BankName = sys.argv[11]
r_BankAddress = sys.argv[12]
r_AccountName = sys.argv[13]
r_AccountNumber = sys.argv[14]
messageId = sys.argv[15]
instruciton_id = sys.argv[16]
tx_id=sys.argv[17]
s_building_name=sys.argv[18]
s_streetname=sys.argv[19]
s_town=sys.argv[20]
s_country=sys.argv[21]
r_building_name=sys.argv[22]
r_streetname=sys.argv[23]
r_town=sys.argv[24]
r_country=sys.argv[25]

TRN = sys.argv[26]
UETR = sys.argv[27]

shortDate = sys.argv[28]
formalDate = sys.argv[29]


clr_sys = ClearingSystemIdentification3Choice(cd="STG")
the_sttlinf = SettlementInstruction7(sttlm_mtd=SettlementMethod1Code("CLRG"),
                                     clr_sys=clr_sys)

# Create the Group Header
grp_header = GroupHeader93(msg_id=TRN,
                           nb_of_txs=1,
                           cre_dt_tm=XmlDateTime.from_string(formalDate),
                           sttlm_inf=the_sttlinf)


pmt_id = PaymentIdentification7(instr_id=instruciton_id,
                                end_to_end_id=UETR,
                                tx_id=tx_id,
                                uetr=str(uuid.uuid4()))


zero_amt = ActiveOrHistoricCurrencyAndAmount(ccy=Currency, value=Amount)

bic_1 = FinancialInstitutionIdentification18(s_SwiftCode)
bic_2 = FinancialInstitutionIdentification18(r_SwiftCode)

agt = BranchAndFinancialInstitutionIdentification6(fin_instn_id=bic_1)

instd_agt = BranchAndFinancialInstitutionIdentification6(fin_instn_id=bic_2)
instg_agt = BranchAndFinancialInstitutionIdentification6(fin_instn_id=bic_1)

chrgs_inf = Charges7(amt=zero_amt, agt=agt)

ult_pstl = PostalAddress24(bldg_nm=r_building_name,
                           strt_nm=r_streetname,
                           twn_nm=r_town,
                           ctry=r_country)
dbtr_pstl = PostalAddress24(bldg_nm=s_building_name,
                            strt_nm=s_streetname,
                            twn_nm=s_town,
                            ctry=s_country)
ult_debtr = PartyIdentification135(nm=s_AccountName,
                                   pstl_adr=ult_pstl)
initg_pty = PartyIdentification135(nm=s_AccountName,
                                   pstl_adr=ult_pstl)
reg_debtr = PartyIdentification135(nm=s_AccountName,
                                   pstl_adr=dbtr_pstl)
instr_for_nxt_agt = InstructionForNextAgent1(instr_inf="HOLD")
instd_amt = ActiveOrHistoricCurrencyAndAmount(ccy=Currency, value=Amount)
intra_bk_st_amt = ActiveCurrencyAndAmount(ccy=Currency, value=Amount)

purp = Purpose2Choice(cd="PHON")
rem_loc = RemittanceLocation7(rmt_id="BUSINESS DEBIT")
rmt_inf = RemittanceInformation16(ustrd=[Subject])
cdtrtx = CreditTransferTransaction39(pmt_id=pmt_id,
                                     chrg_br=ChargeBearerType1Code("SHAR"),
                                     intr_bk_sttlm_dt=shortDate,
                                     intr_bk_sttlm_amt=intra_bk_st_amt,
                                     instd_amt=instd_amt,
                                     chrgs_inf=[chrgs_inf],
                                     instg_agt=instg_agt,
                                     instd_agt=instd_agt,
                                     ultmt_dbtr=ult_debtr,
                                     initg_pty=initg_pty,
                                     dbtr=reg_debtr,
                                     dbtr_agt=instg_agt,
                                     cdtr_agt=instd_agt,
                                     instr_for_nxt_agt=[instr_for_nxt_agt],
                                     purp=purp,
                                     rltd_rmt_inf=[rem_loc],
                                     rmt_inf=rmt_inf)


f2f_cust_cred_trans = FitoFicustomerCreditTransferV08(grp_hdr=grp_header,
                                                      cdt_trf_tx_inf=[cdtrtx])

doc = Document(fito_ficstmr_cdt_trf=f2f_cust_cred_trans)

# Create the AppHdr
fr_fiid = hd.FinancialInstitutionIdentification18(bicfi=s_SwiftCode)
fr_bafii = hd.BranchAndFinancialInstitutionIdentification6(fin_instn_id=fr_fiid)
fr_party44 = hd.Party44Choice(fiid=fr_bafii)

to_fiid = hd.FinancialInstitutionIdentification18(bicfi=s_SwiftCode)
to_bafii = hd.BranchAndFinancialInstitutionIdentification6(fin_instn_id=to_fiid)
to_party44 = hd.Party44Choice(fiid=to_bafii)

header = hd.AppHdr(fr=fr_party44,
                   to=to_party44,
                   biz_msg_idr="MIDRFGHJKL",
                   msg_def_idr="pacs.008.001.08",
                   biz_svc="boe.chaps.enh.01",
                   cre_dt="2019-01-01T00:00:00",
                   prty="NORM")

config_subs = SerializerConfig(pretty_print=True, xml_declaration=False)
serializer_subs = XmlSerializer(config=config_subs)

ns_map_header: dict[None, str] = {
    None: "urn:iso:std:iso:20022:tech:xsd:head.001.001.02"
}
ns_map_doc: dict[None, str] = {
    None: "urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08"
}

header_el: str = serializer_subs.render(header, ns_map=ns_map_header)
doc_el: str = serializer_subs.render(doc, ns_map=ns_map_doc)

msg_root = etree.Element('MSGRoot')
msg_root.append(etree.fromstring(header_el))
msg_root.append(etree.fromstring(doc_el))

msg_full = etree.tostring(msg_root, pretty_print=True,
                          xml_declaration=True, encoding='UTF-8')

fileOutput= "/var/www/html/iso20022.olympicbankingdashboard.com/xml_transaction/ISO2022_PACS008_" + TRN + ".xml"
with open(fileOutput, "w") as xml_file:
    xml_file.write(str(msg_full, encoding='utf-8'))

print("FILE GENERATED SUCCESSFULLY - http://iso20022.olympicbankingdashboard.com/xml_transaction/ISO2022_PACS008_" + TRN + ".xml");
 
