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

class DataMenuWeitermeldung extends DataMenuMainTopLeft
{
  
  private $weitermeldecode;

  public function getsight($pSightId = 781)
  {
    parent::getsight($pSightId);
  }

  public function mainmenu()
  {
    if (!SessionOperations::isDmzBetrieb()) {
      echo 'Die Online-Weitermeldung wird aktuell nicht unterstützt!';
      echo "</div>\n\n";

      return;
    }

    if ($this->toolsettings->showClickpfad) {
      echo $this->getClickPath();
    }

    echo '<div class="hauptseite">' . "\n" . $this->getContentAnker();
    $this->statusmenu();

    
    
    $this->getsight();
    $this->getdataarraynocolumn();

    $optinHash = GetOperations::getVarValue('optinhash');
    if ($optinHash != '') {
      $dbwDblOptIn = new DBWorkDblOptinWeitermeldung();
      $dblOptIn = $dbwDblOptIn->getDblOptinByOptin($optinHash);
      if ($dblOptIn == null || $dblOptIn->isEmpty()) {
        Logger::logg(
          "Weitermelden: Fehler beim Verarbeiten des DoubleOptIns für OptInHash '{$optinHash}'",
          5123
        );
        $this->setExportSightInfo('dbloptin_fehler', '1');
        $this->shownocolumn();
        echo "</div>\n\n";

        return;
      }
      $weitermeldecode = $this->getWeitermeldeCodeFromDmz($dblOptIn->weitermeldecode_id);
      SessionOperations::setDatamodulToSession($weitermeldecode, SESSION_PREFIX_WM);
      $this->processDoubleOptIn($dblOptIn, $weitermeldecode->tnr);
    }
    $this->weitermeldecode = SessionOperations::getDatamodulFromSession(new Weitermeldecode(), SESSION_PREFIX_WM);

    
    
    $this->getdataarrayheader();
    $nachfolgekurs = $this->getNachfolgekurs($this->weitermeldecode->knr_nachfolgekurs);

    
    KursStore::setIntoCache($nachfolgekurs);

    $this->getdataarraybody($nachfolgekurs);
    $this->getdataarrayfooter();
    $this->getdataarraynodata();

    
    if ($this->weitermeldecode->isEmpty()) {
      $this->shownocolumn();
      echo "</div>\n\n";

      return;
    }

    if (PostOperations::getVarValue('agb_checkbox') === 'on') {
      $success = $this->weitermelden($nachfolgekurs);
      $this->setExportSightInfo('weitermeldung_ok', $success);
      $this->shownodata(); 
    } else {
      $this->showheader(); 
      $this->showbody(); 
      $this->showfooter(); 
    }

    echo "</div>\n\n";
  }

  private function getNachfolgekurs(?string $knr): \Kurs
  {
    if ($knr == null) {
      return new Kurs();
    }
    
    
    try {
      return \Kufer\Web\Classes\Addfunctions\KursOperations::getKursFromDMZ($this->weitermeldecode->knr_nachfolgekurs);
    } catch (Exception $e) {
      Logger::logg(
        "Weitermelden: Fehler beim Laden der Kursdaten des Nachfolge-Kurses ({$this->weitermeldecode->knr_nachfolgekurs}).",
        5123
      );
      
      return new Kurs();
    }
  }

  public function getdataarrayheader()
  {
    if ($this->weitermeldecode->isEmpty()) {
      parent::getdataarrayheader();

      return;
    }

    try {
      
      
      
      $kurs = \Kufer\Web\Classes\Addfunctions\KursOperations::getKursFromDMZ($this->weitermeldecode->knr, true);
      $this->dataarrayheader = array($kurs);
    } catch (Exception $e) {
      Logger::logg(
        "Weitermelden: Fehler beim Laden der Kursdaten des 'alten' Kurses ({$this->weitermeldecode->knr}).",
        5123
      );
      
      $this->dataarrayheader = array(new Kurs());
    }
  }

  
  public function weitermelden(\Kurs $nachfolgekurs): bool
  {
    $stammhoererWasLoggedIn = false;
    $stammhoererTnr = SessionOperations::getCurrentStammhoererTnr();
    if (SessionOperations::isStammhoererLoggedIn()) {
      LoginApi::logoutStammhoerer();
      $stammhoererWasLoggedIn = true;
    }
    
    
    
    SessionOperations::setVarValueWeitermelden('special_status_check', '1');
    $teilnehmer = $this->getTeilnehmerPflicht($this->weitermeldecode->tnr);
    $belegungBemerkung = $this->getBelegungBemerkung($this->weitermeldecode->belegid_nachfolgekurs);
    $success = $this->anmelden($this->weitermeldecode, $nachfolgekurs, $teilnehmer, $belegungBemerkung);
    if ($success) {
      $this->setWeitermeldecodeEingeloest($this->weitermeldecode->code);
      try {
        if ($this->weitermeldecode->belegid_nachfolgekurs > 0) {
          $this->deletePlatzreservierung($this->weitermeldecode->belegid_nachfolgekurs);
        }
      } catch (Exception $ex) {
        
        
        Logger::logg(
          "Fehler beim Löschen der Platzreservierung für die Weitermeldung: {$ex->getMessage()}",
          5123
        );
      }
      if ($stammhoererWasLoggedIn) {
        LoginApi::loginStammhoererByTnr($stammhoererTnr);
      }
      SessionOperations::unsetDatamodulFromSession(new Weitermeldecode(), SESSION_PREFIX_WM);
    }
    SessionOperations::setVarValueWeitermelden('special_status_check', null);

    return $success;
  }

