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

namespace Kufer\Web\KuferTools\Dozent\Wunschtermine\BearbeitenAbsenden;

use Kufer\Web\KuferTools\Basis\BenachrichtigungNachBearbeiten\BenachrichtigungUtils;
use Kufer\Web\KuferTools\Utils\StatusMessages\PlainStatusMessage;
use Kufer\Web\KuferTools\Utils\StatusMessages\StatusMessageContainer;
use Kufer\Mail\EMail\EMailHTML;
use Kufer\Mail\Sender\EMailSenderFactory;
use Kufer\Web\Classes\Api\WunschterminAPI;
use Kufer\Web\Classes\Datamodul\Wunschtermin;
use Kufer\Web\KuferTools\Dozent\Wunschtermine\Bearbeiten;

class WunschterminBearbeitenAbsendenUseCase extends Bearbeiten\WunschterminBearbeitenUseCase
{
  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()
  {
    $response = parent::action();
    if (!$this->request->isRefresh) {
      $user = $this->getUser();
      $origWunschtermin = $this->response->wunschtermin;
      $changedWunschtermin = $this->request->wssHandler->getChangedDm(
        $this->toolSettings,
        clone $origWunschtermin,
        $this->request->columnValues
      );
      $changedFields = $this->request->wssHandler->getChangedFieldnames(
        $this->toolSettings,
        $origWunschtermin,
        $this->request->columnValues
      );

      $smc = StatusMessageContainer::getSharedInstance();
      $wrongFields = $this->request->wssHandler->checkColumnValues($this->toolSettings, $this->request->columnValues);
      if (!empty($wrongFields)) {
        $this->response->wrongFields = $wrongFields;
        $this->response->changedWunschtermin = $changedWunschtermin;
        $this->response->wunschtermin = $changedWunschtermin;
        $smc->addStatusMessageObj(PlainStatusMessage::getErrorMessageObj('Nicht alle Felder wurden richtig ausgefüllt!'));
      } elseif (empty($changedFields)) {
        $smc->addStatusMessageObj(PlainStatusMessage::getWarningMessageObj('Keine Änderung vorgenommen'));
      } else {
        try {
          
          
          

          
          

          WunschterminAPI::update($origWunschtermin, $changedFields, $changedWunschtermin);

          $this->sendeBenachrichtigung($origWunschtermin, $changedWunschtermin, $changedFields, $user);
          $this->response->wunschtermin = $changedWunschtermin;
          $smc->addStatusMessageObj(PlainStatusMessage::getSuccessMessageObj('Wunschtermin erfolgreich aktualisiert'));
        } catch (\Exception $e) {
          \Logger::logg('Fehler beim Aktualisieren eines Wunschtermins: ' . $e->getMessage(), 400);
          $smc->addStatusMessageObj(PlainStatusMessage::getErrorMessageObj('Fehler beim Aktualisieren der Daten'));
        }
      }
    } else {
      $this->response->refresh = true;
    }

    return $response;
  }

  private function sendeBenachrichtigung(Wunschtermin $origWunschtermin, Wunschtermin $changedWunschtermin, array $changedFields, \Benutzer $user): void
  {
    if ($this->toolSettings->emailAnEinrichtungBearbeitung) {
      $changes = BenachrichtigungUtils::getChangesUpdate(
        $this->toToolSection(),
        $this->toolSettings,
        $this->getColumns($this->toolSettings),
        $origWunschtermin,
        $changedWunschtermin,
        $changedFields
      );
      $person = \SessionOperations::getCurrentWebToolsPerson();

      $viewModel = new EMail\WunschterminBearbeitenAbsendenEMailViewModel();
      $viewModel->dozent = $person;
      $viewModel->wunschtermin = $changedWunschtermin;
      $viewModel->changes = $changes;

      $email = new EMail\WunschterminBearbeitenAbsendenEMailPresenter($viewModel);
      $email = new EMailHTML($email->getSubject(), $email->getContent());
      $email->addKuferToolsFooter('Wunschtermine für Dozenten', $user);

      $sender = EMailSenderFactory::createForToolsWithCustomAddress($this->toolSettings->emailAnEinrichtungBearbeitungAdresse);
      $smc = StatusMessageContainer::getSharedInstance();
      if (!$sender->sendFromPersonToEinrichtung($email, $person)->hasSentAnyMails()) {
        $smc->addStatusMessageObj(
          PlainStatusMessage::getErrorMessageObj('Benachrichtung über Änderung konnte nicht an die Einrichtung gesendet werden.')
        );
      } else {
        $smc->addStatusMessageObj(
          PlainStatusMessage::getSuccessMessageObj('Benachrichtung über Änderung wurde erfolgreich an die Einrichtung gesendet.')
        );
      }
    }
  }
}

class WunschterminBearbeitenAbsendenResponse extends Bearbeiten\WunschterminBearbeitenResponse
{
  public $wrongFields;
}