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


class APIGebuehren
{
  
  public function berechneGebuehren($pGebBasis, $pGebKind, $pGebZusKind, $pAnzPer, $pAnmeldeart, $pGebermbar = 0)
  {
    $gebuehr = new Gebuehr();
    
    switch ($pAnmeldeart) {
      case 'F': 
        $gebuehr->gebBetrag = ($pAnzPer - 1) * $pGebBasis;
        $gebuehr->gebErmbar = ($pAnzPer - 1) * $pGebermbar;
        break;
      case 'K': 
        $gebuehr->gebBetrag = $pGebBasis;
        if ($pAnzPer >= 2) { 
          $gebuehr->gebBetrag += $pGebKind;
        }
        if ($pAnzPer >= 3) {
          $gebuehr->gebBetrag += $pGebZusKind * ($pAnzPer - 2);
        }
        
        $gebuehr->gebErmbar = $pGebermbar;
        break;
      default: 
        $gebuehr->gebBetrag = $pAnzPer * $pGebBasis;
        $gebuehr->gebErmbar = $pAnzPer * $pGebermbar;
    }
    $gebuehr->gebNoErm = $gebuehr->gebBetrag - $gebuehr->gebErmbar;

    return $gebuehr;
  }

  
  public function berechneErmaessigung($pGebobj, $pErmgrund = '')
  {
    $dberm = new DBWorkErmaessigung();
    if ($pErmgrund != '' && ($pErmgrund !== '' && $pErmgrund > 0)) {
      $ermProz = $dberm->getErmaessigungbyNr($pErmgrund);
      $ermProz = $ermProz[0]->prozente;
      
      
      if ($ermProz > 0) {
        
        
        $ermGeb = $pGebobj->gebErmbar - MathOperations::allgRund(($pGebobj->gebErmbar * ($ermProz / 100)));
        $ermGeb += ($pGebobj->gebNoErm);
        
      } 
      else {
        $ermGeb = $pGebobj->gebNoErm + $pGebobj->gebErm;
      }
    } 
    else {
      $ermGeb = $pGebobj->gebBetrag;
    }

    return MathOperations::allgRund($ermGeb);
  }

  
  public static function getGebuehren($pTnr, $pKnr, $pAnmForm = '', $pAnzahlWeitere = 0, $transformTeilnehmerKontext = null)
  {
    if ($pKnr == '' || $pTnr == '') {
      return -1;
    }

    $dbwTeilnehmer = new \DBWorkTeilnehmer(1, true);
    $teilnehmer = $dbwTeilnehmer->getTeilnehm($pTnr);

    $kontext = new \KursgebuehrBerechnungsKontext($pKnr);
    $kontext->rabattierbar = false; 
    $kontext->hauptTnAuch = true;
    $kontext->brutto = true;
    $kontext->isFirmenAnmeldung = false;
    $kontext->kinderanzahl = 0;
    $kontext->tns = array();
    $kontext->pers_nr = $teilnehmer->pers_nr;

    $teilnehmerKontext = new \KursgebuehrBerechnungsKontextTeilnehmer();

    if ($teilnehmer->erm_grund > 0) {
      $dbwErmaess = new \DBWorkErmaessigung();
      if ($dbwErmaess->isErmaessigungStillValid($pKnr, $teilnehmer->erm_ende)) {
        $teilnehmerKontext = \KursgebuehrBerechnungsKontextTeilnehmer::fromErmGrund($teilnehmer->erm_grund);
      }
    }

    switch ($pAnmForm) {
      case ANMELDEART_INTERN_ELTERNKIND:
        $kontext->kinderanzahl = $pAnzahlWeitere;
        $anzahlTn = 1;
        break;
      case ANMELDEART_INTERN_FIRMA:
        $kontext->hauptTnAuch = false; 
        $kontext->isFirmenAnmeldung = true;
        $anzahlTn = $pAnzahlWeitere;
        break;
      case ANMELDEART_INTERN_PAAR:
        $anzahlTn = 2;
        break;
      case ANMELDEART_INTERN_MEHRFACH:
        $anzahlTn = $pAnzahlWeitere + 1;
        break;
      case ANMELDEART_INTERN_KINDERKURS:
        $kontext->hauptTnAuch = false; 
        $kontext->kinderanzahl = $pAnzahlWeitere;
        $anzahlTn = 0;
        break;
      default:
        $anzahlTn = 1;
        break;
    }

    if (!is_null($transformTeilnehmerKontext)) {
      $teilnehmerKontext = call_user_func($transformTeilnehmerKontext, $pKnr, $teilnehmer, $teilnehmerKontext);
    }

    for ($i = 0; $i < $anzahlTn; $i++) {
      $kontext->tns[] = $teilnehmerKontext;
    }

    $mathop = new MathOperations();

    $gebuehrenRechner = new GebuehrenBerechnung();

    return $mathop->floatToString($gebuehrenRechner->berechneGebuehren(
      $kontext
    ));
  }

  
  public static function hasKursFortlaufendeGebuehren($pKnr)
  {
    $dbwKursGeb = DBWorkKursgebuehr::getDefaultInstance(1, true);

    return $dbwKursGeb->hasKursFortlaufendeGebuehren($pKnr);
  }

  
  public static function isNachlassAufteilbarInEinzelpreise($pGesamtNachlass, $pTnr, $pKnr, $pAnmForm, $pAnzahlWeitere): bool
  {
    $aufteilbar = true;
    if ($pAnmForm == ANMELDEART_INTERN_FIRMA || $pAnmForm == ANMELDEART_INTERN_MEHRFACH) {
      $gesamtGebuehr = \MathOperations::stringToFloat(self::getGebuehren($pTnr, $pKnr, $pAnmForm, $pAnzahlWeitere));

      if ($pAnmForm == ANMELDEART_INTERN_MEHRFACH) {
        $pAnzahlWeitere += 1; 
      }
      $dbwKursGeb = new \DBWorkKursgebuehr();
      $gebs = $dbwKursGeb->getKursgebuehrenErmaessigtTab($pKnr, $pTnr);
      $nachlassAry = array();
      $summeNachlass = 0;
      
      foreach ($gebs as $geb) {
        $faktor = round($geb->gebuehr, 2) * $pAnzahlWeitere / $gesamtGebuehr;
        $nachlassBetrag = round($faktor * $pGesamtNachlass, 2);
        $nachlassAry[] = $nachlassBetrag;
        $summeNachlass += $nachlassBetrag;
      }
      
      
      if ($summeNachlass != $pGesamtNachlass) {
        $nachlassAry[0] += $pGesamtNachlass - $summeNachlass;
      }
      
      foreach ($nachlassAry as $nachlass) {
        $einzelPreis = $nachlass / $pAnzahlWeitere;
        if (\StringOperations::strpos((string)($einzelPreis * 100), '.') !== false) {
          $aufteilbar = false;
          break;
        }
      }
    }

    return $aufteilbar;
  }

