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

/**
 * Dient zum Erfassen eines Feedbacks für Stammhörer via Feedback Fragebogen. Ermittelt zunächst einen Fragebogen und
 * einen zugehörigen Feedbackcode zum gewählten Kurs. Gibt einen entsprechenden Hinweis bzw. Fehlermeldung aus, falls
 * der FeedbackCode bereits abgelaufen oder eingelöst ist oder ein sonstiger Fehler auftritt (z.B. DMZ Fehler,
 * Fehler beim Ermitteln des Fragebogens, etc.). Leitet ansonsten zum Formular zum Erfassen des Fragebogens weiter.
 * Achtung: ist nur als Plugin erhältlich
 */
class DataMenuFeedBackFrageBogen extends DataMenuMainTopLeft
{
  /**
   * @var bool
   */
  public $doAnonym;

  /**
   * @var bool
   */
  public $includeSubFachbereich;

  public function __construct($pUrlParameter)
  {
    parent::__construct($pUrlParameter);
    $this->exportadapter = new ExpFeedBackBogen();

    $feedback = WbPluginSettings::getInstance('feedback');
    $this->doAnonym = $feedback ? $feedback->getSetting('erfassefeedbackbogenanonym') : true;
    $this->includeSubFachbereich = $feedback ? $feedback->getSetting('includesubfachbereich') : false;
  }

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

  /**
   * Gibt das Hauptmenue zur aktuellen Seite aus
   *
   * Wird von DataMenuMain::mainmenu() aufgerufen; wird in einigen abgeleiteten Klassen überschrieben;
   * gibt die aktuelle Sicht zur entsprechenden Klasse aus
   *
   * @return void
   */
  public function mainmenu()
  {
    //Feedback Formular Sicht für Codeeingabe (470)
    $this->getsight();
    $feedback = WbPluginSettings::getInstance('feedback');
    if (!$feedback || !$feedback->getSetting('doNotUseFeedbackCss')) {
      $this->_includeCSS();
    }

    $tnr = SessionOperations::getVarValueWk('w_tnr', '');

    if ($tnr == '') {
      $logText = 'Die Session ist abgelaufen bzw. enthält keine Teilnehmernummer';
      Logger::logg(__METHOD__ . ': ' . $logText, 153);
      // Ausgabe des Footers von Sicht 470: fehlerhafter Code
      $this->showFeedBackFault();

      return;
    }

    //übernimmt die Werte aus dem Request und besetzt die Attribute (knr, belid) mit den Werten aus stream
    $urlParamterFeedback = new URLParameterFeedBack();

    //Falls nicht Direkt- oder Replikatbetrieb mit DMZ eingerichtet ist, eine Fehlermeldung ausgeben.
    if (SessionOperations::isDmzBetrieb()) {
      //Kurse und der Fragebogen werden hier direkt von der Replikat DB ermittelt; hierfür gibt es keine DMZ Schnittstelle;  wenn möglich, werden
      //die Kurse aus dem Cache geholt
      $dbwKurse = new DBWorkKurse(1, true);
      $kurs = $dbwKurse->getKurs($urlParamterFeedback->knr);
      $frageBogen = FeedBackAPI::getFrageBogen($kurs, $this->includeSubFachbereich, 'T');
      if (!empty($frageBogen) && $frageBogen->id > 0) {
        $feedBackCode = FeedBackAPI::getNewCode(
          $urlParamterFeedback->belid,
          $frageBogen->id,
          $this->doAnonym,
          'WB',
          DataMenuFeedBackFactory::isOnlyUsingWebDatabase() ? \FeedBackAPI::FEEDBACK_DATA_ONLY_WEB_CODES_FROM_KUFERSQL : \FeedBackAPI::FEEDBACK_DATA_DEFAULT
        );
        if (!empty($feedBackCode)) {
          //Falls der Code eingelöst und abgelaufen sein sollte, wird die Info zum  wichtigeren Kriterium (Code ist eingelöst) ausgegeben
          if (FeedBackAPI::isCodeRedeemed($feedBackCode)) {
            // Sicht 470 Header: "Code ist eingelöst" ausgeben und dort per Link auf kathaupt 822 (Codeeingabe) weiterleiten
            $this->showFeedbackPassed($kurs, true);
          } elseif (FeedBackAPI::isCodeExpired($feedBackCode)) {
            // Sicht 470 Header: "Code ist abgelaufen" ausgeben
            $this->showFeedbackPassed($kurs, false);
          } else {
            //Weiterleiten
            $id = '';
            if (TYPO3_CMS_USED) {
              $id = 'id=' . GetOperations::getVarValue('id') . '&';
            }
            header('Location:' . INDEXSCRIPT . '?' . $id . 'kathaupt=821&feedback_code=' . $feedBackCode->code . '&stammhoererfeedback=1&knr=' . $kurs->id);
          }
        } //end if (!empty($feedBackCode))
        else {
          // Ausgabe des Footers von Sicht 470: fehlerhafter Code
          $this->showFeedBackFault();
        }
      } //end if ($frageBogenId > 0)
      else {
        $logText = 'Es wurde kein Fragebogen gefunden. siehe Einstellungen in KuferSQL unter ' . "\n"
                   . 'Einstellungen / Einstellungen Sonstiges / Bögen für die Feedbackbögen (ggf. auch Datengruppe 5 replizieren).';
        /*
         Problem mit Umlauten bei der Log-Ausgabe, das in den ersten Tests aufgetreten ist, ist nach Einfügen diese Encodings
         verschwunden; falls Problem wieder auftritt, kann es mit folgendem Code behoben werden:
        // Log-Ausgabe ggf. von UTF_8 -> CP1252 umwandeln (siehe Problem mit Umlauten)
        $encodeCharset  = new EncodeCharsetFromTo(CodingOperations::getInternalEncoding(), CP1252);
        if (CodingOperations::getInternalEncoding() !== CP1252) {
          $logText = $encodeCharset->encode($logText);
        }
        */
        Logger::logg(__METHOD__ . ': ' . $logText, 153);
        // Ausgabe des Footers von Sicht 470: fehlerhafter Code
        $this->showFeedBackFault();
      }
    } //end if (SessionOperations::isDmzBetrieb()) {
    else {
      //Fehler Ausgabe von Sicht 470 mit zusätzlicher Statusmessage
      $this->showFeedBackFault(true);
    }
  }

