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

namespace Kufer\Web\KuferTools\Utils\Dozent;

use Kufer\Web\Classes\Datamodul\SammelvertragDatDoc;
use Kufer\Web\Classes\Identifier\Identifier;

class SammelVertraegeUtils
{
  protected function __construct()
  {
  }

  
  public const STATUS_SAMMELVERTRAEGE_ALL = 0;

  
  public const STATUS_SAMMELVERTRAEGE_OPEN = 1;

  
  public const STATUS_SAMMELVERTRAEGE_OLD = 2;

  
  public static function getSammelvertraege(Identifier $dozId, int $status, bool $oldVertragPartOfNew)
  {
    $body = new class() extends \Datamodul {
      public $dozent_id;
      public $dozent_guid;
      public $status;
      public $old_vertrag_part_of_new;
    };

    $body->dozent_id = $dozId->getId();
    $body->dozent_guid = (string)$dozId->getGuid();
    $body->status = $status;
    $body->old_vertrag_part_of_new = $oldVertragPartOfNew ? 1 : 0;

    $nutzlast = new \Nutzlast(\XMLNode::getXMLNode($body, 'sammelvertraege', array(), true));

    try {
      $abgleichApi = new \AbgleichAPI();
      $msg = $abgleichApi->sendeNachricht(\AbgleichAPI::ABGLEICH_SAMMELVERTRAGE_FOR_DOZENT, $nutzlast);
      $ary = \JsonOperations::decodeJustString($msg->reason);
      assert(is_array($ary));

      return array_map(array(static::class, 'toSammelvertrag'), $ary);
    } catch (\AbgleichApiException $ex) {
      \Logger::loggException($ex, 40);

      return false;
    }
  }

  
  public static function getSammelVertrag(Identifier $dozId, int $datDocVertrag, bool $oldVertragPartOfNew): ?SammelvertragDatDoc
  {
    $body = new class() extends \Datamodul {
      public $dozent_id;
      public $dozent_guid;
      public $dat_doc_id;
      public $old_vertrag_part_of_new;
    };

    $body->dozent_id = $dozId->getId();
    $body->dozent_guid = (string)$dozId->getGuid();
    $body->dat_doc_id = $datDocVertrag;
    $body->old_vertrag_part_of_new = $oldVertragPartOfNew ? 1 : 0;

    $nutzlast = new \Nutzlast(\XMLNode::getXMLNode($body, 'sammelvertraege', array(), true));
    try {
      $abgleichApi = new \AbgleichAPI();
      $msg = $abgleichApi->sendeNachricht(\AbgleichAPI::ABGLEICH_GET_SAMMELVERTRAG, $nutzlast);
      $obj = \JsonOperations::decodeJustString($msg->reason);
      assert(is_object($obj));

      return static::toSammelvertrag($obj);
    } catch (\AbgleichApiException $ex) {
      \Logger::loggException($ex, 40);

      return null;
    }
  }

  
  public static function acceptSammelvertrag(Identifier $dozId, int $datDocVertrag, array $kursIds, bool $oldVertragPartOfNew): bool
  {
    return static::acceptOrDenySammelVertrag($dozId, $datDocVertrag, true, $kursIds, $oldVertragPartOfNew);
  }

  
  public static function denySammelVertrag(Identifier $dozId, int $datDocVertrag, array $kursIds, bool $oldVertragPartOfNew): bool
  {
    return static::acceptOrDenySammelVertrag($dozId, $datDocVertrag, false, $kursIds, $oldVertragPartOfNew);
  }

  
  private static function acceptOrDenySammelVertrag(
    Identifier $dozId,
    int $datDocVertrag,
    bool $acceptOrReject,
    array $kursIds,
    bool $oldVertragPartOfNew
  ): bool {
    $body = new class() extends \Datamodul {
      public $dozent_id;
      public $dozent_guid;
      public $dat_doc_id;
      public $accept_or_reject;
      public $kurs_ids;
      public $old_vertrag_part_of_new;
    };

    $body->dozent_id = $dozId->getId();
    $body->dozent_guid = (string)$dozId->getGuid();
    $body->dat_doc_id = $datDocVertrag;
    $body->accept_or_reject = $acceptOrReject ? 1 : 0;
    $body->kurs_ids = implode(':', $kursIds);
    $body->old_vertrag_part_of_new = $oldVertragPartOfNew ? 1 : 0;

    $nutzlast = new \Nutzlast(\XMLNode::getXMLNode($body, 'sammelvertraege', array(), true));

    try {
      $abgleichApi = new \AbgleichAPI();
      $abgleichApi->sendeNachricht(\AbgleichAPI::ABGLEICH_ACCEPT_OR_REJECT_SAMMELVERTRAG, $nutzlast);

      return true;
    } catch (\AbgleichApiException $ex) {
      \Logger::loggException($ex, 40);

      return false;
    }
  }

  private static function toSammelvertrag(object $obj): SammelvertragDatDoc
  {
    $result = new SammelvertragDatDoc();
    $result->id = $obj->dat_doc_ids;
    assert(is_array($result->id));
    $result->beschreibung = $obj->beschreibung;
    $result->kursIds = $obj->kurs_ids;
    assert(is_array($result->kursIds));
    $result->erfasstam = $obj->erfasstam;
    $result->erfasstvon = $obj->erfasstvon;
    $result->akzeptiertKursIds = $obj->akzeptiert_kurs_ids;
    assert(is_array($result->akzeptiertKursIds));
    $result->abgelehntKursIds = $obj->abgelehnt_kurs_ids;
    assert(is_array($result->abgelehntKursIds));
    $result->dozentId = $obj->dozent_id;
    assert(is_int($result->dozentId));
    $result->akzeptiertAm = \DateTimeOperations::getValidDateTimeString($obj->akzeptiert_am);
    if (\DateTimeOperations::isDateTimeEmptyOrDefault($result->akzeptiertAm)) {
      $result->akzeptiertAm = '';
    }
    $result->abgelehntAm = \DateTimeOperations::getValidDateTimeString($obj->abgelehnt_am);
    if (\DateTimeOperations::isDateTimeEmptyOrDefault($result->abgelehntAm)) {
      $result->abgelehntAm = '';
    }

    return $result;
  }
}