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

namespace Kufer\KuferTools\Basis\DozentenInfo\UpdateDozent\HandleDozentUpdate;

abstract class HandleDozentUpdateUseCase extends \Kufer\KuferTools\Basis\UseCase\EinzelDozentUseCase
{
  public const SUCCESS_DOZENT_ERFOLGREICH_UEBERMITTELT = 'dozentdatenErfolgreichÜbermittelt';
  public const INFO_DOZENTDATEN_NICHT_VERAENDERT = 'dozentdatenNichtVerändert';
  public const ERROR_DOPPELT_AUFGERUFEN = 'doppeltAufgerufen';
  public const ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN = 'übertragungFehlgeschlagen';
  public const ERROR_DOZENT_NICHT_ANGELEGT = 'dozentNichtAngelegt';
  public const ERROR_DOZENTDATEN_NICHT_AKTUELL = 'dozentdatenNichtAktuell';
  public const ERROR_DOZENTDATEN_FEHLERHAFT = 'dozentdatenFehlerhaft';

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

  public function action()
  {
    list($statusCode, $dnr, $wrongFields) = array_values($this->handleDozentUpdate());
    \SessionOperations::setVarValueWTIntern('newDozStatusCode', $statusCode);
    \SessionOperations::setVarValueWTIntern('newDozWrongFields', $wrongFields);

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

  
  protected function preDozentUpdateHook($dozent, $changedFields)
  {
    return array($dozent, $changedFields);
  }

  
  private function handleDozentUpdate()
  {
    
    if ($this->request->dozupdate) {
      $origDozent = $this->getDozent();
    } else {
      throw new \Exception('Fehler: Dozent neu anlegen oder bearbeiten nicht angegeben!');
    }
    $changedDozent = $this->request->wssHandler->getChangedDm($origDozent, $this->request->columnValues);
    $changedFields = $this->request->wssHandler->getChangedFieldnames($origDozent, $this->request->columnValues);
    
    $wrongFields = $this->request->wssHandler->checkColumnValues($this->request->columnValues);

    
    if (!empty($wrongFields)) {
      $statusCode = self::ERROR_DOZENTDATEN_FEHLERHAFT;
      $dnr = $this->request->dnr;
    } else {
      list($changedDozent, $changedFields) = $this->preDozentUpdateHook($changedDozent, $changedFields);
      list($statusCode, $dnr) = array_values($this->saveDozent($origDozent, $changedDozent, $changedFields));
    }

    return array($statusCode, $dnr, $wrongFields);
  }

  
  private function saveDozent($pOrigDozent, $pDozent, $pChangedFields)
  {
    $statusCode = '';
    $dbwDoz = new \DBWorkDozenten(1, true);
    $dbwBASysUser = \DBWorkBASysUser::getDefaultInstance();
    $benutzerKuerzel = $dbwBASysUser->getBASysUser($this->getUser()->ben)->kennung;
    $dozAndChangedFields = \DozentenAPI::aktualisiereBerechneteDozentenDaten($pOrigDozent, $pDozent, $benutzerKuerzel);
    $pDozent = $dozAndChangedFields['dozent'];
    $pChangedFields = array_merge($pChangedFields, $dozAndChangedFields['changedFields']);
    
    $pChangedFields = array_merge($pChangedFields, $pDozent->getKommAnzeigeAry($pOrigDozent));

    if (count($pChangedFields) == 0) {
      $statusCode .= self::INFO_DOZENTDATEN_NICHT_VERAENDERT;

      return array('statusMessage' => $statusCode, 'dozId' => $this->request->dnr);
    } 

    $insertedDozId = $this->request->dnr;
    try {
      if (\SessionOperations::isDmzBetrieb()) {
        
        
        $correctMode = 'update';
        
        
        $pDozent->updateKommAnzeige();
        $dozentTuple = new \Tuple($pDozent, $pChangedFields, $pOrigDozent);
        \DozentenAPI::correctDozenten($dozentTuple, $correctMode);
        
        
        
        $origKommAry = \KommunikationsAPI::getOrigKommunikation($pDozent);

        
        
        $pDozent = $dbwDoz->updateDozent($pDozent, true);
        
        
        \KommunikationsAPI::buildAndSendKommunikation($pDozent, $origKommAry);
        $insertedDozId = $pDozent->id;
      } 
      
      else {
        
        
        $dbwDoz->updateDozent($pDozent, false);
      }
      $statusCode .= self::SUCCESS_DOZENT_ERFOLGREICH_UEBERMITTELT;
    } 
    catch (\AbgleichApiException $aae) {
      \Logger::logg('Dozentenkorrektur - folgende Exception ist aufgetreten: ' . $aae->getMessage() . "\n" . ' [' . $aae->getTraceAsString() . ']', 200);
      if ($aae->errorType == \AbgleichApiResult::CONFLICT) {
        $statusCode .= self::ERROR_DOZENTDATEN_NICHT_AKTUELL;
      } else {
        $statusCode .= self::ERROR_UEBERTRAGUNG_FEHLGESCHLAGEN;
      }
    }
    
    
    catch (\Exception $e) {
      $statusCode .= self::INFO_DOZENTDATEN_NICHT_VERAENDERT;
      \Logger::logg('Dozentenkorrektur - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);
    }

    return array('statusMessage' => $statusCode, 'dozId' => $insertedDozId);
  }

  protected function getResponse($dnr)
  {
    $this->response->dnr = $dnr;
    $this->response->dguid = $this->getRequestedGuid() ?? '';

    
    return $this->response;
  }
}

class HandleDozentUpdateRequest
{
  public $dnr;
  public $dguid;
  public $dozupdate;
  public $columnValues;
  public $wssHandler;
}

class HandleDozentUpdateResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $dnr;
  public $dguid;
}