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

namespace Kufer\KuferTools\Teilnehmer\KursUebersicht\KursUebersicht;

use Kufer\KuferTools\Utils\KursFilter\HandleShowKursFilter;


class KursUebersichtUseCase extends \Kufer\KuferTools\Basis\Uebersicht\UebersichtMitWssUseCase
{
  public $dbwBelegung;

  public function __construct($request)
  {
    parent::__construct($request, new KursUebersichtResponse());
    $this->dbwBelegung = new \DBWorkBelegung(1, true);
  }

  public static function getToolSectionId()
  {
    return 293;
  }

  public static function getToolId()
  {
    return \ToolsAPI::TOOL_TN;
  }

  protected function getButtons()
  {
    $filterVon = HandleShowKursFilter::getKursFilterVonBis($this->toolSettings, 'tool' . $this->getToolId())['von'];
    $blakKriterien = $filterVon->blak_kriterien ?? '';
    $otherKriterien = $filterVon->other_kriterien ?? '';
    $buttonFactory = new \Kufer\KuferTools\Basis\Button\ButtonFactory();
    $buttons = array();

    $anzahlEintraege = count($this->response->belegungen);

    
    if ($anzahlEintraege > 0 || $this->isFilterGesetzt()) {
      if (\DBWorkBASysSettings::isBlak()) {
        if ($this->isRechtAllowed('293.0.8')) {
          $buttons[] = array($buttonFactory->getELearningButton(null, null, $blakKriterien === 'elearning_kurse'));
        }
        if ($this->isRechtAllowed('293.0.9')) {
          $buttons[] = array($buttonFactory->getLernzielButton(null, null, $blakKriterien === 'lernzielkontrollen'));
        }
        if ($this->isRechtAllowed('293.0.10')) {
          $buttons[] = array($buttonFactory->getWebinarButton(null, null, $blakKriterien === 'webinare'));
        }
        if ($this->isRechtAllowed('293.0.11')) {
          $buttons[] = array($buttonFactory->getPraesenzButton(null, null, $blakKriterien === 'praesenz'));
        }
      }

      if ($this->isRechtAllowed('293.0.12')) {
        $buttons[] = array($buttonFactory->getZukuenftigeKurseButton($this->toolSettings->buttonBezeichnungZukuenftigeKurse, null, $otherKriterien === 'infuture'));
      }

      if ($this->isRechtAllowed('293.0.13')) {
        $buttons[] = array($buttonFactory->getBeendeteKurseButton($this->toolSettings->buttonBezeichnungBeendeteKurse, null, $otherKriterien === 'inpast'));
      }
    }

    if ($this->isRechtAllowed('293.0.1') && $this->datensaetzeVorhanden()) {
      $buttons[] = array($buttonFactory->getTermineAllButton());
    }
    if ($this->isRechtAllowed('293.0.2') && $this->datensaetzeVorhanden()) {
      $buttons[] = array($buttonFactory->getTerminPlanButton());
    }
    if ($this->isRechtAllowed('293.0.3') && $this->datensaetzeVorhanden()) {
      $buttons[] = array($buttonFactory->getTermineIcsButton('Termine nach Outlook', 'tn_terminenachoutlooklink'));
    }
    if ($this->isRechtAllowed('293.0.4')) {
      
      $this->addFilterButton($buttons, $buttonFactory, $anzahlEintraege, 'Filter');
    }

    if (\DBWorkBASysSettings::isKoelnAksAkademieSteuern()) {
      $linkWPOnline = $this->toolSettings->aksWPOnlineUrl;
      if (!\StringOperations::endsWith($linkWPOnline, DIRECTORY_SEPARATOR)) {
        $linkWPOnline .= DIRECTORY_SEPARATOR;
      }

      $belegungen = $this->dbwBelegung->getBelegungenbyTeilnehmerNR($this->getUser()->tnr, array('A', 'V'));
      $isTnInBonusCardKurs = \Kufer\KuferTools\Teilnehmer\KursUebersicht\Utils\KoelnAksUtils::isTnInBonusCardKurs($belegungen);

      if (\Kufer\KuferTools\Teilnehmer\KursUebersicht\Utils\KoelnAksUtils::isTnInLaufendenBWLKurs($belegungen, $isTnInBonusCardKurs)) {
        $link = $linkWPOnline . 'BWL';
        $buttons[] = array($buttonFactory->getWPOnlineBWLButton($link));
      }

      if (\Kufer\KuferTools\Teilnehmer\KursUebersicht\Utils\KoelnAksUtils::isTnInLaufendenPWKurs($belegungen, $isTnInBonusCardKurs)) {
        $link = $linkWPOnline . 'PW';
        $buttons[] = array($buttonFactory->getWPOnlinePWButton($link));

        $link = $linkWPOnline . 'PW_Standard';
        $buttons[] = array($buttonFactory->getWPOnlinePWStandardsButton($link));
      }

      if (\Kufer\KuferTools\Teilnehmer\KursUebersicht\Utils\KoelnAksUtils::isTnInLaufendenWIREKurs($belegungen, $isTnInBonusCardKurs)) {
        $link = $linkWPOnline . 'WIRE';
        $buttons[] = array($buttonFactory->getWPOnlineWIREButton($link));

        $link = $linkWPOnline . 'Privatrecht';
        $buttons[] = array($buttonFactory->getWPOnlinePrivatrechtButton($link));
      }

      if (\Kufer\KuferTools\Teilnehmer\KursUebersicht\Utils\KoelnAksUtils::isTnInLaufendenSTRKurs($belegungen, $isTnInBonusCardKurs)) {
        $link = $linkWPOnline . 'STR';
        $buttons[] = array($buttonFactory->getWPOnlineSTRButton($link));
      }
    }

    

    
    return $buttons;
  }

