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

namespace Kufer\KuferTools\Dozent\KursUebersicht\Detailsreiter\Teilnehmer\HandleBelegungBearbeiten;

use Kufer\KuferTools\Basis\BenachrichtigungNachBearbeiten\BenachrichtigungUtils;

class HandleBelegungBearbeitenUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  public const BELEGUNG_BEARBEITEN_KEINE_AENDERUNG = 'belegungBearbeitenKeineAenderung';
  public const BELEGUNG_BEARBEITEN_FEHLER = 'belegungBearbeitenFehler';
  public const BELEGUNG_BEARBEITEN_TECHNISCHER_FEHLER = 'belegungBearbeitenTechnischerFehler';
  public const BELEGUNG_BEARBEITEN_ERFOLGREICH = 'belegungBearbeitenErfolgreich';

  public $dbwBelegung;

  public function __construct($request)
  {
    parent::__construct($request, new HandleBelegungBearbeitenResponse());
    $this->dbwBelegung = new \DBWorkBelegung(1, true);
  }

  public static function getToolSectionId()
  {
    return 679;
  }

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

  public function hasAccess($pToolsectionId = null)
  {
    if (!parent::hasAccess($pToolsectionId)) {
      return false;
    }
    
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $result = $this->handleBelegungBearbeiten($this->request->belid);

    $statusCodes = $result['statusCode'];

    $statusMessages = $this->getStatusMessages($statusCodes);

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

  
  private function handleBelegungBearbeiten($belid)
  {
    $origBelegung = $this->dbwBelegung->getBelegung($belid);
    $changedBelegung = $this->request->wssHandler->getChangedDm($origBelegung, $this->request->columnValues);
    $changedFields = $this->request->wssHandler->getChangedFieldnames($origBelegung, $this->request->columnValues);
    $wrongFields = $this->request->wssHandler->checkColumnValues($this->request->columnValues);

    if (count($wrongFields) > 0) {
      return array('statusCode' => array(self::BELEGUNG_BEARBEITEN_TECHNISCHER_FEHLER), 'belegung' => $changedBelegung);
    }

    $statusCodes = array();

    if (count($changedFields) > 0) {
      $statusCodes[] = $this->saveBelegung($origBelegung, $changedBelegung, $changedFields);
    }

    if (empty($statusCodes)) {
      $statusCodes[] = self::BELEGUNG_BEARBEITEN_KEINE_AENDERUNG;
    }

    if (in_array(self::BELEGUNG_BEARBEITEN_ERFOLGREICH, $statusCodes)) {
      $user = $this->getUser();
      $kurs = $this->getKurs($origBelegung->knr);
      $this->sendeBenachrichtigung($kurs, $origBelegung, $changedBelegung, $changedFields, $user);
    }

    return array('statusCode' => $statusCodes);
  }

  private function getKurs($knr)
  {
    $dbwKurse = new \DBWorkKurseWT(1, true);

    return $dbwKurse->getKurs($knr);
  }

  
  private function saveBelegung($origBelegung, $changedBelegung, $changedFields)
  {
    if (count($changedFields) === 0) {
      return self::BELEGUNG_BEARBEITEN_KEINE_AENDERUNG;
    }

    $success = \BelegungAPI::updateBelegung($changedBelegung, $origBelegung);
    if ($success) {
      $statusCode = self::BELEGUNG_BEARBEITEN_ERFOLGREICH;
    } else {
      $statusCode = self::BELEGUNG_BEARBEITEN_FEHLER;
    }

    return $statusCode;
  }

  
  private function getStatusMessages($pStatusCodes)
  {
    $result = $this->getStatusMessagesSuccess($pStatusCodes);
    $result .= $this->getStatusMessagesError($pStatusCodes);
    $result .= $this->getStatusMessagesInfo($pStatusCodes);

    return $result;
  }

  private function getStatusMessagesSuccess($pStatusCodes)
  {
    $result = '';
    $allgsettings = \AllgSettingsAPI::getAllgSettings();

    if (in_array(self::BELEGUNG_BEARBEITEN_ERFOLGREICH, $pStatusCodes)) {
      $result .= '<div>' . \CleanOperations::cleanStringForHtml($allgsettings->successMsgChangeBelegung) . '</div>';
    }

    if ($result !== '') {
      $result = '<div class="alert alert-success">' . $result . '</div>';
    }

    return $result;
  }

  private function getStatusMessagesError($pStatusCodes)
  {
    $result = '';
    $allgsettings = \AllgSettingsAPI::getAllgSettings();

    if (in_array(self::BELEGUNG_BEARBEITEN_FEHLER, $pStatusCodes)) {
      $result .= '<div>' . \CleanOperations::cleanStringForHtml($allgsettings->failSubmitMsgBelegung) . '</div>';
    } elseif (in_array(self::BELEGUNG_BEARBEITEN_TECHNISCHER_FEHLER, $pStatusCodes)) {
      $result .= '<div>Die Belegung konnte aus technischen Gründen nicht geändert werden.</div>';
    }

    if ($result !== '') {
      $result = '<div class="alert alert-danger">' . $result . '</div>';
    }

    return $result;
  }

  private function getStatusMessagesInfo($pStatusCodes)
  {
    $result = '';
    $allgsettings = \AllgSettingsAPI::getAllgSettings();

    if (in_array(self::BELEGUNG_BEARBEITEN_KEINE_AENDERUNG, $pStatusCodes)) {
      $result .= '<div>' . \CleanOperations::cleanStringForHtml($allgsettings->failNoChangesMsgBelegung) . '</div>';
    }

    if ($result !== '') {
      $result = '<div class="alert alert-info">' . $result . '</div>';
    }

    return $result;
  }

  
  public function getKursGebuehr($pBelegung)
  {
    $dbwKursGeb = new \DBWorkKursgebuehr();

    return \MathOperations::floatToString($dbwKursGeb->getKursgebuehrErmaessigt($pBelegung->knr, $pBelegung->tnr));
  }

  protected function getResponse($statusMessage)
  {
    $this->response->statusMessage = $statusMessage;

    return $this->response;
  }

  
  protected function sendeBenachrichtigung($pKurs, $pOrigBelegung, $pChangedBelegung, $pChangedFields, $pUser)
  {
    $changedFieldsLabels = $this->request->wssHandler->getFieldsInReadableFormat($pChangedFields);
    $footerText = 'Belegung Bearbeiten';

    $columns = $this->getColumns();
    BenachrichtigungUtils::sendeBenachrichtigungEmailBelegungsdaten(
      $columns,
      $pKurs,
      $pOrigBelegung,
      $pChangedBelegung,
      $pChangedFields,
      $changedFieldsLabels,
      $footerText,
      $pUser,
      $this->getToolId(),
      $this->getToolSectionId()
    );
  }
}

class HandleBelegungBearbeitenRequest
{
  public $belid;
  public $stornogrund;
  public $austritt;
  public $anmeldedatumNeuSetzen;
  public $columnValues;
  public $wssHandler;
}

class HandleBelegungBearbeitenResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $statusMessage;
}