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

namespace Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Termine\TerminAbrechnenNeussVhs;

class TerminAbrechnenUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\EinzelKursUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, new TerminAbrechnenResponse());
  }

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

  public static function getToolSectionId()
  {
    return 4;
  }

  public function hasAccess($pToolsectionId = null)
  {
    if (!parent::hasAccess($pToolsectionId)) {
      return false;
    }

    if (!\SessionOperations::isDmzBetrieb()) {
      return false;
    }

    $kurstage = $this->findKurstage();
    if (empty($kurstage)) {
      return false;
    }

    
    if (count(array_unique(\ArrayOperations::mapAttribut($kurstage, 'knr'))) !== 1) {
      return false;
    }

    $kurstageHelper = $this->getDatamodulHelper($this->getKurs($this->getKursId()));

    
    if (!empty(array_diff(\ArrayOperations::mapAttribut($kurstage, 'id'), $kurstageHelper->getIdsOhneFilter()))) {
      return false;
    }

    return true;
  }

  private $cacheKurstage;

  
  private function findKurstage(): array
  {
    if (!is_null($this->cacheKurstage)) {
      return $this->cacheKurstage;
    }

    $this->cacheKurstage = \DBWorkKurseTage::getDefaultInstance()->getKurseTageByIds($this->request->ktIds);

    return $this->cacheKurstage;
  }

  protected function getKursId(): string
  {
    return $this->findKurstage()[0]->knr;
  }

  protected function getRequestedId()
  {
    return $this->getKursId();
  }

  public function action()
  {
    $this->handleResponseStrategies();

    $this->response->kurs = $this->getKurs($this->getKursId());

    $kurstage = $this->findKurstage();
    $this->response->kurstage = $kurstage;

    if (!is_null($this->request->response)) {
      $this->response->hinweise = $this->request->response->hinweise;
      $this->response->anzahlTeilnehmer = $this->request->response->anzahlTeilnehmer;
    } else {
      $this->response->hinweise = '';
      $this->response->anzahlTeilnehmer = 0;
    }

    $this->response->anzahlBelegungen = $this->findBelegungenCount();

    return $this->response;
  }

  private $cacheBelegungenCount;

  private function findBelegungenCount(): int
  {
    if (!is_null($this->cacheBelegungenCount)) {
      return $this->cacheBelegungenCount;
    }

    $dbwBelegungen = \DBWorkBelegung::getDefaultInstance();
    $belegungen = $dbwBelegungen->getBelegungenbyKursNR($this->getKursId(), true);
    $this->cacheBelegungenCount = count($belegungen);

    return $this->cacheBelegungenCount;
  }

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

  protected function getDatamodulHelper($kurs): \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\KurstageZuKurs
  {
    return new \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\DozKurstageZuKurs($this->toolSettings, $this->getUser(), $this->request, $kurs);
  }
}