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

namespace Kufer\Web\KuferTools\Basis\Presenter;


abstract class MitRahmenPresenter extends Presenter
{
  public function present()
  {
    $rahmenView = $this->getRahmenView();

    return $rahmenView->getHeader()
      . $this->getMenuLeiste()
      . '<main id="main-content">' . $this->getContent() . '</main>'
      . $rahmenView->getFooter();
  }

  protected function getContent()
  {
    return parent::present();
  }

  
  protected function getRahmenView(): \Kufer\Web\KuferTools\Basis\View\RahmenView
  {
    $viewModel = new \Kufer\Web\KuferTools\Basis\View\RahmenViewModel();
    if (isset($this->useCaseResponse->user)) {
      $viewModel->user = $this->useCaseResponse->user;
    }

    $viewModel->jsdeclarations = $this->getJsDeclarations();
    $viewModel->jsfiles = $this->getJsFiles();
    $viewModel->cssfiles = $this->getCssFiles();
    $viewModel->impressum = $this->useCaseResponse->impressum;
    $viewModel->agb = $this->useCaseResponse->agb;
    $viewModel->datenschutz = $this->useCaseResponse->datenschutz;
    $viewModel->copyrightYear = $this->useCaseResponse->copyrightYear;
    $viewModel->veranstalter = $this->getVeranstalter();
    $viewModel->select_veranstalter = \SessionOperations::getVarValueWTIntern(\Kufer\Web\KuferTools\Veranstalter\Utils\VeranstalterUtils::SESSION_VERANSTALTER_NUM, 0);
    $viewModel->titel = $this->getSeitenTitel();

    return new \Kufer\Web\KuferTools\Basis\View\RahmenView($viewModel);
  }

  protected function getJSDeclarations(): string
  {
    $result = parent::getJSDeclarations();

    if (!is_null($this->useCaseResponse->pdftitle ?? null) && !is_null($this->useCaseResponse->pdfbinary ?? null)) {
      $result .= \JsOperations::getDeclarationJson('KuferTools.PDF', array(
        'Title' => $this->useCaseResponse->pdftitle,
        'Binary' => 'data:application/octet-stream;base64,' . base64_encode($this->useCaseResponse->pdfbinary)
      ));
    }

    return $result;
  }

  protected function getJsFilesSrcAry(): array
  {
    return array_merge(
      parent::getJsFilesSrcAry(),
      array(
        $this->getJsFileFromJQuery('../extern/pdfjs-3.8.162/pdf.js'),
        $this->getJsFileFromSys('showpdf.js')
      )
    );
  }

  protected function getVeranstalter(): array
  {
    $dbwBeziehungen = new \DBWorkBeziehung(1, true);
    if (isset($this->useCaseResponse->user)) {
      $dnrs = $dbwBeziehungen->getVeranstalterDnrs($this->useCaseResponse->user);
      $dbwDozenten = new \DBWorkDozenten();
      $i = 0;

      return \array_map(function(\Dozent $doz) use (&$i) {
        return array(
          'key' => $i++,
          'name' => $doz->getVarValue('titel_name_vorname')
        );
      }, $dbwDozenten->getDozentenByIDArray($dnrs));
    } else {
      return array();
    }
  }

  protected function getMenuLeiste(): string
  {
    if (count($this->useCaseResponse->menuPunkte) > 0) {
      $menuLeisteView = $this->getMenuLeisteView();
      $menuPunkteViews = $this->getMenuPunkteViews($this->getMenuPunkte4ViewModel());

      $result = $menuLeisteView->getHeader();
      foreach ($menuPunkteViews as $menuPunkteView) {
        $result .= $this->getMenuPunkt($menuPunkteView);
      }
      $result .= $menuLeisteView->getFooter();

      return $result;
    } else {
      return '';
    }
  }

  protected function getMenuPunkt($menuPunkteView): string
  {
    $result = '';
    if ($menuPunkteView->anzahlUnterPunkte() > 1) {
      $result .= $menuPunkteView->getHeader();
      $result .= $menuPunkteView->getBody();
      $result .= $menuPunkteView->getFooter();
    } else {
      $result .= $menuPunkteView->getNoColumn();
    }

    return $result;
  }

  private function getMenuLeisteView(): \Kufer\Web\KuferTools\Basis\View\MenuLeisteView
  {
    $viewModel = new \Kufer\Web\KuferTools\Basis\View\MenuLeisteViewModel();

    return new \Kufer\Web\KuferTools\Basis\View\MenuLeisteView($viewModel);
  }

  private function getMenuPunktView($text, $link, $target = ''): \Kufer\Web\KuferTools\Basis\View\MenuPunktView
  {
    $menuPunkt = new \Kufer\Web\KuferTools\Basis\View\MenuPunkt();
    $menuPunkt->link = $link;
    $menuPunkt->text = $text;
    $menuPunkt->target = $target;

    
    
    
    
    
    
    if ($target == '_blank') {
      $menuPunkt->rel = 'noreferrer';
    }

    $viewModel = new \Kufer\Web\KuferTools\Basis\View\MenuPunktViewModel();
    $viewModel->unterpunkte = array($menuPunkt);

    return new \Kufer\Web\KuferTools\Basis\View\MenuPunktView($viewModel);
  }

