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

namespace Kufer\Web\Classes\Api;

use Kufer\Web\Classes\Addfunctions\Guid;
use Kufer\Web\Classes\Datamodul\DmzVorgesetzteGenemigtBelegung;
use Kufer\Web\Classes\Identifier\Identifier;

class VorgesetzterGenemigtBelegungAPI
{
  private function __construct()
  {
  }

  
  public static function getVorgesetzteZuBelegung(int $belegId): ?array
  {
    try {
      $vgb = new DmzVorgesetzteGenemigtBelegung();
      $vgb->belegung_id = $belegId;
      $child = \XMLNode::getXMLNode($vgb, 'vorgesetztergenemigtbelegung', array(), true);

      $abgleichAPI = new \AbgleichAPI();
      $msg = $abgleichAPI->sendeNachricht(\AbgleichAPI::ABGLEICH_GET_VORGESETZTE_ZU_BELEGUNG, new \Nutzlast($child));

      return static::parseResult($msg->reason);
    } catch (\AbgleichApiException $aae) {
      \Logger::logg('get vorgesetzter_genemigt_belegung - Fehler: ' . $aae->getMessage() . "\n" . ' [' . $aae->getTraceAsString() . ']', 200);

      return null;
    }
  }

  
  public static function getVorgesetzteZuBelegungenAndVorgesetzten(array $belegungenIds, Identifier $vorgesetzterId): ?array
  {
    try {
      $vgb = new class() extends \Datamodul {
        public $vorgesetzter_id;
        public $vorgesetzter_guid;

        public function getTyp($pFieldName)
        {
          switch ($pFieldName) {
            default: return parent::getTyp($pFieldName);
            case 'vorgesetzter_id': return \DatamodulVarType::TYPE_INT;
            case 'vorgesetzter_guid': return \DatamodulVarType::TYPE_GUID;
          }
        }
      };
      $vgb->vorgesetzter_id = $vorgesetzterId->getId();
      $vgb->vorgesetzter_guid = $vorgesetzterId->getGuid();

      $child = \XMLNode::getXMLNode($vgb, 'vorgesetztergenemigtbelegung', array(), true);
      foreach ($belegungenIds as $belegungId) {
        $child->addChild(new \XMLNode('belegungen', $belegungId));
      }

      $abgleichAPI = new \AbgleichAPI();
      $msg = $abgleichAPI->sendeNachricht(\AbgleichAPI::ABGLEICH_GET_VORGESETZTE_ZU_VORGESETZTEN_AND_BELEGUNG, new \Nutzlast($child));

      return static::parseResult($msg->reason);
    } catch (\AbgleichApiException $aae) {
      \Logger::logg('get vorgesetzter_genemigt_belegung - Fehler: ' . $aae->getMessage() . "\n" . ' [' . $aae->getTraceAsString() . ']', 200);

      return null;
    }
  }

  
  public static function insert(array $vorgesetzteGenemigenBelegungen): bool
  {
    try {
      $root = new \XMLNode('vorgesetztegenemigenbelegungen');

      foreach ($vorgesetzteGenemigenBelegungen as $vgb) {
        if (\DateTimeOperations::isDateTimeEmptyOrDefault($vgb->erstelltam)) {
          
          $vgb->erstelltam = \DateTimeOperations::getDateTimeNowExact();
        }

        $child = \XMLNode::getXMLNode($vgb, 'vorgesetztergenemigtbelegung', array(), true);
        $root->addChild($child);
      }

      $abgleichAPI = new \AbgleichAPI();
      $abgleichAPI->sendeNachricht(\AbgleichAPI::ABGLEICH_INSERT_VORGESETZTER_ZU_BELEGUNG, new \Nutzlast($root));

      return true;
    } catch (\AbgleichApiException $aae) {
      \Logger::logg('insert vorgesetzter_genemigt_belegung - Fehler: ' . $aae->getMessage() . "\n" . ' [' . $aae->getTraceAsString() . ']', 200);

      return false;
    }
  }

  
  private static function parseResult(string $jsonMsg): array
  {
    $ary = \JsonOperations::decode($jsonMsg, false, 3);
    $result = array();
    foreach ($ary as $e) {
      $vgb = new DmzVorgesetzteGenemigtBelegung();
      $vgb->id = (int)$e->Id;
      $vgb->vorgesetzter_id = (int)$e->VorgesetzterId;
      $vgb->vorgesetzter_guid = empty($e->VorgesetzterGuid) ? null : new Guid($e->VorgesetzterGuid);
      $vgb->belegung_id = (int)$e->BelegungId;
      $vgb->genemigt = (bool)$e->Genemigt;
      $vgb->erstelltam = $e->ErstelltAm;
      $result[] = $vgb;
    }

    return $result;
  }
}