  protected function isFilterGesetzt()
  {
    $suchApi = new \KurssuchAPI();

    return $suchApi->isFilterGesetzt($this->getToolId());
  }

  protected function checkboxNeeded()
  {
    return ($this->isRechtAllowed('293.0.2') || $this->isRechtAllowed('293.0.3')); 
  }

  protected function verlinkePanelHeaderAllowed()
  {
    return (\SecurityOperations::privilegAllowedCurrentUser($this->getToolId(), '293.0.6') == 2
            && \ToolsAPI::rechteOR(array('335.1.1', '335.1.2', '335.1.3', '335.1.4', '335.1.5', '335.1.6', '335.1.7', '335.1.8'), $this->getToolId()));
  }

  protected function getUeberschrift()
  {
    if (\DBWorkBASysSettings::isUnnaForum() || \DBWorkBASysSettings::isKoelnAksAkademieSteuern()) {
      return 'Meine aktuell gebuchten ' . $this->response->sprachSettings->Kurs['Plural']['Nominativ'];
    }

    return 'meine aktuell gebuchten ' . $this->response->sprachSettings->Kurs['Plural']['Nominativ'];
  }

  protected function getFreitext()
  {
    if (\DBWorkBASysSettings::isBlak()) {
      return 'Hinweis: kostenfrei stornierte Kurse werden nicht angezeigt';
    }

    return '';
  }

  
  protected function getDatamoduleProSeite()
  {
    return $this->toolSettings->kurseproseite;
  }

  
  protected function getAlleIds()
  {
    $searchAPI = new \KurssuchAPIwSearch(false);
    $zentralSettings = \ToolSettingsAPI::getToolSettings(0);

    if (isset($this->request->suchParameter)) {
      if (!$zentralSettings->keepFilterSettings) { 
        if ($this->request->einstieg) {
          $this->belegeKursFilterVor();
        }
        $searchAPI->setSearchParamsToSession($this->request->suchParameter);
      } elseif (\SessionOperations::isErsterAufrufInKuferTools(static::getToolId())) { 
        $this->belegeKursFilterVor();
        $searchAPI->setSearchParamsToSession($this->request->suchParameter);
      } elseif (!$this->request->einstieg) { 
        $searchAPI->setSearchParamsToSession($this->request->suchParameter);
      }
    }

    $filterVon = HandleShowKursFilter::getKursFilterVonBis($this->toolSettings, 'tool' . $this->getToolId())['von'];
    $otherKriterien = $filterVon->other_kriterien ?? '';

    $sortFn = null;
    if (\DBWorkBASysSettings::isBlak() && $otherKriterien === 'infuture') {
      $sortFn = static function(\DBWorkBelegung $dbwBelegung): \DBWorkBelegung {
        
        
        $dbwBelegung->orderby = 'k.beginn_dat, k.beginn';

        return $dbwBelegung;
      };
    }

    $belegungshelper = new \Kufer\KuferTools\Utils\DatamodulHelper\BelegungsHelper\TeilnehmerBelegungen($this->toolSettings, $this->getUser()->tnr, $sortFn);

    return $belegungshelper->getIdsMitFilter($this->getToolId());
  }

