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

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

use Kufer\KuferTools\Basis\BenachrichtigungNachBearbeiten\BenachrichtigungUtils;
use Kufer\KuferTools\Utils\StatusMessages\StatusMessage;
use Kufer\KuferTools\Utils\StatusMessages\StatusMessageContainer;
use Kufer\Mail\EMail\EMailHTML;
use Kufer\Mail\Sender\EMailSenderFactory;
use Kufer\Web\Classes\Api\DozUrlaubAPI;
use Kufer\Web\Classes\Datamodul\DozUrlaub;
use Kufer\Web\KuferTools\Dozent\Urlaube\Bearbeiten;

class UrlaubBearbeitenAbsendenUseCase extends Bearbeiten\UrlaubBearbeitenUseCase
{
  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();
      $origUrlaub = $this->response->urlaub;
      $changedUrlaub = $this->request->wssHandler->getChangedDm(clone $origUrlaub, $this->request->columnValues);
      $changedFields = $this->request->wssHandler->getChangedFieldnames($origUrlaub, $this->request->columnValues);

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

          $this->sendeBenachrichtigung($origUrlaub, $changedUrlaub, $changedFields, $user);
          $smc->addStatusMessageObj(StatusMessage::getSuccessMessageObj('Urlaub erfolgreich aktualisiert'));
        } catch (\Exception $e) {
          \Logger::logg('Fehler beim Aktualisieren eines Urlaubs: ' . $e->getMessage(), 400);
          $smc->addStatusMessageObj(StatusMessage::getErrorMessageObj('Fehler beim Aktualisieren der Daten'));
        } finally {
          $this->response->urlaub = $changedUrlaub;
        }
      }
    } else {
      $this->response->refresh = true;
    }

    return $response;
  }

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

      $viewModel = new EMail\UrlaubBearbeitenAbsendenEMailViewModel();
      $viewModel->dozent = $person;
      $viewModel->urlaub = $changedUrlaub;
      $viewModel->changes = $changes;

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

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

class UrlaubBearbeitenAbsendenResponse extends Bearbeiten\UrlaubBearbeitenResponse
{
  public $wrongFields;
}