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


namespace Kufer\KuferTools\Utils\DozKursHandler;

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

class DozKursInserter
{
  protected $dmzBetrieb;
  protected $requestObj;
  protected $statusMessageContainer;
  protected $isNewDozInserted;

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

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

  
  public function doInsert($pDozId)
  {
    
    
    
    $dozhonId = -1;
    $dbwDozHon = new \DBWorkDozentenHonorar();

    try {
      $dbwDoz = new \DBWorkDozenten();
      
      
      $dozent = $dbwDoz->getDozent($pDozId, $this->isNewDozInserted);
      $apiStatus = '';
      

      
      

      $anzahlDozKurse = $dbwDozHon->getHonorardatenCount($this->requestObj->knr, $pDozId);
      if ($anzahlDozKurse == 0) {
        
        $correctFields = array('knr', 'dnr', 'typ');
        
        $dozentenHonorar = $this->getDefaultDozHonorar($dozent);
        $dozhonId = $dbwDozHon->insertHonorar($dozentenHonorar, $this->dmzBetrieb);
        $dozentenHonorar->id = $dozhonId;

        
        if ($this->dmzBetrieb) {
          

          $dozhonPaar = new \Tuple($dozentenHonorar, $correctFields, $dozentenHonorar);
          
          $apiStatus = \DozentenAPI::correctDozentenHonorar($dozhonPaar, 'insert');
          
        }
        
        
        if ($apiStatus === 'nichtAktiviert') {
          throw new \Exception('Die DMZ ist nicht aktiviert');
        }

        
        $this->setStatusMessageSuccessContent($dozent->namevorname);
      } 
      else {
        
        
        
        
        
        $this->setStatusMessageReloadContent($dozent->namevorname);
      }
    } catch (\Exception $e) {
      
      if ($dozhonId !== -1) {
        $dbwDozHon->deleteHonorar($dozhonId);
      }
      \Logger::logg('Hinzufügen eines Dozenten zum Kurs - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n"
                   . '[' . $e->getTraceAsString() . ']', 200);

      
      $this->setStatusMessageFailureContent();
    }
    
  }

  

  
  protected function getDefaultDozHonorar($pDozent)
  {
    $dozentenHonorar = new \DozentenHonorare();
    
    $dozentenHonorar->dnr = $pDozent->id;
    $dozentenHonorar->knr = $this->requestObj->knr;
    
    $dozentenHonorar->typ = 'D';
    
    $dozentenHonorar->honsatz = $pDozent->stundensatz;
    $dozentenHonorar->fahrtentfernung = $pDozent->fahrentfernung;
    
    
    $dozentenHonorar->druckdatum = DEFAULTDATE;

    return $dozentenHonorar;
  }

  

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

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

  private function setStatusMessageReloadContent($pDozname)
  {
    
    $statusMsgInhalt = $this->getSprachDozString() . ' ' . $pDozname . ' ist bereits im Kurs vorhanden.';
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getWarningMessageObj($statusMsgInhalt));
  }

  

  private function setStatusMessageSuccessContent($pDozname)
  {
    
    $statusMsgInhalt = $this->getSprachDozString() . ' ' . $pDozname . ' wurde ';
    
    if ($this->isNewDozInserted) {
      $statusMsgInhalt .= 'neu angelegt und ';
    }
    $statusMsgInhalt .= 'dem Kurs erfolgreich hinzugefügt';

    
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getSuccessMessageObj($statusMsgInhalt));
  }

  private function setStatusMessageFailureContent()
  {
    
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    
    if ($this->isNewDozInserted) {
      $statusMsgInhalt = $allgSettings->failMsgDozentNewAdd;
    } else {
      $statusMsgInhalt = $allgSettings->failMsgDozentAdd;
    }
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getErrorMessageObj($statusMsgInhalt));
  }

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