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


namespace Kufer\KuferTools\Veranstalter\KursUebersicht\Detailsreiter\Downloads\BearbeiteDoku;

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

class BearbeiteDokuSubmitUseCase extends \Kufer\KuferTools\Basis\UseCase\EinzelKursUseCase
{
  
  private $statusMessageContainer;
  private $dokuHelper;

  public function __construct($request, $pDokuHelper)
  {
    parent::__construct($request, new BearbeiteDokuSubmitResponse());
    
    $this->statusMessageContainer = new StatusMessageContainer();
    $this->dokuHelper = $pDokuHelper;
  }

  public static function getToolId()
  {
    return \ToolsAPI::TOOL_KURSUEBERSICHT_VA; 
  }

  public static function getToolSectionId()
  {
    return 623;
  }

  
  public function hasAccess($pToolSectionId = null)
  {
    
    
    
    if (!\Kufer\KuferTools\Basis\UseCase\ToolUseCase::hasAccess()) {
      return false;
    }

    
    
    if (!$this->isRechtAllowed($this->getToolSectionId() . '.0.3')) {
      return false;
    }
    
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }
    
    $dokument = $this->dokuHelper->getDokumentWeb($this->request->dokuId);
    
    $kursnummern = $this->getAllowedKursnummern();
    if (!in_array($dokument->knr, $kursnummern)) {
      return false;
    }

    return true;
  }

  

  public function action()
  {
    
    
    $origDokument = $this->dokuHelper->getDokumentWeb($this->request->dokuId);
    if (!$this->request->isRefresh) {
      $dokument = $origDokument->copy();
      
      $changedDokument = $this->getDokument($dokument);

      
      $this->processDoku($changedDokument, $origDokument);
    }

    return $this->getResponse();
  }

  

  
  private function processDoku($pDokument, $pOrigDokument)
  {
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    $dmzBetrieb = $this->session->isReplikat() && $allgSettings->dmzEnabled;

    
    $changedDokuFields = $this->getChangedDokuFieldsToSend($pDokument, $pOrigDokument);
    
    $anzFields2Change = count($changedDokuFields) - 1;

    if ($anzFields2Change == 0) {
      $this->setStatusMessageNoCorrectionContent($pDokument->bezeichnung);

      return;
    }

    try {
      if ($dmzBetrieb) {
        
        $dokumenteTupel = new \Tuple($pDokument, $changedDokuFields, $pOrigDokument);
        
        $apiStatus = \DokumenteAPI::correctDokumente(array($dokumenteTupel), 'update');
        
        if ($apiStatus === 'noCorrection') {
          throw new \Exception('Fehler beim Senden der Nachricht an die DMZ (' . $apiStatus . ')');
        }
      }
      else {
        $apiStatus = 'nichtAktiviert';
      }

      
      
      $dbwDok = new \DBWorkDokumenteWeb();
      $dbwDok->updateDokument($pDokument, $dmzBetrieb);

      
      $this->setStatusMessageSuccessContent($pDokument->bezeichnung);
      if ($apiStatus === 'nichtAktiviert') {
        $logMessage = 'Dokumente Update erfolgreich. Achtung:  Die DMZ ist nicht aktiviert. Datenabgleich beachten.';
        \Logger::logg($logMessage, 200);
      }

      return;
    }
    catch (\Exception $e) {
      
      $this->setStatusMessageFailSubmitContent($pDokument->bezeichnung);
      $logMessagePart = $e->getMessage() . ' [' . $e->getTraceAsString() . ']';
      \Logger::logg('Dokumente Update - folgende Exception ist aufgetreten: ' . $logMessagePart, 200);

      return; 
    }
  }

  

  
  private function getChangedDokuFieldsToSend($pDokument, $pOrigDokument)
  {
    $changedFields = array();

    
    
    
    
    $excludedDokuFieldAry = array('fileInfo', 'original', 'internet', 'darstellungWeb', 'downloadlinkkomplett', 'uploaddoz', 'suche_KursFreigeben');

    
    foreach (get_object_vars($pDokument) as $dokuField => $value) {
      
      if ($dokuField === 'knr') {
        $changedFields[] = $dokuField;
      } elseif (!in_array($dokuField, $excludedDokuFieldAry)) {
        
        
        if ($pOrigDokument->{$dokuField} != $value) {
          $changedFields[] = $dokuField;
        }
      }
    }

    return $changedFields;
  }

  

  
  private function getDokument($pDokument = null)
  {
    
    return $this->dokuHelper->getCommonDokumentPartFromRequest($this->request, $pDokument);
    
  }

  protected function getResponse()
  {
    $this->response->knr = $this->request->knr;
    
    $this->response->statusMessageContainer = $this->statusMessageContainer;

    return $this->response;
  }

  private function setStatusMessageNoCorrectionContent($pDokumentName)
  {
    
    $statusMsgInhalt = ' Zu Dokument ' . $pDokumentName . ' wurden keine Daten verändert.';
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getInfoMessageObj($statusMsgInhalt));
  }

  

  private function setStatusMessageSuccessContent($pDokumentName)
  {
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    $statusMsgInhalt = $pDokumentName . ': ' . $allgSettings->successMsgDokument;
    $this->statusMessageContainer->addStatusMessageObj(StatusMessage::getSuccessMessageObj($statusMsgInhalt));
  }

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


class BearbeiteDokuSubmitRequest extends DokuHelperRequest
{
  public $knr;
  public $dokuId;
  
  public $isRefresh;
  public $isXsrfOk;
  
}

class BearbeiteDokuSubmitResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $knr;
  public $statusMessageContainer;
}