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

namespace Kufer\Web\KuferTools\Basis\PdfListen\TnListen\ShowSettingsTnListen;

use webtools\lists\TNSettings;


abstract class ShowSettingsTnListenUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  public function __construct($pRequest)
  {
    
    parent::__construct($pRequest, new ShowSettingsTnListenResponse());
  }

  
  public function hasAccess($pToolSectionId = null)
  {
    $accessZurToolSection = parent::hasAccess();
    if (!$accessZurToolSection) {
      return false;
    }

    
    
    $selected = $this->request->listName;
    $tnPdfListen = $this->getTnPdfListenObject();
    $allowedLists = $tnPdfListen->getListAry();

    if (isset($allowedLists[$selected])) {
      return true;
    }

    return false;
  }

  protected function showAnwesenheitslisteDeutschkurse()
  {
    return false;
  }

  protected function showAnwesenheitslisteMitWeitermeldung()
  {
    return false;
  }

  
  private function _getCheckBoxOptions($pListe, $pFieldset)
  {
    
    
    
    

    $vars = get_object_vars($pListe->settings->{$pFieldset});
    $checkedAry = array();

    foreach ($vars as $name => $value) {
      $checkedAry[] = $pListe->settings->{$pFieldset}->{$name};
    }

    return $checkedAry;
  }

  
  private function _getRadioBtnOptions($pListe, $pFieldset, $pRadioValues, $pCallback = null)
  {
    $option = new \stdClass();
    
    
    
    $checkedAry = array();
    $disabledAry = array();

    
    foreach ($pRadioValues as $key => $displayName) {
      $checkedAry[] = $pListe->settings->{$pFieldset} == $key;

      
      if (!(empty($pCallback))) {
        $disabledAry[] = !call_user_func(array($pListe, $pCallback), $key);
      }
    }
    $option->checkedAry = $checkedAry;
    $option->disabledAry = $disabledAry;

    return $option;
  }

  
  private function _getUmfangRadioChecked($pListe)
  {
    $options = array('A', '*', 'C');
    $checkedAry = array();
    
    foreach ($options as $wert) {
      $checkedAry[] = $pListe->settings->umfang->filter == $wert;
    }

    return $checkedAry;
  }

  
  private function _getAuffuellArtRadioOptions($pListe)
  {
    $option = new \stdClass();
    $radioOptions = array('M' => 'bis max. TN', 'S' => 'bis Seitenende');
    $checkedAry = array();
    $disabledAry = array();
    
    foreach ($radioOptions as $key => $value) {
      $checkedAry[] = $pListe->settings->druckbereich->auffuellArt == $key;
      $disabledAry[] = !$pListe->getDruckbereichEnabled("auffuellArt_$key");
    }
    $option->checkedAry = $checkedAry;
    $option->disabledAry = $disabledAry;

    return $option;
  }

  
  private function _getBemerkungOptions()
  {
    return array('I' => 'nur interne', 'E' => 'nur externe', 'IE' => 'interne und externe',
      'EI' => 'externe und interne');
  }

  
  private function _getFusszeileOptions()
  {
    
    return array(LISTEN_FUSSZEILE_ALLE => '', LISTEN_FUSSZEILE_LETZTE => '', LISTEN_FUSSZEILE_OHNE => '');
  }

  
  private function _getSortierungOptions($listObj)
  {
    return $listObj->getSortierungOptions();
  }

  
  private function _getFusszeilenOptions($pListe, $pOptionName)
  {
    
    
    if (!$pListe->showFusszeilen()
        || ($pOptionName != 'text' && $pOptionName != 'size' && $pOptionName != 'bold')) {
      return array();
    }
    
    $defaultVal = '';
    if ($pOptionName == 'bold') {
      $defaultVal = false;
    }

    
    $retAry = array();
    if (isset($pListe->settings->fusszeilen)) {
      foreach ($pListe->settings->fusszeilen as $fusszeile) {
        if (!isset($fusszeile->{$pOptionName})) {
          $fusszeile->{$pOptionName} = $defaultVal;
        }
        
        
        if ($pOptionName == 'size' && $fusszeile->{$pOptionName} == 0) {
          $fusszeile->{$pOptionName} = $defaultVal;
        }
        $retAry[] = $fusszeile->{$pOptionName};
      }
    }

    return $retAry;
  }

  private function getAnwortBoxenUeberschriftAndLabelText($pListe)
  {
    $this->response->antwortboxenLabelText = $pListe->getAntwortboxenBezeichnungEinzahl();
    $this->response->antwortboxenUeberschrift = $pListe->getAntwortboxenBezeichnungMehrzahl();
  }

  private function handleAntwortboxen($pListe)
  {
    $anzahlAntwortboxen = $pListe->getAnzahlAntwortboxen();
    $result = array();

    for ($i = 0; $i < $anzahlAntwortboxen; $i++) {
      $varname = 'SpaltenUeb' . ($i + 1);
      if (isset($pListe->settings->antwortboxen->{$varname})) {
        $result[$i] = $pListe->settings->antwortboxen->{$varname};
      }
    }

    $this->response->anzahlAntwortboxen = $anzahlAntwortboxen;
    $this->response->antwortboxen = $result;
  }

  private function handleErweiterteEinstellungen($pListe)
  {
    $this->response->showErweiterteEinstellungen = $pListe->showTextUntenOben();
    $this->response->textObenRechts = $pListe->settings->freitexte->textOben;
    $this->response->textUnten = $pListe->settings->freitexte->textUnten;
  }

  
  private function handleSpaltenanordnung($pListObj)
  {
    $this->response->spAnordnungChecked = $this->_getCheckBoxOptions($pListObj, 'spaltenanordnung');
    $spalten = get_object_vars($pListObj->settings->spaltenanordnung);
    $disabled = array();
    $text = array();
    $textAllowed = array();
    $bezeichnung = array();
    
    $i = 0;
    foreach ($spalten as $optName => $value) {
      if (!\StringOperations::endsWith($optName, '_text')) {
        $bezeichnung[$i] = $pListObj->getSpaltenanordnungText($optName);
        $disabled[$i] = !$pListObj->getSpaltenanordnungEnabled($optName);
        $text[$i] = $pListObj->settings->spaltenanordnung->{$optName . '_text'} ?? '';
        $textAllowed[$i] = $pListObj->getSpaltenanordnungTextEnabled($optName);
        $i++;
      }
    }
    $this->response->spanordnung_disabled = $disabled;
    $this->response->spanordnung_bezeichnung = $bezeichnung;
    $this->response->spanordnung_text = $text;
    $this->response->spanordnung_text_allowed = $textAllowed;
  }

  
  private function handleTnDarstellung($pListObj)
  {
    $this->response->tnDarstellungChecked = $this->_getCheckBoxOptions($pListObj, 'tnDarstellung');
    $spalten = get_object_vars($pListObj->settings->tnDarstellung);
    $disabled = array();
    $bezeichnung = array();
    
    $i = 0;
    foreach ($spalten as $optName => $value) {
      $bezeichnung[$i] = $pListObj->getTNDarstellungText($optName);
      $disabled[$i] = !$pListObj->getTNDarstellungEnabled($optName);
      $i++;
    }
    $this->response->tnDarstellungDisabled = $disabled;
    $this->response->tnDarstellungBezeichnung = $bezeichnung;
  }

  
  private function handleKopfBereich($pListObj)
  {
    $this->response->kopfBereichChecked = $this->_getCheckBoxOptions($pListObj, 'kopfbereich');
    $spalten = get_object_vars($pListObj->settings->kopfbereich);
    $disabled = array();
    
    $i = 0;
    foreach ($spalten as $optName => $value) {
      $disabled[$i] = !$pListObj->getKopfbereichEnabled($optName);
      $i++;
    }
    $this->response->kopfBereichDisabled = $disabled;
  }

  
  private function handleFusszeile($pListObj)
  {
    $callback = 'getFusszeileEnabled';
    $values = $this->_getFusszeileOptions();
    $optionObj = $this->_getRadioBtnOptions($pListObj, 'fusszeile', $values, $callback);
    $this->response->showFussZeileChecked = $optionObj->checkedAry;
    $this->response->showFussZeileDisabled = $optionObj->disabledAry;
  }

  
  private function handleBemerkung($pListObj)
  {
    $callback = 'getBemerkungEnabled';
    $values = $this->_getBemerkungOptions();
    $optionObj = $this->_getRadioBtnOptions($pListObj, 'bemerkung', $values, $callback);
    $this->response->bemerkungChecked = $optionObj->checkedAry;
    $this->response->bemerkungDisabled = $optionObj->disabledAry;
  }

  
  private function handleDruckbereich($pListObj)
  {
    $this->response->druckBereichChecked = '';
    
    $isHochformat = $pListObj->settings->druckbereich->hochformat;

    $enabledHoch = $pListObj->getDruckbereichEnabled('hochformat');
    $enabledQuer = $pListObj->getDruckbereichEnabled('querformat');
    $this->response->druckBereichFormatDisabled = array(!$enabledHoch, !$enabledQuer);

    $this->response->druckBereichFormatChecked = array($isHochformat, !$isHochformat);

    
    $this->response->druckFormatHiddenVal = '';
    if (!$enabledHoch) {
      $this->response->druckFormatHiddenVal = 'Q';
    }

    
    $optionObj = $this->_getAuffuellArtRadioOptions($pListObj);
    $this->response->druckBereichAuffuellArtChecked = $optionObj->checkedAry;
    $this->response->druckBereichAuffuellArtDisabled = $optionObj->disabledAry;

    
    $this->response->druckBereichAuffuellenChecked = $pListObj->settings->druckbereich->auffuellen;
    $this->response->druckBereichAuffuellenDisabled = !$pListObj->getDruckbereichEnabled('auffuellen');

    
    $this->response->druckBereichNameGrossChecked = $pListObj->settings->druckbereich->namegross ?? false;
    $this->response->druckBereichNameGrossDisabled = !$pListObj->getDruckbereichEnabled('namegross');
  }

  

  
  public function action()
  {
    $kursNrStr = implode(':', $this->request->kursIds);

    
    $generateList = true;
    $listObj = \TNListeFactory::create($this->request->listName, $kursNrStr, $this->getToolId());
    if (!$listObj) {
      $generateList = false;
      $fehlerText = 'Schwerer Fehler: Liste ' . $this->request->listName . ' konnte nicht erzeugt werden.';
      \Logger::logg($fehlerText, 110);
    }

    return $this->getResponse($generateList, $kursNrStr, $listObj);
  }

  
  protected function getResponse($pGenerateList, $pKursNrStr, $pListObj)
  {
    
    $this->response->name = $this->request->listName; 
    $this->response->generateList = $pGenerateList;
    
    if (!empty($pKursNrStr) && is_object($pListObj)) {
      
      $tnPdfListen = $this->getTnPdfListenObject();
      $listen = $tnPdfListen->getListAry();

      
      $bezeichnung = $listen[$this->request->listName]; 

      
      
      $dataModulList = new \Datamodul();
      $dataModulList->name = $this->request->listName; 
      
      $dataModulList->bezeichnung = $tnPdfListen->getListeBezeichnungText($this->toolSettings, $this->request->listName, $bezeichnung);
      $dataModulList->selNr = $pKursNrStr;  
      $dataModulList->toolId = $this->getToolId();
      $dataModulList->dnr = $this->request->dnr;
      $dataModulList->tnlisteForHtml = $pListObj->getListBezeichnungForHTML();

      
      $pListObj->loadSettings();

      $this->response->nurKurstageFilter = (bool)(\SerializeOperations::unserialize($this->toolSettings->druckTnListeSettings)['nurkurstagefilter1'] ?? false);

      
      
      $this->handleTnDarstellung($pListObj);

      

      
      $this->handleSpaltenanordnung($pListObj);
      
      $this->handleKopfBereich($pListObj);
      
      $this->handleBemerkung($pListObj);
      
      $this->handleFusszeile($pListObj);

      
      $this->response->kursTageVon = (isset($pListObj->kurstage->von)) ? $pListObj->kurstage->von : '';
      $this->response->kursTageBis = (isset($pListObj->kurstage->bis)) ? $pListObj->kurstage->bis : '';

      
      $this->handleDruckbereich($pListObj);

      
      $this->response->umfangChecked = $this->_getUmfangRadioChecked($pListObj);
      $this->response->umfangStatus = $pListObj->settings->umfang->customStatus;

      
      $optionObj = $this->_getRadioBtnOptions($pListObj, 'sortierung', $this->_getSortierungOptions($pListObj));
      $this->response->sortierungChecked = $optionObj->checkedAry;

      
      $this->response->ueberschrift = $pListObj->settings->caption;
      
      $this->response->showFusszeilen = $pListObj->showFusszeilen();
      
      $this->response->fussZeilenBold = $this->_getFusszeilenOptions($pListObj, 'bold');
      
      $this->response->fussZeilenText = $this->_getFusszeilenOptions($pListObj, 'text');
      $this->response->fussZeilenFontSize = $this->_getFusszeilenOptions($pListObj, 'size');
      $this->handleAntwortboxen($pListObj);
      $this->getAnwortBoxenUeberschriftAndLabelText($pListObj);
      $this->handleErweiterteEinstellungen($pListObj);

      $this->response->listObj = $dataModulList;
    } else {
      $this->response->listObj = null;
    }

    
    $this->response->druckAutomatischMeldung = $this->sollInfoAutomatischAnEinrichtungGesendetWerden();

    return $this->response;
  }

  private function sollInfoAutomatischAnEinrichtungGesendetWerden()
  {
    return isset($this->toolSettings->automatischeInfoAnEinrichtungBeiListendruck) && $this->toolSettings->automatischeInfoAnEinrichtungBeiListendruck;
  }

  
  protected function getTnPdfListenObject()
  {
    $user = $this->getUser();
    $mitAnwListeMitDozAnschrift = true;
    $showAnwesenheitslisteDeutschkurse = $this->showAnwesenheitslisteDeutschkurse();
    $showAnwesenheitslisteMitWeitermeldung = $this->showAnwesenheitslisteMitWeitermeldung();

    return new \Kufer\Web\KuferTools\Basis\PdfListen\TnListen\TnPdfListen(
      $this->getToolId(),
      $this->getToolSectionId(),
      $user->getIdentifier(),
      $mitAnwListeMitDozAnschrift,
      $showAnwesenheitslisteDeutschkurse,
      $showAnwesenheitslisteMitWeitermeldung
    );
  }
}


