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

namespace Kufer\Web\KuferTools\Basis\TeilnehmerInfo\Detailsreiter\BelegteKurse;

use Kufer\Web\KuferTools\Basis\View\DetailsTabelleRowView;
use Kufer\Web\KuferTools\Basis\View\DetailsTabelleRowViewModel;

abstract class BelegteKursePresenter extends \Kufer\Web\KuferTools\Basis\Presenter\Presenter
{
  public function present()
  {
    
    $dbwBelegungen = new \DBWorkBelegung(1, true);
    $emptyBelegung = $dbwBelegungen->getNewObject();
    $belegungen = \array_merge(array($emptyBelegung), $this->useCaseResponse->belegungen);

    return $this->getAnderenContentAlsBody($belegungen);
  }

  protected function isDatamodulAryEmpty(array $datamodulArray): bool
  {
    
    return count($datamodulArray) <= 1;
  }

  
  abstract protected function getBelegteKurseView($viewModel);

  
  protected function getAnderenContent($datamodul, $key): string
  {
    $isHeader = empty($datamodul->id);
    $showCheckbox = ($datamodul->abmeldenAllowed ?? false) && $this->useCaseResponse->markierenButtons;
    $viewDetailsModel = $this->createAndereContentViewModel();
    $viewDetailsModel->belegung = $datamodul;
    $viewDetailsModel->isHeader = $isHeader;
    $viewDetailsModel->showCheckbox = $showCheckbox;
    $viewDetails = $this->getBelegteKurseView($viewDetailsModel);

    $viewModel = new DetailsTabelleRowViewModel(
      $this->useCaseResponse->toolSection,
      $this->useCaseResponse->toolSettings,
      $showCheckbox,
      $isHeader,
      trim($viewDetails->getHeader()),
      $this->useCaseResponse->columns,
      $datamodul->id,
      $datamodul
    );

    $viewModel->additionalContent = $viewDetails->getBody();
    $viewModel->checkboxInputAttr = $viewDetails->getFooter();

    $view = new DetailsTabelleRowView($viewModel);

    return $view->show();
  }

  protected function createAndereContentViewModel(): BelegteKurseRowViewModel
  {
    return new BelegteKurseRowViewModel();
  }

  protected function getButtonHtml()
  {
    $buttonleiste = new \Kufer\Web\KuferTools\Basis\Button\Buttonleiste();

    return $buttonleiste->getHtmlButtonleiste($this->useCaseResponse->reiterButtons, 'termine_buttons');
  }

  protected function getViewModel()
  {
    $viewModel = new BelegteKurseReiterViewModel();
    
    $viewModel->toolId = $this->useCaseResponse->toolId;
    $viewModel->reiterButtons = $this->getButtonHtml();
    $viewModel->markierenButtons = $this->useCaseResponse->markierenButtons;
    $viewModel->teilnehmer = $this->useCaseResponse->teilnehmer;

    if (!is_null($this->useCaseResponse->changedBelegungen)) {
      $viewModel->statusMsg = $this->getStatusMeldungen($this->useCaseResponse->changedBelegungen);
    }

    return $viewModel;
  }

  private function getStatusMeldungen($changedBelegungsArry)
  {
    $msg = '';
    if (count($changedBelegungsArry['successBelgungenDirektOrDMZ']) > 0) {
      $msg .= $this->getSuccessMessage4Storno($changedBelegungsArry['successBelgungenDirektOrDMZ']);
    }
    if (count($changedBelegungsArry['successEmail']) > 0) {
      $msg .= $this->getEMailInfoMessage4Storno($changedBelegungsArry['successEmail'], $this->useCaseResponse->sprachSettings);
    }
    if (count($changedBelegungsArry['error']) > 0) {
      $msg .= $this->getErrorMessage4Storno($changedBelegungsArry['error']);
    }

    return $msg;
  }

  
  private function getSuccessMessage4Storno($pBelegungAry)
  {
    $kursList = '';
    foreach ($pBelegungAry as $belegung) {
      $kursList .= '<div>' . \CleanOperations::cleanStringForHtml($belegung->kurs->kurzbez) . ' (' . \CleanOperations::cleanStringForHtml($belegung->kurs->id) . ')</div>';
    }
    $meldung = 'Zu folgenden Kursen wurde erfolgreich eine Stornierung durchgeführt:';

    return \HTMLOperations::getSuccessBox('<div class="successbox_text"><div>' . $meldung . '</div>' . BR_WT . $kursList . '</div>', 'Erfolgreich storniert', 'alert alert-success');
  }

  
  private function getEMailInfoMessage4Storno($pBelegungAry, $pSprachsettings)
  {
    $kursList = '';
    
    foreach ($pBelegungAry as $belegung) {
      $kursList .= '<div>' . \CleanOperations::cleanStringForHtml($belegung->kurs->kurzbez) . ' (' . \CleanOperations::cleanStringForHtml($belegung->kurs->id) . ')</div>';
      $hinderungsGruendeAry = \StornoAPI::getHinderungsGruende($belegung);
      if (count($hinderungsGruendeAry) > 0) {
        $kursList .= '<ul>';
        foreach ($hinderungsGruendeAry as $grund) {
          $kursList .= '<li> - ' . \CleanOperations::cleanStringForHtml(\StornoAPI::getText4HinderungsKonstanten($grund, $belegung, $pSprachsettings)) . '</li>';
        }
        $kursList .= '</ul>';
      }
      $kursList .= BR_WT;
    }
    $kursList .= '<div>Eine E-Mail mit den gewünschten Abmeldungen wurde an die Einrichtung versendet.</div>';

    $meldung = 'Zu folgenden Kursen wurde eine E-Mail mit der Stornoanfrage an die Einrichtung versendet:';

    return \HTMLOperations::getInfoBox('<div class="infobox_text"><div>' . $meldung . '</div>'
                                       . BR_WT . $kursList . '</div>', 'Stornierung per E-Mail versendet', 'alert alert-info');
  }

  
  private function getErrorMessage4Storno($pBelegungAry)
  {
    $kursList = '';
    foreach ($pBelegungAry as $belegung) {
      $kursList .= '<div>' . \CleanOperations::cleanStringForHtml($belegung->kurs->kurzbez) . ' (' . \CleanOperations::cleanStringForHtml($belegung->kurs->id) . ')</div>';
    }
    $meldung = 'Folgende Kurse wurden nicht Storniert, da ein Fehler aufgetreten ist. Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung:';

    return \HTMLOperations::getAlertBox('<div role="status" class="alertbox_text"><div>' . $meldung . '</div>' . BR_WT . $kursList . '</div>', 'Fehler beim Versenden der Stornierung', 'alert alert-danger');
  }
}