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

namespace Kufer\KuferTools\Teilnehmer\KursUebersicht\Detailsreiter\Storno;

use Kufer\Web\KuferTools\Utils\Storno\StornoUtils;

class StornoUseCase extends \Kufer\KuferTools\Basis\UseCase\EinzelKursUseCase
{
  private $belegungshelper;

  public function __construct($request)
  {
    parent::__construct($request, new StornoResponse());
    $user = $this->getUser();
    $this->belegungshelper = new \Kufer\KuferTools\Utils\DatamodulHelper\BelegungsHelper\TeilnehmerBelegungen($this->toolSettings, $user->tnr);
  }

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

  public static function getToolSectionId()
  {
    return 358;
  }

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

    return true;
  }

  protected function getAllowedIds()
  {
    return $this->belegungshelper->getIdsOhneFilter();
  }

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

  public function action()
  {
    $belegung = $this->belegungshelper->getDatamodulById($this->request->belegId);
    $kurs = $this->getKurs($belegung->knr);

    return $this->getResponse($belegung, $kurs);
  }

  private function isStornoMoeglich(\Kurs $kurs)
  {
    return (!$this->request->stornoGescheitert)
      && StornoUtils::isTeilnehmerStornoForKursAllowed($this->toolSettings, \SessionOperations::getCurrentWebToolsTeilnehmer(), $kurs, $this->belegungshelper->getDatamodulById($this->request->belegId)) === \Kufer\Web\KuferTools\Utils\Storno\StornoUtils::STORNO_ALLOWED_NO_ERROR;
  }

  
  protected function getResponse($belegung, $kurs)
  {
    $this->handleResponseStrategies();
    $this->response->kurs = $kurs;
    $this->response->belegId = $this->request->belegId;
    $this->response->showStornoGrund = !$this->toolSettings->stornoHideEingabeFeldStornoGrund;
    $this->response->stornogrund = $this->request->stornogrund;
    $this->response->vhsname = $this->request->vhsname;
    $this->response->stornoMoeglich = $this->isStornoMoeglich($kurs);
    $this->response->stornoGescheitert = $this->request->stornoGescheitert;
    $this->response->stornoHinterlegungen = $this->getStornoHinterlegungen();

    $this->response->stornoWirdScheitern = StornoUtils::isTeilnehmerStornoForKursAllowed(
      $this->toolSettings,
      \SessionOperations::getCurrentWebToolsTeilnehmer(),
      $kurs,
      $belegung
    );
    $this->response->stornoWirdScheiternGrund = $this->response->stornoWirdScheitern === StornoUtils::STORNO_ALLOWED_NO_ERROR ? '' : StornoUtils::stornoNotAllowedToText($this->toolSettings, $belegung, $this->response->stornoWirdScheitern);

    return $this->response;
  }

  private function getStornoHinterlegungen()
  {
    $dbwHlBemerkung = new \DBWorkHLBemerkung(1, true);

    return $dbwHlBemerkung->getAll();
  }

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

class StornoRequest
{
  public $knr;
  public $belegId;
  public $vhsname;
  public $stornogrund;
  public $stornoGescheitert = false;
}

class StornoResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $kurs;
  public $belegId;
  public $showStornoGrund;
  public $stornoWirdScheitern;
  public $stornoWirdScheiternGrund;
  public $stornoHinterlegungen;
  public $stornoMoeglich;
  public $user;
  public $menuBar;
}