<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, 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 = '', $pAnzahl = 1)
  {
    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();

    $dbwErmaess = new DBWorkErmaessigung();
    if ($dbwErmaess->isErmaessigungStillValid($pKnr, $teilnehmer->erm_ende)) {
      $teilnehmerKontext = KursgebuehrBerechnungsKontextTeilnehmer::fromErmGrund($teilnehmer->erm_grund);
    } else {
      $teilnehmerKontext = new KursgebuehrBerechnungsKontextTeilnehmer();
    }
    $kontext->tns[] = $teilnehmerKontext;

    switch ($pAnmForm) {
      case 1: 
        $kontext->kinderanzahl = $pAnzahl;
        break;
      case 2: 
        $kontext->hauptTnAuch = false;
        $kontext->isFirmenAnmeldung = true;
        for ($i = 1;$i < $pAnzahl;$i++) { 
          $kontext->tns[] = $teilnehmerKontext;
        }
        break;
      case 3: 
        $kontext->tns[] = $teilnehmerKontext;
        break;
      case 4: 
        for ($i = 0;$i < $pAnzahl;$i++) {
          $kontext->tns[] = $teilnehmerKontext;
        }
        break;
      default:
        break;
    }

    $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, $pAnzahl)
  {
    $aufteilbar = true;
    
    if ($pAnmForm == 2 || $pAnmForm == 4) {
      $gesamtGebuehr = MathOperations::stringToFloat(self::getGebuehren($pTnr, $pKnr, $pAnmForm, $pAnzahl));
      
      if ($pAnmForm == 4) {
        $pAnzahl += 1;
      }
      $dbwKursGeb = new DBWorkKursgebuehr();
      $gebs = $dbwKursGeb->getKursgebuehrenErmaessigtTab($pKnr, $pTnr);
      $nachlassAry = array();
      $summeNachlass = 0;
      
      foreach ($gebs as $geb) {
        $faktor = round($geb->gebuehr, 2) * $pAnzahl / $gesamtGebuehr;
        $nachlassBetrag = round($faktor * $pGesamtNachlass, 2);
        $nachlassAry[] = $nachlassBetrag;
        $summeNachlass += $nachlassBetrag;
      }
      
      
      if ($summeNachlass != $pGesamtNachlass) {
        $nachlassAry[0] += $pGesamtNachlass - $summeNachlass;
      }
      
      foreach ($nachlassAry as $nachlass) {
        $einzelPreis = $nachlass / $pAnzahl;
        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 function greiftErmaessigungBeiDiesenKurs($kursNr, $ermGrund)
  {
    if (is_null($ermGrund) || $ermGrund === '') {
      return true;
    }

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

    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;
  }
}