  private function getOberPunktView($oberpunktText, $menuPunkte): \Kufer\Web\KuferTools\Basis\View\MenuPunktView
  {
    $viewModel = new \Kufer\Web\KuferTools\Basis\View\MenuPunktViewModel();
    $viewModel->unterpunkte = array();
    $viewModel->bezeichnung = \StringOperations::substr($oberpunktText, 0, strrpos($oberpunktText, '_'));
    $viewModel->groupid = 'menubar_menugroup_' . str_replace(' ', '_', $oberpunktText);

    foreach ($menuPunkte as $menuPunkt) {
      $menuPunktVm = new \Kufer\Web\KuferTools\Basis\View\MenuPunkt();
      $menuPunktVm->link = $menuPunkt['link'];
      $menuPunktVm->text = $menuPunkt['beschriftung'];
      $menuPunktVm->target = $menuPunkt['target'] ?? '';
      $menuPunktVm->rel = $menuPunkt['rel'] ?? '';
      if ($menuPunktVm->target == '_blank') {
        $menuPunktVm->rel = 'noreferrer';
      }
      $viewModel->unterpunkte[] = $menuPunktVm;
    }

    return new \Kufer\Web\KuferTools\Basis\View\MenuPunktView($viewModel);
  }

  private function getMenuPunkteViews($menuPunkte): array
  {
    $result = array();
    foreach ($menuPunkte as $key => $punkt) {
      if (is_numeric($key)) {
        $result[] = $this->getMenuPunktView($punkt['beschriftung'], $punkt['link'], $punkt['target']);
      } elseif (is_string($key)) {
        $result[] = $this->getOberPunktView($key, $punkt);
      } elseif (count($punkt) == 1) {
        $result[] = $this->getMenuPunktView($punkt[0]['beschriftung'], $punkt[0]['link'], isset($punkt[0]['target']) ? $punkt[0]['target'] : '');
      }
    }

    return $result;
  }

  protected function getMenuPunkte4ViewModel(): array
  {
    
    
    $responsiveTools = array(
        1, 3, 7, 18, 37, 10, 5, 32, 6, 8, 11, 39, 38,
        12, 14, 65, 42, 43, 20, 21, 22, 23, 24, 25, 63, 64,
        30, 33, 34, 35, 36, 40 , 41, 13, 16, 19,
        \ToolsAPI::TOOL_DOZ_WUNSCHTERMINE, \ToolsAPI::TOOL_DOZ_URLAUBE, \ToolsAPI::TOOL_DOZ_SAMMELVERTRAEGE,
        -3, 44, -2, -5, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 67, 68
    );


    $menupunkte = $this->useCaseResponse->menuPunkte;
    $menuPunkte4View = array();
    $getMenuPunkteArray = function($menupunkt, $beschriftung, $key = '') use (&$menuPunkte4View, &$getMenuPunkteArray, &$responsiveTools) {
      switch ($menupunkt->getType()) {
        case 'login':
          $menuPunkte4View[] = $this->getMenuPunkt4ViewModel($menupunkt->getBeschriftung(), $menupunkt->getLink4Responsive());
          break;
        case 'password':
          $menuPunkte4View[] = $this->getMenuPunkt4ViewModel($menupunkt->getBeschriftung(), 'index.php?action=passwortFormular');
          break;
        case 'link':
          $punkt4Link = $this->getMenuPunkt4ViewModel($menupunkt->getBeschriftung(), $menupunkt->getLink(), '_blank');
          if (isset($beschriftung)) {
            $menuPunkte4View[$beschriftung][] = $punkt4Link;
          } else {
            $menuPunkte4View[] = $punkt4Link;
          }
          break;
        case 'space':
          break; 
        case 'tool':
          if ($menupunkt->getTool() == -3) { 
            $menuPunkte4View[] = $this->getMenuPunkt4ViewModel($menupunkt->getBeschriftung(), $menupunkt->getToolsResponsiveLink(), '_blank');
          } else {
            if (in_array($menupunkt->getTool(), $responsiveTools)) {
              $punkt = $this->getMenuPunkt4ViewModel($menupunkt->getBeschriftung(), $menupunkt->getToolsResponsiveLink());
              if (isset($beschriftung)) {
                $menuPunkte4View[$beschriftung][] = $punkt;
              } else {
                $menuPunkte4View[] = $punkt;
              }
            }
          }
          break;
        case 'loginseite':
          $menuPunkte4View[] = $this->getMenuPunkt4ViewModel($menupunkt->getBeschriftung(), 'index.php');
          break;
        case 'menuGruppe':
          $beschriftung = $menupunkt->getBeschriftung() . "_$key";
          $menuPunkte4View[$beschriftung] = array();
          if (count($menupunkt->unterpunkte) > 0) {
            foreach ($menupunkt->unterpunkte as $unterpunkt) {
              $getMenuPunkteArray($unterpunkt, $beschriftung);
            }
          }
          break;
      }
    };

    foreach ($menupunkte as $key => $menupunkt) {
      $getMenuPunkteArray($menupunkt, null, $key);
    }

    return $menuPunkte4View;
  }

  private function getMenuPunkt4ViewModel($beschriftung, $link, $target = ''): array
  {
    $punkt = array();
    $punkt['beschriftung'] = $beschriftung;
    $punkt['link'] = $link;
    $punkt['target'] = $target;

    return $punkt;
  }

  
  protected function getCssFilesSrcAry(): array
  {
    $cssFileAry = parent::getCssFilesSrcAry();
    $cssFileAry[] = $this->getCssLinkFromSys('drucklisten.css');
    $cssFileAry[] = $this->getCssLinkFromSys('showpdf.css');

    return $cssFileAry;
  }

  
  protected function getSeitenTitel() : string
  {
    return '';
  }
}