<?php

/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */


class DatenWriter
{
  public $_ary;
  public $done;
  public $encryptXML;

  public function __construct()
  {
    $this->_ary = array();
    $this->done = false;
    $this->encryptXML = false;
  }

  public static function resetWriter()
  {
    DatenDateiWriter::resetInstance(); 
    DatenEmailWriter::resetInstance(); 
  }

  
  public function add($pKey, $pValue)
  {
    Logger::logg(__CLASS__ . 'nehme neuen wert ' . " für schlüssel $pKey auf<br>\n");
    if (!isset($this->_ary[$pKey])) {
      $this->_ary[$pKey] = array();
    }
    $this->_ary[$pKey][] = $pValue;
  }

  
  public function &get($pKey)
  {
    return $this->_ary[$pKey];
  }

  
  public function clear()
  {
    $this->_ary = array();
  }

  
  public function commit($pTo, $pBody, $pName = null, $pDateiendung = '.xml', $pBezeichnungsanhang = '', $contenttype = SMTP_CONTENTTYPE_XML)
  {
    return false;
  }

  

  
  public function send($pTNInfo, $pEPayInfo = null, $pDateiendung = '.xml')
  {
    $returnvalue = 0;
    if ($this->done) {
      return $returnvalue;
    }

    
    $encryptKtonr = false;
    $objsettings = ToolSettingsAPI::getToolSettings(0);
    if ($objsettings->encrypt) {
      $encryptKtonr = true;
    }

    
    $tn = $pTNInfo->getTeilnehmer();
    $haupttn = Bucher::getEmailXMLFromTeilnehmer($tn);

    
    if (isset($pEPayInfo)) {
      $haupttn->addEPayInfo($pEPayInfo);
      $haupttn->payonline = ePaymentApi::getPayonlineProviderKeyFromSession();
    } else {
      $haupttn->payonline = 0;
    }


    if (preg_match('/\\D/', $haupttn->kontonr ?? '') != 0) {
      
      
      $haupttn->kontonr = '';
    } elseif ($encryptKtonr) { 
      $haupttn->kontonr = MathOperations::aufbereitung($haupttn->kontonr);
      $haupttn->bankbez = $haupttn->bankbez . ':';
    }
    if (preg_match('/\\*/', $haupttn->iban) != 0) {
      
      
      $haupttn->iban = '';
    } 

    
    
    foreach ($this->_ary as $target => $kurse) {
      $anmeldungNode = new XMLNode('ANMELDUNG');
      $anmeldungNode->addChild($haupttn->getXMLNode());

      $kurseNode = new XMLNode('KURSE');
      for ($i = 0; $i < count($kurse); $i++) {
        if (isset($kurse[$i]->hotelAnm) && $kurse[$i]->hotelAnm->sw_zimmer !== '') {
          $kurse[$i]->hotelAnm->sw_zimmer = StringOperations::reformatSonderwunschZimmer($kurse[$i]->hotelAnm->sw_zimmer);
        }

        
        if ($encryptKtonr) {
          $kurse[$i]->abw_kontonr = MathOperations::aufbereitung($kurse[$i]->abw_kontonr);
          
          
          $kurse[$i]->abw_bankbez = $kurse[$i]->abw_bankbez . ':';
        }
        
        $weitere = $this->getWeitereTeilnehmer($pTNInfo, $kurse[$i], $encryptKtonr);
        $kurse[$i]->setWeiterStaemme($weitere);
        
        $kurseNode->addChild($kurse[$i]->getXMLNode());
      }
      $anmeldungNode->addChild($kurseNode);
      $rootNode = new XMLNode('ANMELDUNGEN');
      $rootNode->addChild(new XMLNode('MESSAGE_TYPE', 'ANMELDUNG'));
      $rootNode->addChild($anmeldungNode);
      $body = '<?xml version="1.0" encoding="' . CodingOperations::getInternalEncoding() . '" ?' . ">\r\n"
              . $rootNode->getXMLstring($rootNode);
      if ($this->encryptXML) {
        Logger::logg('DatenWriter: Komplette XML Verschlüsselung aktiviert', 1);

        $encodingResult = EncodingAPI::encodeComplete($body);
        if ($encodingResult !== false) {
          $body = $encodingResult;
        }
      }
      $bezeichnungsanhang = '';
      $success = $this->commit(
        $target,
        $body,
        $tn->getVarValue('name') . ', ' . $tn->getVarValue('vorname'),
        $pDateiendung,
        $bezeichnungsanhang
      );
      if ($success) {
        unset($this->_ary[$target]);
      } else {
        $returnvalue++;
      }
    }
    $this->done = ($returnvalue === 0);

    return $returnvalue;
  }

  private function getWeitereTeilnehmer($pTNInfo, $pKurs, $pEncryptKtonr = false)
  {
    
    
    
    $weitereTns = array();
    if (isset($pTNInfo->_kurseNeu)) {
      foreach ($pTNInfo->_kurseNeu as $kursneu) {
        


        if ($kursneu->knr == $pKurs->kursnummer && isset($kursneu->weitereTeilnehmer)) {
          $weitereTns = $pTNInfo->getWeitereNeu($kursneu->knr);
        }
      }
    } else {
      $weitereTns = $pTNInfo->getWeitere();
    }
    $weitere = array();
    foreach ($weitereTns as $weiterer) {
      $tmp = Bucher::getEmailXMLFromTeilnehmer($weiterer);
      if (isset($weiterer->istanonym) && $weiterer->istanonym == 1) {
        $tmp->istanonym = $weiterer->istanonym;
      }
      if (preg_match('/\\D/', $tmp->kontonr ?? '') != 0) {
        
        
        $tmp->kontonr = '';
      } elseif ($pEncryptKtonr) { 
        $tmp->kontonr = MathOperations::aufbereitung($tmp->kontonr);
        $tmp->bankbez = $tmp->bankbez . ':';
      }

      if (preg_match('/\\*/', $tmp->iban) != 0) {
        
        
        $tmp->iban = '';
      } 

      $weitere[] = $tmp;
    }

    return $weitere;
  }
}