  protected function _includeCSS()
  {
    $path = TYPO3_CMS_RELPATH . 'plugins/feedback/';

    $cssFile = 'feedback.css';
    if (file_exists(BASEDIR . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'feedback' . DIRECTORY_SEPARATOR . 'feedback_custom.css')) {
      $cssFile = 'feedback_custom.css';
    }
    echo '<link rel="stylesheet" type="text/css" href="' . CleanOperations::cleanStringForHtml($path) . $cssFile . '">';
  }

  /**
   * Zeigt eine Fehlermeldung für Feedback bei Falscheingabe
   * wird aufgerufen wenn ein fehlerhafter Code vorliegt o.ä.
   *
   * @param type $pMitStatusMessage
   */
  private function showFeedbackFault($pMitStatusMessage = false)
  {
    //Ausgabe eines Fehlers mit Hilfe des Footers von Sicht 470 (Feedback Formular: Feedback Serverfehler)
    $dm = new class() extends Datamodul {
      public $showstatusmessage;
    };

    // Basisvariable für den Export on the fly erzeugen
    $dm->showstatusmessage = $pMitStatusMessage;
    $this->dataarrayfooter = array($dm);
    // $this->getdataarrayfooter();
    echo "<div class='hauptseite'>\n";

    echo $this->showfooter();
    echo '</div>';
  }

  /**
   * Gibt als Feedback Info aus, warum kein Feedback möglich ist
   * Gibt im Header von Sicht 470 eine Info aus, dass der FeedbackCode eingelöst wurde bzw. abgelaufen ist
   *
   * @param Kurs $pKurs
   * @param boolean $pCodeIsRedeemed steuert die Ausgabe
   */
  private function showFeedbackPassed($pKurs, $pCodeIsRedeemed = true)
  {
    //Ausgabe eines Fehlers mit Hilfe des Headers von Sicht 470 (Feedback Formular: Feedback nicht möglich)
    //zusätzliche on the fly Variable zum Steuern der Ausgabe; wird nicht in der Exportcalculation (z.B. durch Aufruf aus
    // ExportFeedbackbogen) berechnet, da dort hierzu das FeedbackCode Objekt ermittelt werden müsste (sehr aufwändig!!!)
    $pKurs->iscodeeingeloest = $pCodeIsRedeemed;
    $this->dataarrayheader = array($pKurs);
    // $this->getdataarrayfooter();
    echo "<div class='hauptseite'>\n";
    echo $this->showheader();
    echo '</div>';
  }
}
