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

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

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\DozUrlaubAPI;
use Kufer\Web\Classes\Datamodul\DozUrlaub;
use Kufer\Web\Classes\Db\DBWorkDozUrlaube;
use Kufer\Web\Classes\Dbfilter\DozUrlaubeSQLFilter;

class UrlaubLoeschenUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  private $dbwUrlaube;

  public function __construct($request)
  {
    parent::__construct($request, new UrlaubLoeschenResponse());

    $this->dbwUrlaube = DBWorkDozUrlaube::getDefaultInstance();
  }

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

  public static function getToolSectionId()
  {
    return 797;
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess($pToolSectionId)) {
      return false;
    }

    if (!$this->isRechtAllowed('797.0.2')) {
      return false;
    }

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

    if (empty($this->request->id)) {
      return false;
    }

    $user = $this->getUser();
    $filter = DozUrlaubeSQLFilter::create();
    $filter->equalsId($this->request->id);
    if (!$user->isAdmin()) {
      $filter->equalsDozent($user->getDnrIdentifier());
    }

    if (!$this->dbwUrlaube->existsByFilter($filter)) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $urlaub = $this->dbwUrlaube->findOneByFilter(
      DozUrlaubeSQLFilter::create()->equalsId($this->request->id)
    );

    $smc = StatusMessageContainer::getSharedInstance();
    if (is_null($urlaub)) {
      $smc->addStatusMessageObj(PlainStatusMessage::getErrorMessageObj('Fehler beim Löschen des Urlaubs'));
    } else {
      try {
        DozUrlaubAPI::delete($urlaub);
        $this->sendeBenachrichtigung($urlaub, $this->getUser());
        $smc->addStatusMessageObj(PlainStatusMessage::getSuccessMessageObj('Urlaub erfolgreich gelöscht'));
      } catch (\Exception $ex) {
        \Logger::logg('Fehler beim Löschen des Urlaubs: ' . $ex->getMessage(), 400);
        $smc->addStatusMessageObj(PlainStatusMessage::getErrorMessageObj('Fehler beim Löschen des Urlaubs'));
      }
    }

    return $this->response;
  }

  private function sendeBenachrichtigung(DozUrlaub $urlaub, \Benutzer $user): void
  {
    if ($this->toolSettings->emailAnEinrichtungGeloescht) {
      $person = \SessionOperations::getCurrentWebToolsPerson();

      $viewModel = new EMail\UrlaubGeloeschtAbsendenEMailViewModel();
      $viewModel->dozent = $person;
      $viewModel->urlaub = $urlaub;

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

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

class UrlaubLoeschenRequest
{
  public $id;
}

class UrlaubLoeschenResponse
{
  public $success;
  public $error_msg;
}