<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */

class ZsaBkBvTnAPI
{
  private function __constuct()
  {
  }

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

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

  
  public static function insertZsaBkBvTn($pZsaBkBvTnAry)
  {
    $allgsettings = AllgSettingsAPI::getAllgSettings();
    if (SessionOperations::isReplikat()) {
      if ($allgsettings->dmzEnabled) {
        return static::_insertZsaBkBvTnDmz($pZsaBkBvTnAry);
      } else {
        return static::_insertZsaBkBvTnReplikat($pZsaBkBvTnAry);
      }
    } else {
      return static::_insertZsaBkBvTnDirekt($pZsaBkBvTnAry);
    }
  }

  
  protected static function _insertZsaBkBvTnDirekt($pZsaBkBvTnAry)
  {
    foreach ($pZsaBkBvTnAry as $key => $bkbvtn) {
      self::_insertOrUpdateBkBvTn($pZsaBkBvTnAry[$key]);
    }

    return true;
  }

  
  protected static function _insertZsaBkBvTnReplikat($pZsaBkBvTnAry)
  {
    foreach ($pZsaBkBvTnAry as $key => $bkbvtn) {
      self::_insertOrUpdateBkBvTn($pZsaBkBvTnAry[$key]);
    }

    return true;
  }

  
  protected static function _insertOrUpdateBkBvTn($bkbvtn)
  {
    $dbwBkBvTn = new DBWorkZsaBkBvTn(1, true);
    $dbwBkBvTn->newSearch();
    $dbwBkBvTn->fromobject->tnr = $bkbvtn->tnr;
    $dbwBkBvTn->fromobject->typ = $bkbvtn->typ;
    $dbwBkBvTn->fromobject->ds = $bkbvtn->ds;
    $dbwBkBvTn->fromobject->zb = $bkbvtn->zb;
    $bkbvtnSQL = $dbwBkBvTn->getByFilter();

    if (count($bkbvtnSQL) > 0) {
      $bkbvtn->id = $bkbvtnSQL[0]->id;
      $dbwBkBvTn->updateBkBvTn($bkbvtn);
    } else {
      $dbwBkBvTn->insertBkBvTn($bkbvtn);
    }
  }

  
  private static function _insertZsaBkBvTnDmz($pZsaBkBvTnAry)
  {
    try {
      
      static::_insertZsaBkBvTnDirekt($pZsaBkBvTnAry); 
      $message = new XMLNode('bkbvtns');

      foreach ($pZsaBkBvTnAry as $bkbvtn) {
        $zsaBkBvTnNode = XMLNode::getXMLNode($bkbvtn, 'bkbvtn', array('teilnehmer', 'dienststelle', 'zielbereich'), true);
        $message->addChild($zsaBkBvTnNode);
      }

      static::_sendeDmz(AbgleichAPI::ABGLEICH_ZSA_BKBVTN_INSERT, new Nutzlast($message));

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

      return false;
    }
  }

  
  public static function updateZsaBkBvTn($pZsaBkBvTn, $pOrigBkBvTn)
  {
    $allgsettings = AllgSettingsAPI::getAllgSettings();
    if (SessionOperations::isReplikat()) {
      if ($allgsettings->dmzEnabled) {
        return static::_updateZsaBkBvTnDmz($pZsaBkBvTn, $pOrigBkBvTn);
      } else {
        return static::_updateZsaBkBvTnReplikat($pZsaBkBvTn);
      }
    } else {
      return static::_updateZsaBkBvTnDirekt($pZsaBkBvTn);
    }
  }

  
  protected static function _updateZsaBkBvTnDirekt($pZsaBkBvTn)
  {
    $dbwZsaBkBvtn = new DBWorkZsaBkBvTn(1, true);
    $dbwZsaBkBvtn->updateBkBvTn($pZsaBkBvTn);

    return true;
  }

  
  protected static function _updateZsaBkBvTnReplikat($pZsaBkBvTn)
  {
    $dbwZsaBkBvtn = new DBWorkZsaBkBvTn(1, true);
    $dbwZsaBkBvtn->updateBkBvTn($pZsaBkBvTn);

    return true;
  }

  
  private static function _updateZsaBkBvTnDmz($pZsaBkBvTn, $pOrigBkBvtn)
  {
    try {
      $zuUebertragendeFelder = $pOrigBkBvtn->getDiffFields($pZsaBkBvTn, true);
      $zuUebertragendeFelder[] = 'id';

      $zsaBkBvTnNode = XMLNode::getXmlNodeOnlySpecificFields($pZsaBkBvTn, 'bkbvtn', $zuUebertragendeFelder, true);
      $origZsaBkBvTnNode = XMLNode::getXmlNodeOnlySpecificFields($pOrigBkBvtn, 'oldobject', $zuUebertragendeFelder, true);

      $zsaBkBvTnNode->addChild($origZsaBkBvTnNode);
      $message = new XMLNode('bkbvtns');
      $message->addChild($zsaBkBvTnNode);
      static::_sendeDmz(
        AbgleichAPI::ABGLEICH_ZSA_BKBVTN_BEARBEITEN,
        new Nutzlast($message)
      );
      static::_updateZsaBkBvTnDirekt($pZsaBkBvTn);

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

      return false;
    }
  }

  public static function getAllowedStatusTransitions4Bv($status)
  {
    switch ($status) {
      default:
      case '':
      case 'I': 
        return array('A', 'N');
      case 'A': 
        return array('S');
      case 'P': 
        return array('A', 'S');
      case 'J': 
        return array('S');
      case 'N': 
        return array();
      case 'S': 
        return array();
    }
  }

  public static function getStatusBezeichnung($status)
  {
    switch ($status) {
      default: 
      case '':
      case 'I':
        return 'interessiert';
      case 'A':
        return 'aktiv';
      case 'P':
        return 'pausiert';
      case 'J':
        return 'angenommen';
      case 'N':
        return 'abgelehnt';
      case 'S':
        return 'ausgeschieden';
    }
  }

  public static function getAlleStatus()
  {
    $statusAry = array('I', 'N', 'A', 'S');

    return array_map(function($statusKuerzel) {
      $status = new \stdClass();
      $status->status = $statusKuerzel;
      $status->bezeichnung = self::getStatusBezeichnung($statusKuerzel);

      return $status;
    }, $statusAry);
  }
}