<?php

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

class FachVertragAPI
{
  public static function getFachVertragsInformationen($pDozNr, $pVonDatum)
  {
    $allgsettings = AllgSettingsAPI::getAllgSettings();
    if (SessionOperations::isReplikat() && $allgsettings->dmzEnabled) {
      return self::_getInfosFromDmz($pDozNr, $pVonDatum);
    } else {
      return self::_getInfosAusDb($pDozNr, $pVonDatum);
    }
  }

  private static function _getInfosFromDmz($pDozNr, $pVonDatum)
  {
    $resultJson = self::_sendeNachrichtAnDmz($pDozNr, $pVonDatum);
    $resultObj = JsonOperations::getFromString($resultJson);

    return self::_getReturnObj(
      self::_getDozKurseFromResult($resultObj),
      self::_getKurseFromResult($resultObj),
      self::_getDeputateFromResult($resultObj)
    );
  }

  private static function _getDozKurseFromResult($resultObj)
  {
    $result = array();
    foreach ($resultObj->DozKurse as $dozKursInfo) {
      $dozKurs = new DozKurs();
      $dozKurs->id = $dozKursInfo->Id;
      $dozKurs->kurs = $dozKursInfo->Kurs;
      $dozKurs->dozent = $dozKursInfo->Dozent;
      $result[] = $dozKurs;
    }

    return $result;
  }

  private static function _getReturnObj($pDozKurse, $pKurse, $pDeputate)
  {
    $data = new StdClass();
    $data->dozKurse = $pDozKurse;
    $data->kurse = $pKurse;
    $data->deputate = $pDeputate;

    return $data;
  }

  public static function getEmptyFachVertragsInformationen()
  {
    return self::_getReturnObj(array(), array(), array());
  }

  private static function _getKurseFromResult($resultObj)
  {
    $result = array();
    foreach ($resultObj->Kurse as $kursInfo) {
      $kurs = new Kurs();
      $kurs->id = $kursInfo->Nr;
      $kurs->kurzbez = $kursInfo->Kurzbez;
      $result[] = $kurs;
    }

    return $result;
  }

  private static function _getDeputateFromResult($resultObj)
  {
    $result = array();
    foreach ($resultObj->Deputate as $deputatInfo) {
      $deputat = new Deputat();
      $deputat->id = $deputatInfo->Id;
      $deputat->titel = $deputatInfo->Titel;
      $deputat->doz_kurs_id = $deputatInfo->DozKursId;
      $deputat->vertrdruck = $deputatInfo->VertrDruck;
      $deputat->druckdat = $deputatInfo->DruckDat;
      $deputat->zurueck = $deputatInfo->Zurueck;
      $deputat->zurueckvon = $deputatInfo->ZurueckVon;
      $deputat->reklamation_dat = $deputatInfo->ReklamationDat;
      $deputat->reklamation_von = $deputatInfo->ReklamationVon;
      $deputat->freigegeben = $deputatInfo->Freigegeben;
      $deputat->freigegebenvon = $deputatInfo->FreigegebenVon;
      $deputat->reklamation_grund = $deputatInfo->ReklamationGrund;
      $result[] = $deputat;
    }

    return $result;
  }

  private static function _sendeNachrichtAnDmz($pDozNr, $pVonDatum)
  {
    $root = new XMLNode('dozent');
    $dnr = new XMLNode('nr', $pDozNr);
    $root->addChild($dnr);

    if (DateTimeOperations::isValidDate($pVonDatum)) {
      $datumVon = new XMLNode('datum_von', $pVonDatum);
      $root->addChild($datumVon);
    }

    $abgleichApi = new AbgleichAPI();
    $result = $abgleichApi->sendeNachricht(
      AbgleichAPI::ABGLEICH_GET_FACHINFOS_DOZENT,
      new Nutzlast($root)
    );

    return $result->reason;
  }

  private static function _getInfosAusDb($pDozNr, $pVonDatum)
  {
    $dozKurse = self::_getDozKurse4Dozent($pDozNr);
    $kurse = self::_getKurse4DozKurse($dozKurse);
    $deputate = self::_getDeputate4DozKurse($dozKurse, $pVonDatum);

    return self::_getReturnObj(
      $dozKurse,
      $kurse,
      $deputate
    );
  }

  private static function _getDozKurse4Dozent($pDozNr)
  {
    $dbwDozKurs = new DBWorkDozKurs(1, true);

    return $dbwDozKurs->getByDozNr($pDozNr);
  }

  private static function _getKurse4DozKurse($pDozKurse)
  {
    $kursnummern = ArrayOperations::mapAttribut($pDozKurse, 'kurs');
    $dbwKurse = new DBWorkKurseWT(1, true);

    return $dbwKurse->getKurse($kursnummern);
  }

  private static function _getDeputate4DozKurse($pDozKurse, $pVonDatum)
  {
    $dozKursIds = ArrayOperations::mapAttribut($pDozKurse, 'id');
    $dbwDeputat = new DBWorkDeputat(1, true);
    if (DateTimeOperations::isValidDate($pVonDatum)) {
      $dbwDeputat->newSearch();
      $dbwDeputat->fromobject->druckdat = $pVonDatum;
    }

    return $dbwDeputat->getByDozKursIds($dozKursIds);
  }
}