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

namespace Kufer\KuferTools\Utils\Ummelden;

class UmmeldenDMZ extends Ummelden
{
  protected function doUmmeldung($belegungsArray, $zielKursNr)
  {
    $belegungsArrayForDMZ = $this->buildBelegungsArrayForDMZ($belegungsArray);
    $ummeldenDmzHelper = new UmmeldenDMZHelper();
    try {
      $abgleichResult = $ummeldenDmzHelper->ummeldenDMZ($belegungsArrayForDMZ, $zielKursNr);
    } catch (\AbgleichApiException $e) {
      $ummeldenStatus = new UmmeldenStatus();
      $ummeldenStatus->fatalError = true;

      return $ummeldenStatus;
    }
    $resultArray = json_decode($abgleichResult->reason, true);

    return $this->getUmmeldenStatusObjFromResultArray($resultArray, $belegungsArray);
  }

  private function getUmmeldenStatusObjFromResultArray($dmzResult, $belegungsArray)
  {
    $ummeldenStatus = new UmmeldenStatus();
    $belegungsArrayById = \ArrayOperations::setAttributAsKey($belegungsArray, 'id');
    foreach ($dmzResult as $result) {
      if ($result['Success']) {
        $ummeldenStatus->successStatus[] = $belegungsArrayById[$result['Belid']];
      } else {
        $ummeldenStatus->errorStatus[] = $belegungsArrayById[$result['Belid']];
      }
    }

    return $ummeldenStatus;
  }

  private function buildBelegungsArrayForDMZ($belegungsArray)
  {
    $belegungsArrayForDMZ = array();
    foreach ($belegungsArray as $belegung) {
      $austritt = $belegung->austritt ?? null;
      $belArray = array(
          'id' => $belegung->id,
          'tnr' => $belegung->tnr,
          'knr' => $belegung->knr,
          'name_vorname' => $belegung->teilnehmer->name . ', ' . $belegung->teilnehmer->vorname,
          'eintritt' => $belegung->eintritt,
          'austritt' => $austritt);
      $belegungsArrayForDMZ[] = $belArray;
    }

    return $belegungsArrayForDMZ;
  }

  protected function getHindernisGruende($belegung, $zielKursNr)
  {
    try {
      $result = \BelegungAPI::getBelegungsinformationen($belegung->id);
    } catch (\Exception $e) {
      \Logger::logg('Technischer Fehler beim Validieren der Belegung, Exception: ' . $e, 110);

      return array(\Kufer\KuferTools\Utils\HindernisGruende\HindernisGruende::ABGLEICH_TECHNISCHER_FEHLER);
    }
    $dmzResponseArray = json_decode($result->reason, true);
    $hindernisgruendeHelper = new \Kufer\KuferTools\Utils\HindernisGruende\HindernisGruendeDMZ($dmzResponseArray);
    $belegungFromDB = $this->dbwBelegung->getBelegung($belegung->id);

    return $hindernisgruendeHelper->getHindernisGruende($belegungFromDB, $zielKursNr);
  }
}