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

namespace Kufer\KuferTools\Teilnehmer\ZsaTeilnehmerUebersicht\AendereBelegung;

class AendereBelegungUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  private $dbwBelegung;
  private $belegungHandler;
  
  const UPDATE_BELEGUNG_SUCCESS = 10;
  const UPDATE_BELEGUNG_ERROR = 11;
  const UPDATE_BELEGUNG_DOPPELT = 12;

  public function __construct($request)
  {
    parent::__construct($request, new AendereBelegungResponse());
    $this->dbwBelegung = new \DBWorkBelegung(1, true);
    $user = $this->getUser();
    $this->belegungHandler = new \Kufer\KuferTools\Utils\BelegungHandler\Belegungen4Bildungsverantwortlichen($user->tnr);
  }

  public static function getToolSectionId()
  {
    return 530;
  }

  public static function getToolId()
  {
    return 42;
  }

  public function action()
  {
    if (!$this->request->isRefresh) {
      $status = $this->updateBelegung();
    } else {
      $status = self::UPDATE_BELEGUNG_DOPPELT;
    }

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

  private function getBelegung()
  {
    return $this->dbwBelegung->getBelegung($this->request->bid);
  }

  private function updateBelegung()
  {
    try {
      $belegung = $this->getBelegung();
      $origBelegung = clone($belegung);
      $belegung->bemerkung = $this->request->bemerkung;
      if ($belegung->kurs->getVarvalue('priobeleg')) {
        $belegung->prioanm = $this->request->prioanm;
      }
      if ($belegung->status == 'I') {
        if ($this->request->genehmigen) {
          $belegung->status = 'K';
        } else {
          $belegung->status = 'L';
        }
      }

      $success = \BelegungAPI::updateBelegung($belegung, $origBelegung);
    } catch (\Exception $e) {
      \Logger::logg('Fehler beim Updaten der Belegung: ' . $e, 200);

      return self::UPDATE_BELEGUNG_ERROR;
    }
    if ($success) {
      return self::UPDATE_BELEGUNG_SUCCESS;
    } else {
      \Logger::logg('Fehler beim Updaten der Belegung: unbekannter Fehler', 201);

      return self::UPDATE_BELEGUNG_ERROR;
    }
  }

  public function hasAccess($pToolsectionId = null)
  {
    if (!\Kufer\KuferTools\Basis\UseCase\ToolUseCase::hasAccess($pToolsectionId)) {
      return false;
    }

    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    
    if (!$this->isRechtAllowed('530.0.1') || $this->isRechtAllowed('531.0.2')) {
      return false;
    }

    $alleIds = $this->getAllIds();
    if (!in_array($this->request->bid, $alleIds)) {
      return false;
    }

    return true;
  }

  protected function getAllIds()
  {
    
    $belegung = $this->getBelegung();
    $this->belegungHandler->setFilterTnr($belegung->tnr);
    $this->belegungHandler->setFilterStatus('I');

    return $this->belegungHandler->getAlleIds();
  }

  protected function getResponse($status)
  {
    $this->handleResponseStrategies();
    $this->response->statusCode = $status;
    $this->response->bkbvtnId = $this->request->bkbvtnId;
    $this->response->bid = $this->request->bid;

    return $this->response;
  }
}

class AendereBelegungRequest
{
  public $bid;
  public $bkbvtnId;
  public $genehmigen;
  public $bemerkung;
  public $prioanm;
}

class AendereBelegungResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $statusCode;
  public $bkbvtnId;
  public $bid;
}