<?php

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

class ZsaTnZbZgAPI
{
  private function __constuct()
  {
  }

  
  protected static function _sendeDmz($pOperation, $pNutzlast, $pSettings = null)
  {
    $abgleichAPI = new AbgleichAPI();

    return $abgleichAPI->sendeNachricht($pOperation, $pNutzlast, $pSettings);
  }

  
  public static function insertTnZbZg($pZsaTnZbZgAry)
  {
    $allgsettings = AllgSettingsAPI::getAllgSettings();
    if (SessionOperations::isReplikat()) {
      if ($allgsettings->dmzEnabled) {
        return static::_insertZsaTnZbZgDmz($pZsaTnZbZgAry);
      } else {
        return static::_insertZsaTnZbZgReplikat($pZsaTnZbZgAry);
      }
    } else {
      return static::_insertZsaTnZbZgDirekt($pZsaTnZbZgAry);
    }
  }

  
  protected static function _insertZsaTnZbZgDirekt($pZsaTnZbZgAry)
  {
    $dbwZsaTnZbZg = new DBWorkZsaTnZbZg(1, true);
    foreach ($pZsaTnZbZgAry as $key => $tnzbzg) {
      $dbwZsaTnZbZg->insertTnZbZg($pZsaTnZbZgAry[$key]);
    }

    return true;
  }

  
  protected static function _insertZsaTnZbZgReplikat($pZsaTnZbZgAry)
  {
    $dbwZsaZsaTnZbZg = new DBWorkZsaTnZbZg(1, true);
    foreach ($pZsaTnZbZgAry as $key => $tnzbzg) {
      $dbwZsaZsaTnZbZg->insertTnZbZg($pZsaTnZbZgAry[$key]);
    }

    return true;
  }

  
  private static function _insertZsaTnZbZgDmz($pZsaTnZbZgAry)
  {
    try {
      static::_insertZsaTnZbZgDirekt($pZsaTnZbZgAry);

      $message = new XMLNode('tnzbzgs');
      foreach ($pZsaTnZbZgAry as $pZsaTnZbZg) {
        $zsaTnZbZgNode = XMLNode::getXMLNode($pZsaTnZbZg, 'tnzbzg', array('zielgruppe'), true);
        $message->addChild($zsaTnZbZgNode);
      }
      static::_sendeDmz(AbgleichAPI::ABGLEICH_ZSA_TNZBZG_INSERT, new Nutzlast($message));

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

      return false;
    }
  }

  
  public static function updateZsaTnZbZg($pZsaTnZbZg, $pOrigTnZbZg)
  {
    $allgsettings = AllgSettingsAPI::getAllgSettings();
    if (SessionOperations::isReplikat()) {
      if ($allgsettings->dmzEnabled) {
        return static::_updateZsaTnZbZgDmz($pZsaTnZbZg, $pOrigTnZbZg);
      } else {
        return static::_updateZsaTnZbZgReplikat($pZsaTnZbZg);
      }
    } else {
      return static::_updateZsaTnZbZgDirekt($pZsaTnZbZg);
    }
  }

  
  protected static function _updateZsaTnZbZgDirekt($pZsaTnZbZg)
  {
    $dbwZsaTnZbZg = new DBWorkZsaTnZbZg(1, true);
    $dbwZsaTnZbZg->updateTnZbZg($pZsaTnZbZg);

    return true;
  }

  
  protected static function _updateZsaTnZbZgReplikat($pZsaTnZbZg)
  {
    $dbwZsaTnZbZg = new DBWorkZsaTnZbZg(1, true);
    $dbwZsaTnZbZg->updateTnZbZg($pZsaTnZbZg);

    return true;
  }

  
  private static function _updateZsaTnZbZgDmz($pZsaTnZbZg, $pOrigTnZbZg)
  {
    try {
      $zuUebertragendeFelder = $pOrigTnZbZg->getDiffFields($pZsaTnZbZg, true);
      $zuUebertragendeFelder[] = 'id';

      $zsaTnZbZgNode = XMLNode::getXmlNodeOnlySpecificFields($pZsaTnZbZg, 'tnzbzg', $zuUebertragendeFelder, true);
      $origZsaTnZbZgNode = XMLNode::getXmlNodeOnlySpecificFields($pOrigTnZbZg, 'oldobject', $zuUebertragendeFelder, true);

      $zsaTnZbZgNode->addChild($origZsaTnZbZgNode);
      $message = new XMLNode('tnzbzgs');
      $message->addChild($zsaTnZbZgNode);
      static::_sendeDmz(
        AbgleichAPI::ABGLEICH_ZSA_TNZBZG_BEARBEITEN,
        new Nutzlast($message)
      );
      static::_updateZsaTnZbZgDirekt($pZsaTnZbZg);

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

      return false;
    }
  }

  
  public static function deleteTnZbZg($pZsaTnZbZgIdAry)
  {
    $allgsettings = AllgSettingsAPI::getAllgSettings();
    if (SessionOperations::isReplikat()) {
      if ($allgsettings->dmzEnabled) {
        return static::_deleteZsaTnZbZgDmz($pZsaTnZbZgIdAry);
      } else {
        return static::_deleteZsaTnZbZgReplikat($pZsaTnZbZgIdAry);
      }
    } else {
      return static::_deleteZsaTnZbZgDirekt($pZsaTnZbZgIdAry);
    }
  }

  
  protected static function _deleteZsaTnZbZgDirekt($pZsaTnZbZgIdAry)
  {
    $dbwZsaTnZbZg = new DBWorkZsaTnZbZg(1, true);
    foreach ($pZsaTnZbZgIdAry as $key => $tnzbzg) {
      $dbwZsaTnZbZg->deleteTnZbZg($pZsaTnZbZgIdAry[$key]);
    }

    return true;
  }

  
  protected static function _deleteZsaTnZbZgReplikat($pZsaTnZbZgIdAry)
  {
    $dbwZsaZsaTnZbZg = new DBWorkZsaTnZbZg(1, true);
    foreach ($pZsaTnZbZgIdAry as $key => $tnzbzg) {
      $dbwZsaZsaTnZbZg->deleteTnZbZg($pZsaTnZbZgIdAry[$key]);
    }

    return true;
  }

  
  private static function _deleteZsaTnZbZgDmz($pZsaTnZbZgIdAry)
  {
    try {
      static::_deleteZsaTnZbZgDirekt($pZsaTnZbZgIdAry);

      $message = new XMLNode('tnzbzgs');
      foreach ($pZsaTnZbZgIdAry as $zsaTnZbZgId) {
        $zsaTnZbZgNode = new XMLNode('tnzbzg');
        $zsaTnZbZgNode->addChild(new XMLNode('id', $zsaTnZbZgId));
        $message->addChild($zsaTnZbZgNode);
      }
      static::_sendeDmz(AbgleichAPI::ABGLEICH_ZSA_TNZBZG_DELETE, new Nutzlast($message));

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

      return false;
    }
  }
}