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

namespace Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage;

use Kufer\Web\Classes\dbfilter\HLMandantenSQLFilter;
use Kufer\Web\KuferTools\Utils\Dozent\TerminDirectAbrechnenUtils;

class DozentenKurstage extends KursTageHelper
{
  protected function getKurstageIds($dbwKurseTage)
  {
    return $dbwKurseTage->getKurstageIds();
  }

  public function getDatamoduleByIds($pIds, $resetCache = false)
  {
    
    static $kurstage = array();
    if ($resetCache) {
      $kurstage = array();
    }

    $key = implode(',', $pIds);
    if (!isset($kurstage[$key])) {
      $dbwKurseTage = $this->getDBWork();
      $kurstageAry = $dbwKurseTage->getKurseTageByIds($pIds);
      $kurstageAry = self::erweitereKurstageUmRechnungsstatus($kurstageAry, $this->user);
      $kurstage[$key] = $kurstageAry;
    }

    return $kurstage[$key];
  }

  public static function determineIfShouldCheckAnwesenheiten(\ToolKurseDozentSettings $toolSettings, \Kurs $kurs): bool
  {
    if (\DBWorkBASysSettings::isMoenchengladBildungswerk()) {
      $mandatIds = explode(':', $toolSettings->moenchengladBildungswerkCheckAnwesenheiten);

      return in_array($kurs->mandant, $mandatIds);
    }

    return false;
  }

  
  public static function erweitereKurstageUmRechnungsstatus($kurstage, $user, bool $checkAnwesenheiten = false)
  {
    if (\DBWorkBASysSettings::isMVHS()
      || \DBWorkBASysSettings::isBergischeVhs()
      || \DBWorkBASysSettings::isNeussVhs()
      || \DBWorkBASysSettings::isMoenchengladBildungswerk()
      || TerminDirectAbrechnenUtils::hasAccessToTerminDirectAbrechnen()) {
      try {
        $eigeneKurstage = \array_filter($kurstage, function($kurstag) use ($user) {
          return $kurstag->dnr == $user->dnr;
        });
        $ktIds = \ArrayOperations::mapAttribut($eigeneKurstage, 'id');
        $ktStatusMap = self::getRechnungsStatus($ktIds, $checkAnwesenheiten);

        $honDetails = array();
        if (\DBWorkBASysSettings::isBergischeVhs() || TerminDirectAbrechnenUtils::hasAccessToTerminDirectAbrechnen()) {
          if (!empty($eigeneKurstage)) {
            $honDetails = \ArrayOperations::setAttributAsKeyArray(\DozKursAPI::getVertragInfos($user->dnr, \ArrayOperations::firstValue($eigeneKurstage)->knr, $eigeneKurstage)->HonDetailInfos, 'KurstagId');
          }
        }

        foreach ($kurstage as $kurstag) {
          if (isset($ktStatusMap[$kurstag->id])) {
            $kurstag->rechnungStatus = $ktStatusMap[$kurstag->id];
          }
          if (isset($honDetails[$kurstag->id])) {
            $kurstag->vertragHonDetails = $honDetails[$kurstag->id];
            list($betrag, $honorar, $fahrtkosten) = \DozKursAPI::summarizeHonorarDetails($kurstag->vertragHonDetails);

            $kurstag->hd_betrag = \MathOperations::floatToString($betrag);
            $kurstag->hd_honorar = \MathOperations::floatToString($honorar);
            $kurstag->hd_fahrtkosten = \MathOperations::floatToString($fahrtkosten);
          }

          unset($kurstag);
        }
      } catch (\Exception $e) {
        \Logger::logg('ABGLEICH_GET_KURSTAGE_RECHNUNGSSTATUS: Fehler beim Ermitteln des Status: ' . $e->getMessage(), 200);
      }
    }

    return $kurstage;
  }

  
  private static function getRechnungsStatus($ktIds, bool $checkAnwesenheiten = false)
  {
    if (empty($ktIds)) {
      return array();
    }

    $root = new \XMLNode('kurstage');
    if (\DBWorkBASysSettings::isMVHS()) {
      $root->addChild(new \XMLNode('is_mvhs', 1));
    } elseif (\DBWorkBASysSettings::isBergischeVhs()) {
      $root->addChild(new \XMLNode('is_bergische_vhs', 1));
    } elseif (TerminDirectAbrechnenUtils::hasAccessToTerminDirectAbrechnen()) {
      $root->addChild(new \XMLNode('is_termin_direct_abrechnen', 1));
    } elseif (\DBWorkBASysSettings::isNeussVhs()) {
      $root->addChild(new \XMLNode('is_neuss_vhs', 1));
    } elseif (\DBWorkBASysSettings::isMoenchengladBildungswerk()) {
      $root->addChild(new \XMLNode('is_moenchenglad_bildungswerk', 1));
      if (\DBWorkHLMandant::getDefaultInstance()->existsByFilter(HLMandantenSQLFilter::create())) {
        $root->addChild(new \XMLNode('check_anwesenheiten', $checkAnwesenheiten ? 1 : 0));
      } else {
        $root->addChild(new \XMLNode('check_anwesenheiten', 1));
      }
    } else {
      $root->addChild(new \XMLNode('check_anwesenheiten', $checkAnwesenheiten ? 1 : 0));
    }

    foreach ($ktIds as $ktId) {
      $ktNode = new \XMLNode('kurstag');
      $ktNode->addChild(new \XMLNode('id', $ktId));
      $root->addChild($ktNode);
    }
    $abgleichApi = new \AbgleichAPI();
    $result = $abgleichApi->sendeNachricht(
      \AbgleichAPI::ABGLEICH_GET_KURSTAGE_RECHNUNGSSTATUS,
      new \Nutzlast($root)
    );

    
    $ktStatusArray = \JsonOperations::getFromString($result->reason);

    $ktStatusMap = array();
    foreach ($ktStatusArray as $ktStatus) {
      $ktStatusMap[$ktStatus->Key] = $ktStatus->Value;
    }

    return $ktStatusMap;
  }

  protected function setzeEinstellungen($dbwKurseTage)
  {
    $dbwKurseTage = parent::setzeEinstellungen($dbwKurseTage);
    $dbwKurseTage->toobject->nodoztool = true;

    return $dbwKurseTage;
  }
}