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


class WeitermeldungAPI
{
  
  public static function getWeitermeldecodeFromDmz(string $code): Weitermeldecode
  {
    return self::getFromDmz(new \XMLNode('code', $code));
  }

  
  public static function getWeitermeldecodeFromDmzById(int $id): Weitermeldecode
  {
    return self::getFromDmz(new \XMLNode('id', $id));
  }

  
  private static function getFromDmz(\XMLNode $dataValue): Weitermeldecode
  {
    $abgleichApi = new \AbgleichAPI();
    $data = new \XMLNode('data');
    $data->addChild($dataValue);
    $result = $abgleichApi->sendeNachricht(
      \AbgleichAPI::ABGLEICH_GET_WEITERMELDECODE,
      new \Nutzlast($data)
    );
    $dmzDatamodul = JsonOperations::getFromString($result->reason);

    return Weitermeldecode::fromDmzValues($dmzDatamodul);
  }

  
  public static function getKinderTnrForWeitermeldecode(Weitermeldecode $weitermeldecode): array
  {
    $abgleichApi = new \AbgleichAPI();
    $data = new \XMLNode('data');
    $data->addChild(new \XMLNode('knr', $weitermeldecode->knr));
    $data->addChild(new \XMLNode('tnr', $weitermeldecode->tnr));
    $result = $abgleichApi->sendeNachricht(
      \AbgleichAPI::ABGLEICH_GET_KINDER_FOR_TN_FROM_KURS,
      new \Nutzlast($data)
    );

    return array_map('intval', JsonOperations::getFromString($result->reason));
  }

  
  public static function getPlatzreservierungenForKinderWeitermeldung(Weitermeldecode $weitermeldecode): array
  {
    $abgleichAPI = new AbgleichAPI();
    $message = new XMLNode('belegung');
    $message->addChild(new XMLNode('status', 'P'));
    $message->addChild(new XMLNode('tnr', $weitermeldecode->tnr));
    $message->addChild(new XMLNode('knr', $weitermeldecode->knr_nachfolgekurs));
    $message->addChild(new XMLNode('includekinderanmeldungen', 1));

    $nutzlast = new Nutzlast($message);
    $nutzlast->addNode(new XMLNode('nomapping', 'W'));

    $result = $abgleichAPI->sendeNachricht(
      AbgleichAPI::ABGLEICH_GET_BELEGUNGEN_FOR_TEILNEHMER,
      $nutzlast
    );

    $resultList = JsonOperations::getFromString($result->reason);
    $belegungIds = array();
    foreach ($resultList as $belegung) {
      $belegungIds[] = $belegung->Belid;
    }

    return $belegungIds;
  }

  
  public static function deletePlatzreservierungen(\Kurs $nachfolgekurs, \Weitermeldecode $weitermeldecode): void
  {
    $abgleichAPI = new AbgleichAPI();
    $message = new XMLNode('belegungen');

    if (isset($nachfolgekurs->typ) && ($nachfolgekurs->typ == 'L' || $nachfolgekurs->typ == 'K')) {
      
      $belegungsIds = self::getPlatzreservierungenForKinderWeitermeldung($weitermeldecode);
    } else {
      $belegungsIds = array($weitermeldecode->belegid_nachfolgekurs);
    }

    if (!empty($belegungsIds)) {
      foreach ($belegungsIds as $belegungId) {
        $belegungNode = new XMLNode('belegung');
        $belegungNode->addChild(new XMLNode('correctmode', 'delete'));
        $belegungNode->addChild(new XMLNode('id', $belegungId));
        $message->addChild($belegungNode);
      }

      $operation = AbgleichAPI::ABGLEICH_BELEGUNGDELETE;
      $abgleichAPI->sendeNachricht($operation, new Nutzlast($message), null, true);
    }
  }

  
  public static function setWeitermeldecodeEingeloest(string $code): void
  {
    try {
      $abgleichApi = new \AbgleichAPI();
      $data = new \XMLNode('data');
      $data->addChild(new \XMLNode('code', $code));
      $abgleichApi->sendeNachricht(
        \AbgleichAPI::ABGLEICH_WEITERMELDECODE_EINGELOEST,
        new \Nutzlast($data)
      );
    } catch (Exception $e) {
      Logger::logg(
        "Fehler beim Löschen der Platzreservierung für den Code '$code': " . $e->getMessage(),
        5123
      );
    }
  }

  public static function isWeitermeldenActive(): bool
  {
    return \SessionOperations::getVarValueWeitermelden('active', '0') === '1';
  }
}