<?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 DozentInserter
{
  protected $dmzBetrieb;
  protected $requestObj;
  protected $statusMessageContainer;
  protected $wrongFields;

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

  public function setDmzBetrieb($pDmzBetrieb)
  {
    $this->dmzBetrieb = $pDmzBetrieb;
  }

  
  public function doInsert()
  {
    $dozInfo = array('success' => false, 'dozName' => '', 'dozId' => -1);
    $dbwDoz = new \DBWorkDozenten();
    
    $this->wrongFields = $this->requestObj->wssHandler->checkColumnValues($this->requestObj->columnValues);
    
    if (count($this->wrongFields) == 0) {

      
      $origDozent = $dbwDoz->getNewObject();
      $changedDozent = $this->requestObj->wssHandler->getChangedDm($origDozent, $this->requestObj->columnValues);
      
      $changedFields = $this->requestObj->wssHandler->getChangedFieldnames($origDozent, $this->requestObj->columnValues);

      $dozInfo['dozName'] = $changedDozent->name . ', ' . $changedDozent->vorname;


      
      $changedFields = array_merge($changedFields, $changedDozent->getKommAnzeigeAry($origDozent));
      if (count($changedFields) == 0) {
        $this->setStatusMessageNoCorrectionContent($dozInfo['dozName']);
        $dozInfo['success'] = 'noCorrection';

        return $dozInfo;
      } 

      $changedFields[] = 'guid';

      $insertedDozId = -1;
      try {
        if ($this->dmzBetrieb) {
          
          $insertedDozId = $dbwDoz->insertDozent($changedDozent);
          
          
          

          $origKommAry = null; 
          $dozentTuple = new \Tuple($changedDozent, $changedFields, null);
          
          $apiStatus = \DozentenAPI::correctDozenten($dozentTuple, 'insert');

          if ($apiStatus === 'nichtAktiviert' || $apiStatus === 'noCorrection') {
            throw new \Exception($apiStatus);
          }

          
          
          

          \KommunikationsAPI::buildAndSendKommunikation($changedDozent, $origKommAry);
        } 
        else {
          $insertedDozId = $dbwDoz->insertDozent($changedDozent);
        }
        $success = 'sendDone';
        $dozInfo['dozName'] = $changedDozent->name . ', ' . $changedDozent->vorname;
        $this->setStatusMessageSuccessContent();
      } catch (\Exception $ex) {
        if ($insertedDozId != -1) {
          $dbwDoz->deleteDozent($insertedDozId);
          
          $insertedDozId = -1;
        }
        $success = 'failure';
        if ($ex instanceof \AbgleichApiException) {
          if ($ex->errorType == \AbgleichApiResult::CONFLICT) {
            $this->setStatusMessageConflictContent();
          } else {
            $this->setStatusMessageFailSubmitContent();
          }
        } elseif ($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("Dozenteninsert - Validierung fehlgeschlagen: \n" . 'Mindestens ein Pflichtfeld ist nicht gefüllt ', 200);
      $this->setStatusMessageMandatoryFaultContent($dozInfo['dozName']);
    }

    return $dozInfo;
  }

  

  private function getSprachDozString()
  {
    $sprachSettings = \SettingsFactory::getSettings('SprachSettingsObject');

    return ucfirst($sprachSettings->Dozent['Singular_mit_Artikel']['Nominativ']);
  }

  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->failMsgDozentNeu));
  }

  private function setStatusMessageFailSubmitContent()
  {
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getErrorMessageObj($allgSettings->failSubmitMsgDozent));
  }

  private function setStatusMessageNoCorrectionContent($pDozname)
  {
    
    $statusMsgInhalt = $this->getSprachDozString() . ' ' . $pDozname . ' wurde nicht neu angelegt.';
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getWarningMessageObj($statusMsgInhalt));
  }

  

  private function setStatusMessageMandatoryFaultContent($pDozname)
  {
    $statusMsgInhalt = $this->getSprachDozString() . ' ' . $pDozname . ' wurde nicht neu angelegt.' . BR;
    $statusMsgInhalt .= \Kufer\KuferTools\Utils\WssHandler::getErrorMessage($this->wrongFields);
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getErrorMessageObj($statusMsgInhalt));
  }

  
  public function getStatusMessageContainer()
  {
    return $this->statusMessageContainer;
  }
}