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

namespace Kufer\KuferTools\Firma\KursUebersicht\KursUebersicht;

use Kufer\KuferTools\Utils\KursFilter\HandleShowKursFilter;


class KursUebersichtUseCase extends \Kufer\KuferTools\Basis\Uebersicht\UebersichtMitWssUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, new KursUebersichtResponse());
  }

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

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

  public static function getToolSectionId()
  {
    return 305;
  }

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

    $buttonFactory = new \Kufer\KuferTools\Basis\Button\ButtonFactory();
    $buttons = array();
    $anzahlEintraege = count($this->response->belegungen);
    if ($anzahlEintraege > 0 || $this->isFilterGesetzt()) {
      if ($this->isRechtAllowed('305.0.9')) {
        $buttons[] = array($buttonFactory->getZukuenftigeKurseButton($this->toolSettings->buttonBezeichnungZukuenftigeKurse, null, $otherKriterien === 'infuture'));
      }

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

    if ($this->isRechtAllowed('305.0.1') && $this->datensaetzeVorhanden()) {
      $buttons[] = array($buttonFactory->getTermineAllButton());
    }
    if ($this->isRechtAllowed('305.0.2') && $this->datensaetzeVorhanden()) {
      $buttons[] = array($buttonFactory->getTerminPlanButton());
    }
    if ($this->isRechtAllowed('305.0.3') && $this->datensaetzeVorhanden()) {
      $buttons[] = array($buttonFactory->getTermineIcsButton('Termine nach Outlook', 'tn_terminenachoutlooklink'));
    }
    if ($this->isRechtAllowed('305.0.4')) {
      
      $this->addFilterButton($buttons, $buttonFactory, $anzahlEintraege, 'Filter');
    }

    return $buttons;
  }

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

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

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

  protected function verlinkePanelHeaderAllowed()
  {
    return ($this->isRechtAllowed('305.0.6')
            && \ToolsAPI::rechteOR(array('336.1.1', '336.1.2', '336.1.3', '336.1.4' . '336.1.5', '336.1.6', '336.1.7'), $this->getToolId()));
  }

  protected function getAlleIds()
  {
    $user = $this->getUser();

    $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\FirmaBelegungen($this->toolSettings, $user->getTnrIdentifier(), $sortFn);

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

  protected function getUeberschrift()
  {
    return 'Aktuell von uns gebuchte Seminare mit folgenden Mitarbeitern:';
  }

  protected function getResponse()
  {
    parent::getResponse();

    $showMitarbeiterKurse = $this->isRechtAllowed('305.0.8');
    $tnStatus = $this->getTnStatus();
    $user = $this->getUser();
    $belegungshelper = new \Kufer\KuferTools\Utils\DatamodulHelper\BelegungsHelper\FirmaBelegungen($this->toolSettings, $user->getTnrIdentifier());
    $dbwBelegung = $belegungshelper->getFilter($this->getToolId());
    foreach ($this->response->belegungen as $beleg) {
      $beleg->kurs_fromobject = $dbwBelegung->fromobject->kurs;
      $beleg->kurs_toobject = $dbwBelegung->toobject->kurs;
      $beleg->showMitarbeiterKurse = $showMitarbeiterKurse;
      $beleg->tnStatus = $tnStatus;
    }
    $this->response->datamodule = $this->response->belegungen;

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

    return $this->response;
  }

  protected function getTnStatus()
  {
    $tnStatus = $this->toolSettings->tnstatus;
    if ($this->toolSettings->tnstatus == '') {
      $tnStatus = '-ATP';
    }
    $tnStatus = str_replace('-', ' ', $tnStatus);
    $tnStatus = \StringOperations::convertArray2InList(\StringOperations::str_split($tnStatus));
    if (\StringOperations::strpos($tnStatus, 'A') !== false) {
      $tnStatus .= ", ' ', ''";
    }

    return $tnStatus;
  }

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

  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(
        'tool' . $this->getToolId(),
        $this->request->suchParameter,
        $knrVonBisAry['von'],
        $knrVonBisAry['bis']
      );
    }
    if ($this->kursFilterKursbeginnVorbelegen()) {
      $datumVonBisAry = \ToolsAPI::getVorbelegungDatumVonBis($this->getToolId());
      $this->request->suchParameter = \KurssuchAPI::setDatumBereichToSearchRequest(
        'tool' . $this->getToolId(),
        $this->request->suchParameter,
        $datumVonBisAry['von'],
        $datumVonBisAry['bis']
      );
    }
  }
}

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

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