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

namespace Kufer\Web\KuferTools\Basis\Kursdetails\Detailsreiter\Termine\TerminHinzufuegen;

use Kufer\Web\KuferTools\Utils\EmailVorbelegen;

abstract class TerminHinzufuegenAbsendenUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\EinzelKursUseCase
{
  public const SUCCESS_KURSTAG_BEARBEITEN_ERFOLGREICH = 'kurstagHinzufügenErfolgreich';
  public const ERROR_KURSTAG_BEARBEITEN_FEHLGESCHLAGEN = 'kurstagHinzufügenFehlgeschlagen';
  public const ERROR_DOPPELT_ABSENDEN = 'DoppeltVersandt';

  
  protected $changedKurstag;

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

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

    return true;
  }

  public function action()
  {
    if ($this->request->isRefresh) {
      $statusCode = self::ERROR_DOPPELT_ABSENDEN;
      $this->changedKurstag = $this->getKurstag();
    } else {
      $statusCode = $this->saveKurstag();
    }

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

  private function getKurstagObj($knr)
  {
    $dbwKursTage = new \DBWorkKurseTage(1, true, true);
    $kursTag = $dbwKursTage->getNewObject();

    
    $kursTag->knr = $knr;
    $kursTag->kurs = $this->getKurs($knr);

    $dbwDoz = new \DBWorkDozenten();
    $hauptdozent = $dbwDoz->getHauptDozent($knr);
    $kursTag->dnr = $hauptdozent->id;
    $kursTag->ort = '';

    return $kursTag;
  }

  private function getKurstag()
  {
    $kurstag = null;
    if (is_null($kurstag)) {
      $dbw = new \DBWorkKurseTageWT(1, true);
      if (is_numeric($this->request->ktId)) {
        $kurstag = $dbw->getKurstag($this->request->ktId, true);
      } else {
        $kurstag = $dbw->getNewObject();
        $kurstag->kurs->id = $this->request->knr;
      }
    }

    return $kurstag;
  }

  
  protected function preKurstagInsertHook($kurstag, $changedFields)
  {
    return array($kurstag, $changedFields);
  }

  private function saveKurstag()
  {
    $altPasstKursZuKurstage = \PasstKursZuKurstageAPI::passenKursdatenZuKurstagen($this->request->knr);

    $origKurstag = $this->getKurstagObj($this->request->knr);
    $this->changedKurstag = $this->request->wssHandler->getChangedDm(
      $this->toolSettings,
      $origKurstag,
      $this->request->columnValues
    );
    $changedFields = $this->request->wssHandler->getChangedFieldnames(
      $this->toolSettings,
      $origKurstag,
      $this->request->columnValues
    );
    $changedFields[] = 'knr'; 

    $this->changedKurstag = \KurstagAPI::aktualisiereKurstagZeit(
      $this->changedKurstag,
      (in_array('zeit_beg', $changedFields) ? $this->changedKurstag->zeit_beg : null),
      (in_array('zeit_ende', $changedFields) ? $this->changedKurstag->zeit_ende : null),
      (in_array('pause', $changedFields) ? $this->changedKurstag->pause : null),
      (in_array('minuten', $changedFields) ? $this->changedKurstag->minuten : null),
      (in_array('ue', $changedFields) ? $this->changedKurstag->ue : null)
    );

    $dbwork = new \DBWorkKurseTageWT(1, true);
    $insertedktid = -1;
    try {
      list($this->changedKurstag, $changedFields) = $this->preKurstagInsertHook($this->changedKurstag, $changedFields);
      if (\SessionOperations::isDmzBetrieb()) {
        $korrekturAPI = new \KurskorrekturAPI();
        $this->changedKurstag->id = $dbwork->insertKurstag($this->changedKurstag, true);
        $insertedktid = $this->changedKurstag->id;
        $korrekturAPI->correctKurstag($this->changedKurstag, $changedFields, null, 'insert');
      } else {
        $this->changedKurstag->id = $dbwork->insertKurstag($this->changedKurstag, false);
      }

      $this->setSessionVarsForMailAnTn($this->changedKurstag);

      $origKurstag->id = $this->changedKurstag->id;
      $this->sendeBenachrichtigungEmailTermindaten($origKurstag, $this->changedKurstag, $changedFields);

      $zusMedienMail = $this->getZusaetzlicheMedienEMail();
      $zusMedienMail->sendMailToEinrichtung($this->changedKurstag);
    } catch (\AbgleichApiException $aae) {
      
      if ($insertedktid != -1) {
        $dbwork->deleteKurstag($insertedktid);
      }

      \Logger::logg('Kurstagkorrektur - folgende Exception ist aufgetreten: ' . $aae->getMessage() . ' [' . $aae->getTraceAsString() . ']', 200);
      switch($aae->errorType) {
        case \AbgleichApiResult::KURSTAG_KORREKTUR_KEINE_EINGETRAGEN:
        case \AbgleichApiResult::KURSTAG_KORREKTUR_TEILWEISE_EINGETRAGEN:
        case \AbgleichApiResult::CONFLICT:
        default:
          return self::ERROR_KURSTAG_BEARBEITEN_FEHLGESCHLAGEN;
      }
    } catch (\Exception $e) {
      \Logger::logg('Kurstagkorrektur - folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);

      return self::ERROR_KURSTAG_BEARBEITEN_FEHLGESCHLAGEN;
    }

    return $this->postSuccessTerminAdded($this->changedKurstag, $altPasstKursZuKurstage) ?? self::SUCCESS_KURSTAG_BEARBEITEN_ERFOLGREICH;
  }

  
  protected function postSuccessTerminAdded(\Kurstag $kurstag, array $altPasstKursZuKurstage): ?string
  {
    return null;
  }

  protected function setSessionVarsForMailAnTn(\Kurstag $pChangedKurstag): void
  {
    EmailVorbelegen\EmailVorbelegenKurstage::setSessionVars(null, array($pChangedKurstag));
  }

  protected function sendeBenachrichtigungEmailTermindaten(\Kurstag $pOrigKurstag, \Kurstag $pChangedKurstag, array $pChangedFields): void
  {
    
    
  }

  abstract protected function getZusaetzlicheMedienEMail(): \Kufer\Web\KuferTools\Utils\Kurstag\KurstagMedien\ZusaetzlicheMedienMail;

  protected function getResponse($pStatusCode)
  {
    $this->handleResponseStrategies();
    $this->response->knr = $this->request->knr;
    $this->response->kurstag = $this->changedKurstag;
    $this->response->statusCode = $pStatusCode;

    return $this->response;
  }

  protected function getResponseStrategies()
  {
    return array(
        new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen($this),
        new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseWss($this)
    );
  }
}

class TerminHinzufuegenAbsendenRequest
{
  public $knr;
  public $ktId;
  public $columnValues;
  public $isRefresh;
  public $isXsrfOk;
  public $wssHandler;
}

class TerminHinzufuegenAbsendenResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $knr;
  public $kurstag = array();
  public $user;
  public $columns;
  public $menuPunkte;
  public $statusCode;
}