  public static function isZahlplanAllowed(): bool
  {
    $settings = ToolSettingsAPI::getToolSettings(4);

    return $settings->zahlplanberuecksichtigen;
  }

  public static function isKollegenrabattErlaubt($isRabattierbar, $isFirmenanmeldung, $anzahlTn)
  {
    if (!$isRabattierbar && $isRabattierbar !== 'false') {
      return false;
    }
    if ($anzahlTn < 2) {
      return false;
    }
    if (DBWorkBASysSettings::isHamburgConsus()) {
      return true;
    }
    
    if ($isFirmenanmeldung && $isFirmenanmeldung !== 'false') {
      return DBWorkBASysSettings::getDefaultInstance()->isSwitchSet(545);
    } else { 
      $dbwhl = \DBWorkHLGrundSys::getDefaultInstance();
      $schalterFuerMehrfachanmeldung = $dbwhl->getFeldWert('545_mehrfachanm', 'F');
      if ($schalterFuerMehrfachanmeldung === 'W') {
        return DBWorkBASysSettings::getDefaultInstance()->isSwitchSet(545);
      }
    }

    return false;
  }

  public static $ermaessigung = array();

  
  public static function greiftErmaessigungBeiDiesenKurs($kursNr, $ermGrund)
  {
    if (is_null($ermGrund) || $ermGrund === '') {
      return true;
    }

    if (count(static::$ermaessigung) === 0) {
      if (!isset($ermaessigungenCache[$ermGrund])) {
        $dbwErm = DBWorkErmaessigung::getDefaultInstance();
        $ermaessigung[$ermGrund] = $dbwErm->getErmaessigungbyNr($ermGrund);
      }
      $ermaessigungen = $ermaessigung[$ermGrund];
    } else {
      $ermaessigungen = static::$ermaessigung;
    }

    if (count($ermaessigungen) === 1) {
      
      
      
      
      if ($ermaessigungen[0]->ungueltig === 'W') { 
        return false;
      } elseif ($ermaessigungen[0]->ungueltig === 'G' || $ermaessigungen[0]->ungueltig === 'U') {
        $kursErmaessigung = self::getKursErmaessigung($kursNr, $ermaessigungen[0]->nr);

        if (is_null($kursErmaessigung)) {
          
          return $ermaessigungen[0]->ungueltig === 'G';
        } else {
          return $kursErmaessigung->erlaubt;
        }
      } else {
        return true;
      }
    }

    return true;
  }

  private static function getKursErmaessigung($kursNr, $ermNr)
  {
    static $kursermaessigungenCache = array();

    if (!isset($kursermaessigungenCache[$kursNr])) {
      $dbwKurserm = DBWorkKursErmaessigung::getDefaultInstance();
      $kursermaessigungenCache[$kursNr] = $dbwKurserm->getKursErmaessigungen4Kurse(array($kursNr));
    }

    foreach ($kursermaessigungenCache[$kursNr] as $kursErmaessigung) {
      if ($kursErmaessigung->nr_art == $ermNr && $kursErmaessigung->art == 'E') {
        return $kursErmaessigung;
      }
    }

    return null;
  }
}