#!/usr/bin/python
from pyiso20022.pain.pain_001_001_08 import *
from xsdata.formats.dataclass.serializers import XmlSerializer
from xsdata.formats.dataclass.serializers.config import SerializerConfig
from xsdata.models.datatype import XmlDate
# ADDED BY DANIELE
import sys
if len(sys.argv) <= 28:
  print("ISO20022 - GENERATOR PAYMENT MESSAGE - PACS001");
  print("Usage: python generate_pacs001.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> <formalDate>")
  sys.exit(1)

# Retrieve the script name and the two numbers from sys.argv
s_SwiftCode = sys.argv[1]
print ("SwiftCode: " + s_SwiftCode)
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]


initg_pty__id = Party11Choice(
    org_id=OrganisationIdentification8(
                                  othr=GenericOrganisationIdentification1(
                                          id="finexiabanking")
                                          ))

initg_pty = PartyIdentification43(nm="TXB Test Account",
                                  id=initg_pty__id)


grp_hdr = GroupHeader48(msg_id=messageId,
                        cre_dt_tm=formalDate,
                        nb_of_txs=1,
                        ctrl_sum=10,
                        initg_pty=initg_pty)

dbtr__pstl_adr = PostalAddress6(strt_nm=s_streetname,
                                bldg_nb=s_building_name,
                                pst_cd="---",
                                twn_nm=s_town,
                                ctry=s_country)

dbtr = PartyIdentification43(nm="UFXQHBE",
                             pstl_adr=dbtr__pstl_adr)


dbtr_acct = CashAccount24(id=AccountIdentification4Choice(
    othr=GenericAccountIdentification1(id=instruciton_id)),
                          ccy=Currency)

dbtr_agt = BranchAndFinancialInstitutionIdentification5(
    fin_instn_id=FinancialInstitutionIdentification8(
        bicfi=r_SwiftCode))

amt = AmountType4Choice(instd_amt=ActiveOrHistoricCurrencyAndAmount(value=10,
                                                                    ccy=Currency))

cdtr_agt = BranchAndFinancialInstitutionIdentification5(
    fin_instn_id=FinancialInstitutionIdentification8(
        bicfi=s_SwiftCode))

cdtr__pstl_adr = PostalAddress6(strt_nm=s_streetname,
                                bldg_nb=r_building_name,
                                pst_cd="---",
                                twn_nm=r_town,
                                ctry=r_country)

cdtr = PartyIdentification43(nm=r_AccountName,
                             pstl_adr=cdtr__pstl_adr)

cdtr_acct = CashAccount24(id=AccountIdentification4Choice(
    othr=GenericAccountIdentification1(id=r_AccountNumber)))

rmt_inf = RemittanceInformation11(ustrd=Subject)

cdt_trf_tx_inf = CreditTransferTransaction26(
    pmt_id=PaymentIdentification1(end_to_end_id=UETR),
    pmt_tp_inf=PaymentTypeInformation19(
        ctgy_purp=CategoryPurpose1Choice(prtry="Investment Payment")),
    amt=amt,
    cdtr_agt=cdtr_agt,
    cdtr=cdtr,
    cdtr_acct=cdtr_acct,
    purp=Purpose2Choice(prtry=Subject),
    rmt_inf=rmt_inf)

pmt_inf = PaymentInstruction22(pmt_inf_id=TRN,
                               pmt_mtd=PaymentMethod3Code("TRF"),
                               reqd_exctn_dt=DateAndDateTimeChoice(
                                   dt=XmlDate.from_string(shortDate)),
                               dbtr=dbtr,
                               dbtr_acct=dbtr_acct,
                               dbtr_agt=dbtr_agt,
                               cdt_trf_tx_inf=cdt_trf_tx_inf)

cstmr_cdt_trf_initn = CustomerCreditTransferInitiationV08(grp_hdr=grp_hdr,
                                                          pmt_inf=pmt_inf)

doc = Document(cstmr_cdt_trf_initn=cstmr_cdt_trf_initn)

ns_map_doc: dict[None, str] = {
    None: "urn:iso:std:iso:20022:tech:xsd:pain.001.001.08"
}

config = SerializerConfig(pretty_print=True,
                          xml_declaration=True,
                          encoding='UTF-8'
                          )
serializer = XmlSerializer(config=config)

xml_content = serializer.render(doc, ns_map=ns_map_doc)
fileOutput= "/var/www/html/iso20022.olympicbankingdashboard.com/xml_transaction/ISO2022_PACS001_" + TRN + ".xml"

with open(fileOutput, "w") as xml_file:
    xml_file.write(xml_content)
print("FILE GENERATED SUCCESSFULLY - http://iso20022.olympicbankingdashboard.com/xml_transaction/ISO2022_PACS001_" + TRN + ".xml");
