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


class KurskorrekturAPI
{
  
  public function correctKurs($kurs, $fields)
  {
    $abgleichAPI = new AbgleichAPI();
    if (!$abgleichAPI->isAktiviert() || !SessionOperations::isReplikat()) {
      return;
    }

    $changedKurs = $kurs;

    $dbw = new DBWorkKurse();
    $origKurs = $dbw->getKurs($kurs->id);

    $kursTuple = new \Tuple($changedKurs, $fields, $origKurs);
    \KursplanungAPI::correctKurs($kursTuple, 'update');
  }

  

  
  public function insertUnterrichtsmittel($mittelAry)
  {
    $abgleichAPI = new AbgleichAPI();

    if (!$abgleichAPI->isAktiviert() || !SessionOperations::isReplikat()) {
      return;
    }

    $message = new XMLNode('umittel');

    foreach ($mittelAry as $mittel) {
      $unterrichtsmittelNode = XMLNode::getXMLNode($mittel, 'unterrichtsmittel', array(), true);
      if ($unterrichtsmittelNode->hasChildren()) {
        $message->addChild($unterrichtsmittelNode);
      }
    }

    $abgleichAPI->sendeNachricht(
      AbgleichAPI::ABGLEICH_UNTERRICHTSMITTEL_HINZUFUEGEN,
      new Nutzlast($message)
    );
  }

  
  public function correctKurstag($kurstag, $fields, $originalKurstag, $pCorrectMode = 'update')
  {
    $this->correctKurstage(array(new Tuple($kurstag, $fields, $originalKurstag)), $pCorrectMode);
  }

  
  public function correctKurstage($pKurstagTuples, $pCorrectMode = 'update')
  {
    $abgleichAPI = new AbgleichAPI();
    if (!$abgleichAPI->isAktiviert()) {
      return 'nichtAktiviert';
    }

    $message = new XMLNode('kurstage');

    $nothingToDo = true;
    

    foreach ($pKurstagTuples as $kurstagInfo) {
      $kurstag = $kurstagInfo->getFirst();
      $fields = $kurstagInfo->getSecond();
      $kurstagoriginal = $kurstagInfo->getThird();
      $kurstagNode = new XMLNode('kurstag');

      
      $kurstagNode->addChild(new XMLNode('correctmode', $pCorrectMode));

      
      
      
      $kurstagNode->addChild(new XMLNode('id', $kurstag->id));


      $kurstagOldNode = new XMLNode('oldobject');
      
      $kurstagOldNode->addChild(new XMLNode('id', $kurstag->id));

      $nothingToDo = $this->addFieldsToKurstagNode($kurstagNode, $kurstag, $fields) && $nothingToDo;

      if ($pCorrectMode != 'insert') {
        $nothingToDo = $this->addFieldsToKurstagNode($kurstagOldNode, $kurstagoriginal, $fields) && $nothingToDo;
      }

      $kurstagNode->addChild($kurstagOldNode);

      $kurstagmedienNode = $this->CreateKursTagMedienNode($kurstag, $fields);

      
      $message->addChild($kurstagNode);

      if ($kurstagmedienNode !== null) {
        $message->addChild($kurstagmedienNode);
        $nothingToDo = false;
      }
    }

    if (!$nothingToDo) {
      
      if ($pCorrectMode == 'update') { 
        $operation = AbgleichAPI::ABGLEICH_KURSTAGKORREKTUR;
      } elseif ($pCorrectMode == 'insert') {
        $operation = AbgleichAPI::ABGLEICH_KURSTAG;
      } else { 
        $operation = AbgleichAPI::ABGLEICH_KURSTAGDELETE;
      }
      $abgleichAPI = new AbgleichAPI();
      
      $abgleichAPI->sendeNachricht($operation, new Nutzlast($message));

      return 'sendDone';
    }

    return 'noCorrection';
  }

  

  
  public static function addFieldsToKurstagNode($kurstagNode, $kurstag, $fields)
  {
    $dbwKurstage = new DBWorkKurseTage();
    $nothingToDo = true;

    
    foreach ($fields as $fieldName) {
      if ($dbwKurstage->canupdate($fieldName)) {
        
        $fieldValue = $kurstag->getDMZValue($fieldName);

        $fieldAttr = '';
        if ($fieldValue === '') {
          $fieldValue = '-';
          $fieldAttr = 'leer="true"';
        }
        $fieldName = $kurstag->getDmzVarName($fieldName);
        $childNode = new XMLNode($fieldName, $fieldValue, $fieldAttr);
        $kurstagNode->addChild($childNode);

        $nothingToDo = false;
      }
    }

    return $nothingToDo;
  }

