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


class GebuehrenBerechnungsFunctions
{
  public static function getGebuehrenSumme(KursgebuehrBerechnungsKontextLader $kgebBerLoader): float {
    $berechnung = self::getGebuehrenBerechnungStandard($kgebBerLoader);
    return $berechnung->berechneGebuehrenSumme();
  }

  public static function getGebuehrenSummeNichtErmaessigt(KursgebuehrBerechnungsKontextLader $kgebBerLoader): float {
    $berechnung = self::getGebuehrenBerechnungStandard($kgebBerLoader);
    $berechnung->accept(new GebuehrenBerechnungsVisitorEntferneErmaessigung());
    return $berechnung->berechneGebuehrenSumme();
  }

  public static function getGebuehrenByKurs(KursgebuehrBerechnungsKontextLader $kgebBerLoader): array {
    $berechnung = self::getGebuehrenBerechnungStandard($kgebBerLoader);
    return $berechnung->berechneGebuehrenByKurs();
  }

  public static function getGebuehrenForKurs(string $knr, KursgebuehrBerechnungsKontextLader $kgebBerLoader): array {
    $berechnung = self::getGebuehrenBerechnungStandard($kgebBerLoader);
    return $berechnung->berechneGebuehrenForKurs($knr);
  }

  public static function getGebuehrenSaetzeForKurs(string $knr, KursgebuehrBerechnungsKontextLader $kgebBerLoader): array {
    $berechnung = self::getGebuehrenBerechnungStandard($kgebBerLoader);
    return $berechnung->getGebuehrenSaetze($knr);
  }

  public static function getGebuehrenBerechnungStandard(KursgebuehrBerechnungsKontextLader $kgebBerLoader): GebuehrenBerechnung {
    $berechnung = self::setupGebuehrenBerechnung($kgebBerLoader);
    self::entferneUngueltigeErmaessigungen($berechnung, $kgebBerLoader);

    $settings = ToolSettingsAPI::getToolSettings(4);
    if(!$settings->zahlplanberuecksichtigen) {
      $berechnung->accept(new GebuehrenBerechnungsVisitorEntferneZahlplan());
    }
    return $berechnung;
  }

  private static function entferneUngueltigeErmaessigungen(
    GebuehrenBerechnung $berechnung,
    KursgebuehrBerechnungsKontextLader $kgebBerLoader
  ): void {
    foreach($kgebBerLoader->load() as $kgebBerKontext) {
      $ermValErsterTn = new ErmaessigungsValidatorErsterTn(); 
      if(!$ermValErsterTn->validate($kgebBerKontext)) {
        $berechnung->accept(new GebuehrenBerechnungsVisitorEntferneErmaessigungErsterTn($kgebBerKontext->knr));
      }

      $ermValWeitereTn = new ErmaessigungsValidatorWeitereTn(); 
      if(!$ermValWeitereTn->validate($kgebBerKontext)) {
        $berechnung->accept(new GebuehrenBerechnungsVisitorEntferneErmaessigungWeitereTn($kgebBerKontext->knr));
      }
    }
  }

  private static function setupGebuehrenBerechnung(KursgebuehrBerechnungsKontextLader $kgebBerLoader): GebuehrenBerechnung {
    $berechnung = new GebuehrenBerechnung();
    $berechnung->loadBerechnungsKontext($kgebBerLoader);
    $berechnung->loadKursgebuehrenElemente(new KursgebuehrElementeLaderFromDb($kgebBerLoader));
    return $berechnung;
  }
}