<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */

namespace Kufer\KuferTools\Basis\Raumbelegung\Raumdetails\Detailsreiter\Termine;

use Kufer\Web\Classes\Dbfilter\KursorteSQLFilter;
use Kufer\Web\KuferTools\Utils\FilterSettings\IFilterSettings;

abstract class ReiterTermineUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  protected $dbwkurstage;
  private $dbwOrtVerf;

  public function __construct($request)
  {
    parent::__construct($request, new ReiterTermineResponse());
    $this->dbwkurstage = new \DBWorkKurseTageWT();
    $this->dbwOrtVerf = new \DBWorkOrtVerf();
  }

  abstract protected function getReiterRecht();

  
  abstract protected function getSectId4Recht();

  
  
  abstract protected function setResponseInfos4Links();

  public function hasAccess($pToolSectionId = null)
  {
    
    $differentSectionId = $this->getSectId4Recht();
    if (!parent::hasAccess($differentSectionId)) {
      return false;
    }
    if (!$this->isRechtAllowed($this->getReiterRecht())) {
      
      return false;
    }

    if (!is_numeric($this->request->raumNr) || !$this->hasAccesesToId($this->request->raumNr)) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $kurstage = $this->getKurstage();
    if ($this->toolSettings->sperrzeitanzeigen) {
      $kurstage = $this->sperrzeitAnzeigen($kurstage);
    }

    return $this->getResponse($kurstage);
  }

  protected function getKurstage()
  {
    if ($this->request->vonDatum != '' && $this->request->bisDatum != '') {
      \SessionOperations::setVarValueWTIntern('TerminDatumVon_' . $this->getToolId(), $this->request->vonDatum);
      \SessionOperations::setVarValueWTIntern('TerminDatumBis_' . $this->getToolId(), $this->request->bisDatum);
    }
    $kthelper = new \Kufer\KuferTools\Utils\DatamodulHelper\KursTageHelper\RaumTermineKurstage($this->toolSettings, $this->getUser(), $this->request->raumNr);

    return $kthelper->getDatamoduleMitFilter($this->getToolId());
  }

  abstract protected function createFilterSettings(): IFilterSettings;

  protected function hasAccesesToId(int $id): bool
  {
    $filter = KursorteSQLFilter::create();

    $filterSettings = $this->createFilterSettings();
    $filter = $filterSettings->applySettings($filter);

    $dbw = \DBWorkKursorte::getDefaultInstance();
    $filter->equalsId($id);

    return $dbw->existsByFilter($filter);
  }

  protected function sperrzeitAnzeigen($kurstage)
  {
    $vonDatumDefault = \DateTimeOperations::getFirstDayOfCurrentWeek();
    $bisDatumDefault = \DateTimeOperations::getNextDate($vonDatumDefault, 6);

    $vonDatum = \SessionOperations::getVarValueWTIntern('TerminDatumVon_' . $this->getToolId(), $vonDatumDefault);
    $bisDatum = \SessionOperations::getVarValueWTIntern('TerminDatumBis_' . $this->getToolId(), $bisDatumDefault);

    $this->dbwOrtVerf->newSearch();
    $this->dbwOrtVerf->fromobject->vondat = $vonDatum;
    $this->dbwOrtVerf->toobject->bisdat = $bisDatum;

    
    $raumTage = $kurstage;
    
    $vondat = $this->dbwOrtVerf->fromobject->vondat;
    $bisdat = $this->dbwOrtVerf->toobject->bisdat;

    
    
    $dtop = new \DateTimeOperations();
    
    $ortVerfAry = $this->dbwOrtVerf->getKursorteVerfbyRaumDat($this->request->raumNr);

    
    foreach ($ortVerfAry as $ortVerf) {
      
      
      for ($aktDatum = $ortVerf->vondat;$dtop->isDateBefore($aktDatum, $ortVerf->bisdat)
          || strcmp($aktDatum, $ortVerf->bisdat) == 0;$aktDatum = $dtop->getNextDate($aktDatum, 1)) {
        if ((($dtop->isDateBefore($vondat, $aktDatum) && $dtop->isDateBefore($aktDatum, $bisdat))
           || strcmp($aktDatum, $vondat) == 0 || strcmp($aktDatum, $bisdat) == 0)
           && ($ortVerf->wochentag == 0 || $ortVerf->wochentag == $dtop->getWeekDayFromDate($aktDatum))) {
          $raumcnt = count($raumTage);
          
          $raumTage[$raumcnt] = $this->createKurstag4RaumSperre($ortVerf, $aktDatum);
        }
      }
    }
    
    usort($raumTage, array($this, 'kTageCmp'));

    return $raumTage;
  }

  
  protected function kTageCmp($ktagvor, $ktagnach)
  {
    if (strcmp($ktagvor->datum, $ktagnach->datum) != 0) {
      return (\DateTimeOperations::isDateBefore($ktagvor->datum, $ktagnach->datum)) ? -1 : 1;
    } elseif (strcmp($ktagvor->zeit_beg, $ktagnach->zeit_beg) != 0) {
      return (strcmp($ktagvor->zeit_beg, $ktagnach->zeit_beg) <= 0) ? -1 : 1;
    } else {
      return (strcmp($ktagvor->zeit_ende, $ktagnach->zeit_ende) <= 0) ? -1 : 1;
    }
  }

  protected function createKurstag4RaumSperre($pOrtVerf, $pAktDatum)
  {
    
    $kurstag4Raum = $this->dbwkurstage->getNewObject();
    
    $dbwKursOrte = new \DBWorkKursorte();
    $kursOrt = $dbwKursOrte->getKursort($pOrtVerf->ortnr);
    
    
    
    $kurstag4Raum->ort = $kursOrt->mktext;
    
    $kurstag4Raum->kursort = $kursOrt;

    
    $kurstag4Raum->bemerkungen = $pOrtVerf->kommentar;
    $kurstag4Raum->datum = $pAktDatum;
    $kurstag4Raum->datum_kurz = \StringOperations::substr($pAktDatum, 0, 6);
    $kurstag4Raum->datum_jahrkurz = \DateTimeOperations::getShortForm4DateStr($pAktDatum);
    $kurstag4Raum->wotagkurz = \DateTimeOperations::getWeekDayShort($pAktDatum);
    $kurstag4Raum->wotaglang = \DateTimeOperations::getWeekDay($pAktDatum);
    $kurstag4Raum->datum_komplettlang = $kurstag4Raum->wotaglang . ', ' . $kurstag4Raum->datum;
    $kurstag4Raum->datum_komplettkurz = $kurstag4Raum->wotagkurz . ', ' . $kurstag4Raum->datum;
    $kurstag4Raum->datum_komplettkurz_jahrkurz = $kurstag4Raum->wotagkurz . ', ' . $kurstag4Raum->datum_jahrkurz;

    $kurstag4Raum->zeit_beg = $pOrtVerf->vonuhr;
    $kurstag4Raum->zeit_ende = $pOrtVerf->bisuhr;
    
    $kurstag4Raum->knr = 'Sperrzeit';
    $kurstag4Raum->kurs->nrab = 'Sperrzeit';
    $kurstag4Raum->kurs->kurzbez = $pOrtVerf->begruendung;
    $kurstag4Raum->kurs->ende_dat = $pOrtVerf->bisdat;
    $kurstag4Raum->dozent->namevorname = $pOrtVerf->verantwort;
    
    $kurstag4Raum->dozent->gebdat = '';
    $kurstag4Raum->kurs->hauptdozent = new \Dozent();
    $kurstag4Raum->kurs->hauptdozent->namevorname = $pOrtVerf->verantwort;
    $kurstag4Raum->kurs->hauptdozent->tel_anzeige = '';

    return $kurstag4Raum;
  }

  protected function getResponse($kurstage)
  {
    $this->handleResponseStrategies();
    $this->response->raumNr = $this->request->raumNr;
    $this->response->data = $kurstage;
    $this->response->reiterButtons = $this->getButtons();

    $this->response->kursort = $this->dbwkurstage->dbwkursorte->getKursort($this->request->raumNr);
    $this->setResponseInfos4Links();

    return $this->response;
  }

  protected function getResponseStrategies()
  {
    return array(
        new \Kufer\KuferTools\Utils\ResponseStrategies\ResponseWss($this)
    );
  }

  
  protected function getButtons()
  {
    $buttons = array();
    $buttonFactory = new \Kufer\KuferTools\Basis\Button\ButtonFactory();
    $buttons[] = array($buttonFactory->getFilterButton('Filter', 'filter_raum_termine', 'Filter öffnen'));

    return $buttons;
  }
}

class ReiterTermineRequest
{
  public $raumNr;
  public $vonDatum;
  public $bisDatum;
}

class ReiterTermineResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $data;
  public $reiterButtons;
  public $columns;
  public $kursort;
  public $raumNr;
  public $refererLink;
  public $refererLabel;
  public $isAllowedToolDozInfo;
  public $kursIdsAry4User;
  public $isAllowedToolAdresse;
}