<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */

abstract class AnmeldedatenSender implements IAnmeldedatenSender
{
  
  protected function send($anmeldedaten, $anmeldeart, $nomappingAbw = false, $nomappingHauptTn = false)
  {
    $anmeldungenNode = new XMLNode('anmeldungen');

    $anmeldungNode = new XMLNode('anmeldung');
    $anmeldungNode->addChild(new XMLNode('art', $anmeldeart));
    $gutscheinNode = new XMLNode('gutschein');

    $gutscheinNode->addChild(new XMLNode('nummer', $anmeldedaten->getGutscheinNr()));
    $gutscheinNode->addChild(new XMLNode('code', $anmeldedaten->getGutscheinCode()));
    $anmeldungenNode->addChild($gutscheinNode);

    $xmlDataGeneratorAnmeldedaten = new XmlDataGeneratorAnmeldedaten();
    $anmeldedatenNode = $xmlDataGeneratorAnmeldedaten->getXmlNode($anmeldedaten);
    $anmeldungNode->addChild($anmeldedatenNode);

    $anmeldungNode->addChild($this->getEMailNode($anmeldedaten));

    $anmeldungenNode->addChild(new XMLNode('MESSAGE_TYPE', 'ANMELDUNG'));
    $anmeldungenNode->addChild($anmeldungNode);

    $abgleichApi = new AbgleichAPI();
    $nutzlast = new Nutzlast($anmeldungenNode);
    if ($nomappingAbw) {
      $nutzlast->addNode(new XMLNode('nomappingabw', 'W'));
    }
    if ($nomappingHauptTn) {
      $nutzlast->addNode(new XMLNode('nomappinghaupttn', 'W'));
    }
    $feature = AbgleichAPI::ABGLEICH_ANMELDUNGDIREKT;
    $knr = $anmeldedaten->getKurs()->id;

    if (is_int($anmeldedaten->getDmzFeatureNr()) && $anmeldedaten->getDmzFeatureNr() > 0) {
      $feature = $anmeldedaten->getDmzFeatureNr();
    }

    if ($feature != AbgleichAPI::ABGLEICH_ANMELDUNGDIREKT) {
      \Logger::logg('Direktanmeldung mit Feature ' . $feature . ' zu Kurs ' . $knr . ' von Teilnehmer ' . $anmeldedaten->getHauptBelegung()->teilnehmer->namevorname, 11);
    }

    $result = $abgleichApi->sendeNachricht($feature, $nutzlast);

    
    
    $dmzResult = array();
    if (preg_match('/\\{.*\\}/', $result->reason, $dmzResult)) {
      $dmzResult = json_decode($dmzResult[0]);
    }

    $tool4Settings = \ToolSettingsAPI::getToolSettings(4);

    if ($tool4Settings->anmWebPlattformMail) {
      if (is_array($dmzResult->WebplattformStatusUndMeetingInfos)) {
        $this->merkeWebPlattformLinks($dmzResult->WebplattformStatusUndMeetingInfos, $knr);
      } else {
        Logger::logg('Sofortiges Einbuchen: Es ist eingestellt, dass Teilnehmer eine E-Mail mit Links zu Web-Plattformen erhalten sollen, jedoch gab BAS-DMZ diese nicht zurück. Möglicherweise ist die REST-Schnittstelle nicht eingerichtet.', 735);
      }
    }

    if ($tool4Settings->anmStornoLinkMail) {
      if (is_array($dmzResult->Stornohashes)) {
        $this->merkeStornoLinks($dmzResult->Stornohashes, $knr);
      } else {
        Logger::logg('Sofortiges Einbuchen: Es ist eingestellt, dass Teilnehmer eine E-Mail mit Stornolinks erhalten sollen, jedoch gab BAS-DMZ die Stornolinks nicht zurück. ', 735);
      }
    }

    
    $dmzIdsResultArray = $dmzResult->TnrMapping;

    $dmzIds = array();
    foreach ($dmzIdsResultArray as $stdObjekt) {
      $dmzIds[] = $stdObjekt->Value;
    }

    return $dmzIds;
  }

  
  private function merkeStornoLinks($stornoHashes, $knr)
  {
    
    foreach ($stornoHashes as $stornohash) {
      \Kufer\Web\Classes\Anmeldung\OnlinePortal\AnmeldeOnlinePortalDataSingleton::instance()
        ->addStornoLinkData($knr, $stornohash->TnrMySQL, $stornohash->Name, $stornohash->Vorname, $stornohash->Email, $stornohash->Belegid, $stornohash->Stornohash);
    }
  }

  private function merkeWebPlattformLinks($dmzWebplattformStatusArray, $knr)
  {
    

    foreach ($dmzWebplattformStatusArray as $dmzWebplattformStatusUndMeetingInfos) {
      $meetingInfosResult = array();
      foreach ($dmzWebplattformStatusUndMeetingInfos->InfosEinzelplattformen as $meetingInfo) {
        $webportalData = new \Kufer\Web\Classes\Anmeldung\OnlinePortal\WebportalData();
        $webportalData->success = $meetingInfo->Status;
        $webportalData->software = $meetingInfo->Software;
        $webportalData->meetingid = $meetingInfo->MeetingID;
        $webportalData->link = $meetingInfo->Link;
        $webportalData->joinurl = $meetingInfo->JoinURL;
        $meetingInfosResult[] = $webportalData;
      }
      \Kufer\Web\Classes\Anmeldung\OnlinePortal\AnmeldeOnlinePortalDataSingleton::instance()
        ->addWebportalData(
          $knr,
          $dmzWebplattformStatusUndMeetingInfos->TnrMySQL,
          $dmzWebplattformStatusUndMeetingInfos->Name,
          $dmzWebplattformStatusUndMeetingInfos->Vorname,
          $dmzWebplattformStatusUndMeetingInfos->Email,
          $dmzWebplattformStatusUndMeetingInfos->Status,
          $meetingInfosResult
        );
    }
  }

  private function getEMailNode($anmeldedaten)
  {
    $teilnehmer = array();
    $teilnehmer[] = $anmeldedaten->getHauptBelegung()->teilnehmer;
    $teilnehmer = array_merge($teilnehmer, $anmeldedaten->getWeitereTeilnehmer());

    $emailsNode = new XMLNode('emails');
    foreach ($teilnehmer as $tn) {
      if ($tn != null) {
        $emailNode = new XMLNode('email');
        $emailNode->addChild(new XMLNode('tnr', $tn->id));
        $emailNode->addChild(new XMLNode('mail', $tn->getEMailAddress()));
        $emailsNode->addChild($emailNode);
      }
    }

    return $emailsNode;
  }
}