  protected function getExportAdapterHeader()
  {
    return new ExpKurse();
  }

  public function getdataarraybody(?\Kurs $kurs = null)
  {
    $this->dataarraybody = array($kurs);
  }

  protected function getExportAdapterBody()
  {
    return new ExpKurse();
  }

  public function getdataarrayfooter()
  {
    if ($this->weitermeldecode->isEmpty()) {
      parent::getdataarrayfooter();

      return;
    }

    $teilnehmer = $this->getTeilnehmerPflicht($this->weitermeldecode->tnr);
    $this->dataarrayfooter = array($teilnehmer);
  }

  protected function getExportAdapterFooter()
  {
    return new ExpTeilnehmer();
  }

  public function _getClickPath($pName = 'Weitermelden')
  {
    $this->_setStdClickPath($pName, 'clickWeitermeldungFormularText');

    return $this->clickpfad;
  }

  private function getWeitermeldeCodeFromDmz(int $id): Weitermeldecode
  {
    try {
      return WeitermeldungAPI::getWeitermeldecodeFromDmzById($id);
    } catch (Exception $e) {
      Logger::logg(
        "Fehler beim Abrufen des Weitermeldecodes mit ID '$id' per DMZ (Double-OptIn): {$e->getMessage()}",
        5123
      );

      return new Weitermeldecode();
    }
  }

  
  private function processDoubleOptIn(WebDblOptin $dblOptIn, int $tnr): void
  {
    $komm = new Kommunikation();
    $komm->art = 'E';
    $komm->typ = 'T';
    $komm->wert = $dblOptIn->email;
    $komm->bezeichner = 'E-Mail';
    $komm->nr = $tnr;
    try {
      $success = KommunikationsAPI::addKommunikation($komm) == 'sendDone';
      if ($success) {
        DBWorkDblOptinWeitermeldung::getDefaultInstance()->deleteByOptin($dblOptIn->optin);
      } else {
        Logger::logg('Weitermeldung Double-Opt-In: Kommunikation wurde nicht hinzugefügt', 5123);
      }
    } catch (Exception $e) {
      Logger::logg(
        "Weitermeldung Double-Opt-In: Fehler beim Hinzufügen der Kommunikation: {$e->getMessage()}",
        5123
      );
    }
  }

  private function anmelden(
    \Weitermeldecode $weitermeldecode,
    \Kurs $nachfolgekurs,
    \TeilnehmerPflicht $teilnehmer,
    string $belegungBemerkung
  ): bool {

    
    
    
    SessionOperations::setVarValueWk('w_bemerkung', $belegungBemerkung);
    SessionOperations::setVarValueWeitermelden('active', '1');
    $buchungsvorgang = new BuchungsvorgangWEBBASysWeitermeldung(
      $nachfolgekurs,
      $weitermeldecode->tnr
    );

    $buchungsvorgang->setTNInfo(new TNInfo($teilnehmer));
    $buchungsvorgang->setKurseBySession();
    $buchungsvorgang->setBuchungsVars();

    $buchungsvorgang->buchungStep1();
    $erfolgreich = $buchungsvorgang->buchungStep2();

    if ($erfolgreich) {
      $buchungsvorgang->sendTNBestaetigung();
      $buchungsvorgang->sendBestaetigungKopie();
    }
    SessionOperations::setVarValueIntern('w_anmeldeart', '');
    SessionOperations::setVarValueWeitermelden('active', '0');

    return $erfolgreich;
  }

  private function getTeilnehmerPflicht($tnr): \TeilnehmerPflicht
  {
    $teilnehmer = TeilnehmerAPI::getTeilnehmerInfosPerDMZ($tnr, true);
    $teilnehmer = $teilnehmer->copyAsTeilnehmerPflicht();
    $kommInfo = KommunikationsAPI::getKommunikationInfosPerDMZ($tnr);

    return LoginApi::kommToTn($teilnehmer, $kommInfo);
  }

  
  private function deletePlatzreservierung(int $belegungId)
  {
    $abgleichAPI = new AbgleichAPI();
    $message = new XMLNode('belegungen');

    $belegungNode = new XMLNode('belegung');
    $belegungNode->addChild(new XMLNode('correctmode', 'delete'));
    $belegungNode->addChild(new XMLNode('id', $belegungId));
    $message->addChild($belegungNode);
    $operation = AbgleichAPI::ABGLEICH_BELEGUNGDELETE;
    $abgleichAPI->sendeNachricht($operation, new Nutzlast($message), null, true);
  }

  private function setWeitermeldecodeEingeloest(string $code): void
  {
    try {
      $abgleichApi = new \AbgleichAPI();
      $data = new \XMLNode('data');
      $data->addChild(new \XMLNode('code', $code));
      $abgleichApi->sendeNachricht(
        \AbgleichAPI::ABGLEICH_WEITERMELDECODE_EINGELOEST,
        new \Nutzlast($data)
      );
    } catch (Exception $e) {
      Logger::logg(
        "Fehler beim Löschen der Platzreservierung für den Code '$code': " . $e->getMessage(),
        5123
      );
    }
  }

  private function getBelegungBemerkung(int $belegungNr): string
  {
    $dmzResponse = BelegungAPI::getBelegungsinformationen($belegungNr, true);
    $belegungsInfos = JsonOperations::decode($dmzResponse->reason, false, 512, 0, true);

    return $belegungsInfos->Bemerkung;
  }
}