  private function getKnrVonBisFuerFilter()
  {
    return array('von' => $this->toolSettings->knrVon, 'bis' => $this->toolSettings->knrBis);
  }

  private function kursFilterVorbelegen()
  {
    return (isset($this->toolSettings->kursFilterVorbelegen) && ($this->toolSettings->kursFilterVorbelegen || $this->toolSettings->kursFilterVorbelegen === 'W'));
  }

  private function kursFilterKursbeginnVorbelegen()
  {
    return $this->toolSettings->kursFilterKursbeginnVorbelegen || $this->toolSettings->kursFilterKursbeginnVorbelegen === 'T';
  }

  private function belegeKursFilterVor()
  {
    if ($this->kursFilterVorbelegen()) {
      $knrVonBisAry = $this->getKnrVonBisFuerFilter();
      $this->request->suchParameter = \KurssuchAPI::setKnrBereichToSearchRequest(
        'tool20',
        $this->request->suchParameter,
        $knrVonBisAry['von'],
        $knrVonBisAry['bis']
      );
    }
    if ($this->kursFilterKursbeginnVorbelegen()) {
      $datumVonBisAry = \ToolsAPI::getVorbelegungDatumVonBis(20, false);
      $this->request->suchParameter = \KurssuchAPI::setDatumBereichToSearchRequest(
        'tool20',
        $this->request->suchParameter,
        $datumVonBisAry['von'],
        $datumVonBisAry['bis']
      );
    }
  }

  protected function getPanelButtonCallBacks()
  {
    $buttons = array();
    if ($this->isRechtAllowed('293.0.7') && \DBWorkBASysSettings::isBlak()) {
      $buttonFactory = new \Kufer\KuferTools\Basis\Button\ButtonFactory();
      $buttons[] = function($belegung) use ($buttonFactory) {
        if (\BelegungOperations::isPunkteBestaetigenAllowed($belegung)) {
          return $buttonFactory->getPunkteBestaetigenButton($belegung->id, 'Punkte bestätigen', '', 'punkte_bestaetigen', 'default');
        }
      };
    }

    return $buttons;
  }

  
  protected function getResponse()
  {
    parent::getResponse();
    
    $this->response->datamodule = $this->response->belegungen;
    $this->response->xsrfBestaetigePunkte = \Xsrf::getXsrfGetParameter('bestaetigePunkte');

    $this->response->uebersichtAlsTabelle = isset($this->toolSettings->kursUebersichtAlsTabelle) && $this->toolSettings->kursUebersichtAlsTabelle;

    return $this->response;
  }

  protected function getDatamodulOnCurrentPage()
  {
    return new \Kufer\KuferTools\Utils\ResponseStrategies\ResponseBelegungenOnCurrentPage($this);
  }
}

class KursUebersichtRequest extends \Kufer\KuferTools\Basis\Uebersicht\UebersichtMitWssRequest
{
}

class KursUebersichtResponse extends \Kufer\KuferTools\Basis\Uebersicht\UebersichtMitWssResponse
{
  public $belegungen = array();
  public $uebersichtAlsTabelle;
}