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

namespace Kufer\Web\KuferTools\Basis\Raumplanung;

abstract class KurstageAnlegenUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  private $kursHelper;

  public function __construct($request)
  {
    parent::__construct($request, new KurstageAnlegenResponse());
    $this->kursHelper = \Kufer\Web\KuferTools\Utils\DatamodulHelper\Kurse\KursHelperFactory::getKursHelperByToolID($this->getToolId(), $this->toolSettings);
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess()) {
      return false;
    }
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }
    if (!$this->isRaumplanungAllowed()) {
      return false;
    }
    if (!in_array($this->request->knr, $this->kursHelper->getIdsOhneFilter())) {
      return false;
    }

    return true;
  }

  abstract protected function isRaumplanungAllowed(): bool;

  public function action()
  {
    if (!$this->request->isRefresh) {
      $this->insertKurstage();
    }

    return $this->getResponse();
  }

  protected function getResponse()
  {
    $this->handleResponseStrategies();

    return $this->response;
  }

  private function insertKurstage()
  {
    $kurstage = \SessionOperations::getVarValueWTIntern('raumplanungKurstage', array());
    $kurstage = (new \Kufer\Web\Classes\Stream\IterableStream($kurstage))
      ->filter(function($kurstag) {
        return $kurstag instanceof \Kurstag && \in_array($kurstag->datum, $this->request->ktDatumAry);
      })
      ->map(static function(\Kurstag $kurstag) {
        if (isset($kurstag->datum)) {
          
          $kurstag->setValue2Var('datum', $kurstag->datum);
        }

        return $kurstag;
      })->toArray();

    $success = null;
    if (!empty($kurstage)) {
      $success = true;
      $this->handleInsertDirekt($kurstage);
      if (\SessionOperations::isDmzBetrieb()) {
        $success = $this->handleInsertDmz($kurstage);
      }
    }
    $this->setStatusMeldungen($success);
  }

  protected function getDmzFields()
  {
    $result = array('knr', 'datum', 'wotag', 'zeit_beg', 'zeit_ende', 'minuten', 'pause', 'ue', 'ort', 'dnr', 'bemerkungen', 'bestuhlung');

    $kennung = $this->getUserKennung();
    if (!empty($kennung)) {
      $result[] = 'erfasstvon';
      $result[] = 'erfasstam';
      $result[] = 'bearbeiter';
    }

    return $result;
  }

  
  protected function preKurstagInsertHook($kurstag)
  {
    $kennung = $this->getUserKennung();
    if (!empty($kennung)) {
      $kurstag->erfasstvon = $kennung;
      $kurstag->erfasstam = \DateTimeOperations::getDateNow();
      $kurstag->bearbeiter = $kennung;
    }

    return $kurstag;
  }

  private function handleInsertDmz($pKurstage)
  {
    $fields = $this->getDmzFields();
    $kurstagTuples = \array_map(function($kurstag) use ($fields) {
      return new \Tuple($kurstag, $fields, array());
    }, $pKurstage);

    try {
      $kursKorrekturAPI = new \KurskorrekturAPI();
      $kursKorrekturAPI->correctKurstage($kurstagTuples, 'insert');
    } catch (\Exception $e) {
      $this->handleDeleteDirekt($pKurstage);
      \Logger::logg('Fehler beim Anlegen von Kurstagen über die Raumplanung: ' . $e->getMessage(), 300);

      return false;
    }

    return true;
  }

  private function handleInsertDirekt($pKurstage)
  {
    $dbwKursetage = new \DBWorkKurseTage(1, true);

    foreach ($pKurstage as $kurstag) {
      $kurstag = $this->preKurstagInsertHook($kurstag);
      $kurstag->id = $dbwKursetage->insertKurstag($kurstag);
    }
  }

  private function handleDeleteDirekt($pKurstage)
  {
    $dbwKursetage = new \DBWorkKurseTage(1, true);

    foreach ($pKurstage as $kurstag) {
      $dbwKursetage->deleteKurstag($kurstag->id);
    }
  }

  protected function getUserKennung(): ?string
  {
    return null;
  }

  protected function setStatusMeldungen($success)
  {
    if (is_null($success)) {
      $statusMessage = \Kufer\Web\KuferTools\Utils\StatusMessages\PlainStatusMessage::getInfoMessageObj(
        'Es wurden keine Kurstage angelegt.'
      );
    } elseif ($success) {
      $statusMessage = \Kufer\Web\KuferTools\Utils\StatusMessages\PlainStatusMessage::getSuccessMessageObj(
        'Die Kurstage wurden erfolgreich angelegt.'
      );
    } else {
      $statusMessage = \Kufer\Web\KuferTools\Utils\StatusMessages\PlainStatusMessage::getErrorMessageObj(
        'Beim Anlegen der Kurstage gab es einen Fehler. Bitte versuchen Sie es erneut oder wenden Sie sich an die Einrichtung.'
      );
    }
    $this->response->statusMeldungen->addStatusMessageObj($statusMessage);
  }
}

class KurstageAnlegenRequest
{
  public $knr = '';
  public $ktDatumAry;
}

class KurstageAnlegenResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  
  public $knr;
  public $statusCode;
}