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

namespace Kufer\KuferTools\Basis\Kursdetails\DetailsReiter\Termine\TerminHinzufuegen;

use Kufer\KuferTools\Utils\EmailVorbelegen;

abstract class TerminHinzufuegenAbsendenUseCase extends \Kufer\KuferTools\Basis\UseCase\EinzelKursUseCase
{
  const SUCCESS_KURSTAG_BEARBEITEN_ERFOLGREICH = 'kurstagHinzufügenErfolgreich';
  const ERROR_KURSTAG_BEARBEITEN_FEHLGESCHLAGEN = 'kurstagHinzufügenFehlgeschlagen';
  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()
  {
    $origKurstag = $this->getKurstagObj($this->request->knr);
    $this->changedKurstag = $this->request->wssHandler->getChangedDm($origKurstag, $this->request->columnValues);
    $changedFields = $this->request->wssHandler->getChangedFieldnames($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);
      }

      EmailVorbelegen\EmailVorbelegenKurstage::setSessionVars(null, array($this->changedKurstag));

      $zusMedienMail = $this->getZusaetzlicheMedienEMail();
      $zusMedienMail->sendMailToEinrichtung($this->changedKurstag, \SessionOperations::getCurrentWebToolsUser(), $this->toolSettings->medienMailAnVerwMa);
    } catch (\AbgleichApiException $aae) {

      
      if ($insertedktid != -1) {
        $dbwork->deleteKurstag($insertedktid);
      }

      \Logger::logg('Kurstagkorrektur - folgende Exception ist aufgetreten: ' . $aae->getMessage() . ' [' . $aae->getTraceAsString() . ']', 200);
      if ($aae->errorType == \AbgleichApiResult::KURSTAG_KORREKTUR_KEINE_EINGETRAGEN) {
        return self::ERROR_KURSTAG_BEARBEITEN_FEHLGESCHLAGEN;
      } elseif ($aae->errorType == \AbgleichApiResult::KURSTAG_KORREKTUR_TEILWEISE_EINGETRAGEN) {
        return self::ERROR_KURSTAG_BEARBEITEN_FEHLGESCHLAGEN;
      } elseif ($aae->errorType == \AbgleichApiResult::CONFLICT) {
        return self::ERROR_KURSTAG_BEARBEITEN_FEHLGESCHLAGEN;
      } else {
        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 self::SUCCESS_KURSTAG_BEARBEITEN_ERFOLGREICH;
  }

  abstract protected function getZusaetzlicheMedienEMail(): \Kufer\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\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen($this),
        new \Kufer\KuferTools\Utils\ResponseStrategies\ResponseWss($this)
    );
  }
}

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

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