  private function CreateKursTagMedienNode($kurstag, $fields)
  {
    $kurstagmedienNode = null;

    foreach ($fields as $fieldName) {
      
      
      if ($fieldName == 'medien') {
        $kurstagmedienNode = $this->_getKurstagMedienNode($kurstag);
      }
    }

    return $kurstagmedienNode;
  }

  
  public function _getKurstagMedienNode($pKurstag)
  {
    $kurstagmedienNode = new XMLNode('kurstagmedien');
    
    $kurstagmedienNode->addChild(new XMLNode('kurstagid', $pKurstag->id));

    $medienAry = explode(WT_MEDIENTRENNER, $pKurstag->medien);

    
    if (!empty($medienAry)) {
      array_pop($medienAry);
    }
    $medienanz = count($medienAry);
    
    $len4entry = 3;
    for ($i = 0; $i < $medienanz; $i += $len4entry) {
      $kurstagmediumNode = new XMLNode('kurstagmedium');
      
      
      
      
      $idvalue = $medienAry[$i];
      $idAttr = '';
      if ($medienAry[$i] === '') {
        $idvalue = '-';
        $idAttr = 'leer="true"';
      }
      $childNodeId = new XMLNode('id', $idvalue, $idAttr);
      $childNodeMedium = new XMLNode('medium', $medienAry[$i + 1]);
      $bemValue = $medienAry[$i + 2];
      $bemAttr = '';
      if ($bemValue === '') {
        $bemValue = '-';
        $bemAttr = 'leer="true"';
      }
      $childNodeBem = new XMLNode('bemerkung', $bemValue, $bemAttr);

      $kurstagmediumNode->addChild($childNodeId);
      $kurstagmediumNode->addChild($childNodeMedium);
      $kurstagmediumNode->addChild($childNodeBem);
      
      $kurstagmedienNode->addChild($kurstagmediumNode);
    }

    return $kurstagmedienNode;
  }

  

  
  public function updateKurs($pKurs, $pOrigKurs)
  {
    $allgsettings = AllgSettingsAPI::getAllgSettings();
    if (SessionOperations::isReplikat()) {
      if ($allgsettings->dmzEnabled) {
        return $this->_updateKursDmz($pKurs, $pOrigKurs);
      } else {
        return $this->_updateKursReplikat($pKurs);
      }
    } else {
      return $this->_updateKursDirekt($pKurs);
    }
  }

  
  private function _updateKursDirekt($pKurs)
  {
    $dbwKurse = new DBWorkKurse(1, true);
    $dbwKurse->updateKurs($pKurs, true, false);

    return true;
  }

  
  private function _updateKursReplikat($pKurs)
  {
    $dbwKurse = new DBWorkKurse(1, true);
    $dbwKurse->updateKurs($pKurs, false, false);

    return true;
  }

  
  private function _updateKursDmz($pKurs, $pOrigKurs)
  {
    try {
      $zuUebertragendeFelder = $pOrigKurs->getDiffFields($pKurs, true);
      $zuUebertragendeFelder[] = 'id';

      $this->correctKurs($pKurs, $zuUebertragendeFelder);
      $this->_updateKursDirekt($pKurs);

      return true;
    } catch (AbgleichApiException $aae) {
      Logger::logg('Kurs bearbeiten - folgende Exception ist aufgetreten: ' . $aae->getMessage() . "\n" . ' [' . $aae->getTraceAsString() . ']', 200);

      return false;
    }
  }
}