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



namespace Kufer\KuferTools\Utils\DozentenHandler;
use Kufer\KuferTools\Utils\StatusMessages\StatusMessageContainer as StatusMessageContainer;
use Kufer\KuferTools\Utils\StatusMessages\StatusMessage as StatusMessage;

class DozentUpdater
{
   protected $dmzBetrieb;
   protected $requestObj;
   protected $statusMessageContainer;

  
  public function __construct($pRequestObj) {
    $this->requestObj = $pRequestObj;
    $this->statusMessageContainer = new StatusMessageContainer();
  }
  
  public function setDmzBetrieb($pDmzBetrieb) {
    $this->dmzBetrieb = $pDmzBetrieb;    
  }


  
  
  public function doUpdate($pUserId, $pDozId) 
  {
    $dozInfo = array('success' => false, 'dozName' => '', 'dozId' => -1);
    $dbwDoz = new \DBWorkDozenten();
    
    $origDozent = $dbwDoz->getDozent($pDozId, true);
    
    $changedDozent = $this->requestObj->wssHandler->getChangedDm($origDozent, $this->requestObj->columnValues);
    
    $changedFields = $this->requestObj->wssHandler->getChangedFieldnames($origDozent, $this->requestObj->columnValues);
    $dbwBASysUser = \DBWorkBASysUser::getDefaultInstance();
    $benutzerKuerzel = $dbwBASysUser->getBASysUser(\SessionOperations::getCurrentWebToolsUser()->ben)->kennung;
    $dozAndChangedFields = \DozentenAPI::aktualisiereBerechneteDozentenDaten($origDozent, $changedDozent, $benutzerKuerzel);
    $changedDozent = $dozAndChangedFields['dozent'];
    $addChangedFields = $dozAndChangedFields['changedFields'];

    
    $validationOK = true;
    

    if ($validationOK) {
      $changedFields = array_merge($addChangedFields, $changedFields, $changedDozent->getKommAnzeigeAry($origDozent));
      
      if (count($changedFields)== 0) {
        return array('success' => 'noCorrection', 'dozName' => '' , 'dozId' => -1, );
      } 
      try {
        if ($this->dmzBetrieb) {
          
          
          

          
          
          $changedDozent->updateKommAnzeige();
          $dozentTuple = new Tuple($changedDozent, $changedFields, $origDozent);
          
          $apiStatus = \DozentenAPI::correctDozenten($dozentTuple, 'update');
          if ($apiStatus === 'nichtAktiviert' || $apiStatus === 'noCorrection') {
            $dozInfo['dozName'] = $changedDozent->name.', '.$changedDozent->vorname;
            throw new \Exception($apiStatus);
          }
          
          
          $origKommAry = \KommunikationsAPI::getOrigKommunikation($changedDozent);

          
          
          $changedDozent = $dbwDoz->updateDozent( $changedDozent, $pUserId, true);
          
          
          \KommunikationsAPI::buildAndSendKommunikation($changedDozent, $origKommAry);

        } 
        else {
          
          $dbwDoz->updateDozent($changedDozent, $pUserId, false);
        }
        $success = 'sendDone';
        $dozInfo['dozName'] = $changedDozent->name.', '.$changedDozent->vorname;
        $this->setStatusMessageSuccessContent();
      } catch (\Exception $ex) {
        $success = 'failure';
        if ($ex instanceof \AbgleichApiException) {

          if( $ex->errorType == \AbgleichApiResult::CONFLICT ) {
            $this->setStatusMessageConflictContent();
          }
          else
            $this->setStatusMessageFailSubmitContent();
        }
        else
          if ($ex->getMessage() == 'nichtAktiviert')
            $this->setStatusMessageFailureContent();
          else 
            $this->setStatusMessageNoCorrectionContent($dozInfo['dozName']);

        \Logger::logg("Dozenteninsert - folgende Exception ist aufgetreten: ".$ex->getMessage()."\n".' ['.$ex->getTraceAsString().']', 200);
      } 
      $dozInfo['success'] = $success;
      $dozInfo['dozId'] = $insertedDozId;
    } 
    else {
      \Logger::logg("Dozentenupdate - Validierung fehlgeschlagen: \n".'Mindestens ein Pflichtfeld ist nicht gefüllt ', 200);
      $this->setStatusMessageMandatoryFaultContent();
    }
    
    return $dozInfo;
  } 
  
  
  protected function getDozentAndFields() {
     $origDozent = $dbwDoz->getDozent($dozent->id, true);
     $dbwBASysUser = \DBWorkBASysUser::getDefaultInstance();
     $benutzerKuerzel = $dbwBASysUser->getBASysUser(\SessionOperations::getCurrentWebToolsUser()->ben)->kennung;
     $dozAndChangedFields = self::aktualisiereBerechneteDozentenDaten($origDozent, $dozent, $benutzerKuerzel);
     $dozent = $dozAndChangedFields['dozent'];
     $changedFields = $dozAndChangedFields['changedFields'];
  }
  
  
  
  
   protected function getSprachDozString($pFall) {
    $sprachSettings = \SettingsFactory::getSettings('SprachSettingsObject');
    switch ($pFall) {
      case 1: 
        return ucfirst($sprachSettings->Dozent['Singular_mit_Artikel']['Nominativ']);   
      case 2:
        return ucfirst($sprachSettings->Dozent['Singular_mit_Artikel']['Genitiv']);
      case 3:
        return ucfirst($sprachSettings->Dozent['Singular_mit_Artikel']['Dativ']);
      case 4:
        return ucfirst($sprachSettings->Dozent['Singular_mit_Artikel']['Akkusativ']);   
    } 
  }

  public function getStatusMessageReloadContent($pDozname) {
    $sprachSettings = \SettingsFactory::getSettings('SprachSettingsObject');
    $statusMsgInhalt = $this->getSprachDozString(1).' '.$pDozname.' ist bereits im Kurs vorhanden.';
    return $statusMsgInhalt;            
  } 

 private function setStatusMessageSuccessContent() {
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getSuccessMessageObj($allgSettings->successMsgDozentNeu));
    
    
    
  }
  
  private function setStatusMessageConflictContent() {
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    $message = $allgSettings->failSubmitMsgConflict;
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getErrorMessageObj($message));
  }
  
  private function setStatusMessageFailureContent() {
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getErrorMessageObj($allgSettings->failMsgChangeDozent ));
  }
  
  private function setStatusMessageFailSubmitContent() {
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getErrorMessageObj($allgSettings->failSubmitMsgDozent));
  }
  
  
  private function setStatusMessageNoCorrectionContent($pDozname) {
    
    $statusMsgInhalt = 'Zu '.$this->getSprachDozString(3).' '.$pDozname.' wurden keine Daten verändert.';
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getWarningMessageObj($statusMsgInhalt));     
  } 

  
  private function setStatusMessageMandatoryFaultContent($pDozname) {
    $statusMsgInhalt = 'Die Daten zu '.$this->getSprachDozString(3).' '.$pDozname.' wurden nicht verändert.'.BR.
             ' Nicht alle Pflichtfelder wurden korrekt gefüllt. Bitte überprüfen Sie diese.';
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getErrorMessageObj($statusMsgInhalt));
  }
   
  
  
 
  public function getStatusMessageContainer()  {
    return $this->statusMessageContainer;
  }
  

   
}