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


class DataMenuWeitermeldungCodeEingabe extends DataMenuMainTopLeft
{
  private const CODE_OK = 0;
  private const ERR_CODE_FALSCH = 1;
  private const ERR_CODE_ABGELAUFEN = 2;
  private const ERR_CODE_EINGELOEST = 3;
  private const ERR_TECHNISCHER_FEHLER = 4;

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

      return;
    }

    $this->prepareMainmenu();

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

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

    $code = trim(GetOperations::getVarValue('code'));
    $tnr = trim(GetOperations::getVarValue('tnr'));
    $knr = trim(GetOperations::getVarValue('knr'));
    if (empty($code)) {
      $settings = ToolSettingsAPI::getToolSettings(4);
      SessionOperations::setVarValueWeitermelden('DoubleOptInTnr', null);
      SessionOperations::unsetDatamodulFromSession(new Weitermeldecode(), SESSION_PREFIX_WM);
      $this->setExportSightInfo('requiretnr', $settings->weitermeldenRequireTnr);
      $this->setExportSightInfo('requireknr', $settings->weitermeldenRequireKnr);
      $this->showheader();
      echo "</div>\n\n";

      return;
    }

    try {
      $this->handleEingabe($code, $tnr, $knr);
    } catch (Exception $e) {
      Logger::logg('Weitermelden: Fehler beim Verarbeiten der Eingaben: ' . $e->getMessage(), 5122);
      $this->shownocolumn();
    }

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

  
  private function handleEingabe(string $code, string $tnr = '', string $knr = ''): void
  {
    
    $wmCode = WeitermeldungAPI::getWeitermeldecodeFromDmz($code);

    $validationResult = $this->validateCode($wmCode, $code);
    $validAdditionalData = $this->validateAdditionalData($wmCode, $tnr, $knr);

    if ($validationResult === self::CODE_OK && $validAdditionalData) {
      SessionOperations::setDatamodulToSession($wmCode, SESSION_PREFIX_WM);
      $this->setSessionValues4Weitermelden();

      if ($this->hasTnEmail($wmCode->tnr)) {
        RequestOperations::toKathaupt(290);
      } else {
        SessionOperations::setVarValueWeitermelden('DoubleOptInTnr', $wmCode->tnr);
        RequestOperations::toKathaupt(289); 
      }
    } else {
      Logger::logg("Weitermeldung: Es wurde ein nicht-valider Code eingegeben: '$code'", 5122);
      $this->setExportSightInfo('validation_error', $validationResult);
      $this->setExportSightInfo('additional_validation_error', $validAdditionalData ? '0' : '1');
      $this->shownodata(); 
    }
  }

  
  private function validateAdditionalData(\Weitermeldecode $wmCode, string $tnr, string $knr): bool
  {
    $settings = \ToolSettingsAPI::getToolSettings(4);
    if ($settings->weitermeldenRequireTnr) {
      if ($wmCode->tnr != $tnr) {
        return false;
      }
    }

    if ($settings->weitermeldenRequireKnr) {
      if ($wmCode->knr != $knr) {
        return false;
      }
    }

    return true;
  }

  
  private function setSessionValues4Weitermelden()
  {
    
    
    SessionOperations::setVarValueWeitermelden('active', '1');
    SessionOperations::setVarValueWeitermelden('special_status_check', '1');
  }

  
  private function validateCode(\Weitermeldecode $wmCode, string $codeInput): int
  {
    if ($wmCode->code !== $codeInput) {
      return self::ERR_CODE_FALSCH;
    }

    try {
      $dt = DateTimeObj::createFromString($wmCode->eingeloestam);
      if (!$dt->isDefaultDate()) {
        return self::ERR_CODE_EINGELOEST;
      }

      $dt = DateTimeObj::createFromString($wmCode->gueltigbis);
      if ($dt->isBeforeDateTime(DateTimeObj::getNow())) {
        return self::ERR_CODE_ABGELAUFEN;
      }
    } catch (Exception $ex) {
      Logger::logg('Fehler bei der Datumsprüfung. Weitermeldecode Objekt:' . print_r($wmCode, true), 5122);

      return self::ERR_TECHNISCHER_FEHLER;
    }

    return self::CODE_OK;
  }

  
  private function hasTnEmail(string $tnr): bool
  {
    $kommInfo = KommunikationsAPI::getKommunikationInfosPerDMZ($tnr);
    foreach ($kommInfo as $komm) {
      if ($komm->Art == 'E' && $komm->Druck != 'N' && !empty($komm->Wert)) {
        return true;
      }
    }

    return false;
  }

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

  public function getAnzahlBodyElements()
  {
    return 1;
  }

  public function getdataarraybody()
  {
    $this->dataarraybody = array(new Datamodul());
  }

  public function _getClickPath($pName = 'Weitermeldung - Code-Eingabe')
  {
    $this->_setStdClickPath($pName, 'clickWeitermeldungEingabeText');

    return $this->clickpfad;
  }
}