class ShowSettingsTnListenRequest
{
  public $kursIds;
  public $listName;
  public $dnr;
}


class ShowSettingsTnListenResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  
  public $generateList;
  
  public $listObj;

  
  
  
  public $tnDarstellungChecked;
  public $tnDarstellungDisabled;
  public $tnDarstellungBezeichnung;

  
  
  public $spAnordnungChecked;
  public $spanordnung_disabled;
  public $spanordnung_bezeichnung;
  public $spanordnung_text;
  public $spanordnung_text_allowed;
  public $kopfBereichChecked;
  public $kopfBereichDisabled;
  public $bemerkungChecked;
  public $bemerkungDisabled;
  public $showFussZeileChecked;
  public $showFussZeileDisabled;
  public $umfangChecked;
  public $umfangStatus;
  public $sortierungChecked;
  
  public $ueberschrift;
  
  public $showFusszeilen;
  
  public $fussZeilenBold;
  
  public $fussZeilenText;
  public $fussZeilenFontSize;

  
  public $druckBereichFormatChecked;
  public $druckBereichFormatDisabled;
  public $druckFormatHiddenVal;
  public $druckBereichAuffuellArtChecked;
  public $druckBereichAuffuellenChecked;
  public $druckBereichAuffuellArtDisabled;
  public $druckBereichAuffuellenDisabled;
  public $druckBereichNameGrossChecked;
  public $druckBereichNameGrossDisabled;
  public $tnlisteForHtml;
  
  public $kursTageVon;
  public $kursTageBis;

  public $anzahlAntwortboxen;
  public $antwortboxen;

  public $antwortboxenUeberschrift;
  public $antwortboxenLabelText;

  public $showErweiterteEinstellungen;
  public $textObenRechts;
  public $textUnten;

  public $druckAutomatischMeldung;
  public $sendInfoSuccess;

  
  public $nurKurstageFilter;
  public $name;
  public $druckBereichChecked;
}