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

namespace Kufer\KuferTools\Dozent\Kursplanung\KursBearbeiten;

use Kufer\KuferTools\Basis\BenachrichtigungNachBearbeiten\BenachrichtigungUtils;
use Kufer\Web\KuferTools\Utils\Dozent\KursBearbeitenPlanungUtils;


class KursBearbeitenAbsendenUseCase extends \Kufer\KuferTools\Dozent\Kursplanung\EinzelKursUseCase
{
  public const SUCCESS_KURSDATEN_BEARBEITEN_ERFOLGREICH = 'kursdatenBearbeitenErfolgreich';
  public const INFO_KURSDATEN_NICHT_VERAENDERT = 'kursdatenNichtVeraendert';
  public const ERROR_KURSDATEN_BEARBEITEN_FEHLGESCHLAGEN = 'kursdatenBearbeitenFehlgeschlagen';
  public const ERROR_KURSDATEN_BEARBEITEN_KONFLIKT = 'kursdatenBearbeitenKonflikt';
  public const ERROR_DOPPELT_ABSENDEN = 'doppeltVersandt';
  public const ERROR_KURSDATEN_FEHLERHAFT = 'kursdatenFehlerhaft';

  public function __construct($request, $response = null)
  {
    parent::__construct($request, $response ?? new KursBearbeitenAbsendenResponse());
  }

  public static function getToolSectionId()
  {
    return 11;
  }

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

    $kurs = $this->getKurs($this->request->knr);
    if (!$this->isKursBearbeitbar($kurs)) {
      return false;
    }

    return true;
  }

  protected function isKursBearbeitbar(\Kurs $kurs): bool
  {
    return KursBearbeitenPlanungUtils::isKursBearbeitbar(
      $this->toolSettings->kursstatusKursIstBearbeitbar,
      $this->toolSettings->kursstatusKursIstNichtBearbeitbar,
      $this->toolSettings->kursstatusKursInPlanung,
      $kurs
    );
  }

  
  public function action()
  {
    $user = $this->getUser();
    $origKurs = $this->getKurs($this->request->knr);
    $this->response->origKurs = $origKurs;
    $changedKurs = $this->request->wssHandler->getChangedDm($origKurs, $this->request->columnValues);
    $this->response->changedKurs = $changedKurs;
    $changedFields = $this->request->wssHandler->getChangedFieldnames($origKurs, $this->request->columnValues);
    $this->response->changedFields = $changedFields;

    if ($this->request->isRefresh) {
      $statusCode = self::ERROR_DOPPELT_ABSENDEN;
    } else {
      $wrongFields = $this->request->wssHandler->checkColumnValues(
        $this->request->columnValues,
        $this->shouldCheckMandatoryFields()
      );
      if (count($wrongFields) > 0) {
        $statusCode = self::ERROR_KURSDATEN_FEHLERHAFT;
        $this->response->wrongFields = $wrongFields;
      } else {
        try {
          $korrekturAPI = new \KurskorrekturAPI();
          
          $korrekturAPI->correctKurs($changedKurs, $changedFields);

          $dbwKurse = \DBWorkKurse::getDefaultInstance();
          $dbwKurse->updateKurs($changedKurs, false, false);

          $this->sendeBenachrichtigung($origKurs, $changedKurs, $changedFields, $user);

          $statusCode = self::SUCCESS_KURSDATEN_BEARBEITEN_ERFOLGREICH;
        } catch (\Exception $e) {
          \Logger::loggException($e, 40);
          $statusCode = self::ERROR_KURSDATEN_BEARBEITEN_FEHLGESCHLAGEN;
        }
      }
    }

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

  
  protected function shouldCheckMandatoryFields(): bool
  {
    return true;
  }

  
  protected function sendeBenachrichtigung($pOrigKurs, $pChangedKurs, $pChangedFields, $pUser)
  {
    $changedFieldsLabels = $this->request->wssHandler->getFieldsInReadableFormat($pChangedFields);
    $footerText = 'Kurs Bearbeiten';

    $columns = $this->getColumns();
    BenachrichtigungUtils::sendeBenachrichtigungEmailKursdaten(
      $columns,
      $pOrigKurs,
      $pChangedKurs,
      $pChangedFields,
      $changedFieldsLabels,
      $footerText,
      $pUser,
      $this->getToolId(),
      $this->getToolSectionId()
    );
  }

  
  protected function getResponse($pStatusCode)
  {
    $this->response->kurs = $this->getKurs($this->request->knr);
    $this->response->statusCode = $pStatusCode;

    return $this->response;
  }

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

class KursBearbeitenAbsendenRequest
{
  public $knr;
  public $columnValues;
  public $isRefresh;
  public $isXsrfOk;
  public $wssHandler;
}

class KursBearbeitenAbsendenResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $kurs;
  public $statusCode;
  public $wrongFields = array();
  public $changedFields;
  public $changedKurs;
  public $origKurs;
}