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







class DBWorkWarenkorbKurse extends DBWorkWarenkorb
{
  public $dbkurse;
  public $webflags;

  public function cleardata()
  {
    if (isset($this->data)) {
      unset($this->data);
    }
    $this->data = new WareKurs();
  }

  public function initiate()
  {
    $this->sessionvar = 'WKK_VAR';
  }

  public function getEntryIndex($id)
  {
    if (!isset($this->ary) || count($this->ary) === 0) {
      $this->explodeEntries();
      if (count($this->ary) === 0) {
        return -1;
      }
    }
    foreach ($this->ary as $key => $val) {
      $tmp = explode($this->delimiter_menge, $val);
      if ($tmp[0] === $id) {
        return $key;
      }
    }

    return -1;
  }

  
  public function getKurse()
  {
    if (!isset($this->dbkurse)) {
      $this->dbkurse = new DBWorkKurse();
    }
    $kurse = array();
    $kursIds = $this->getEntriesIDSerialized();

    foreach ($kursIds as $knr) {
      $kurs = $this->dbkurse->getKurs($knr);
      array_push($kurse, $kurs);
    }

    return $kurse;
  }

  
  public function contains(array $knrs): bool
  {
    $kurse = $this->getKurse();

    return ArrayOperations::in_array_u($knrs, $kurse, function($needle, $value) {
      return in_array($value->id, $needle);
    });
  }

  public function isEinKursErmaessigbar(): bool
  {
    $kurse = $this->getKurse();
    $dbwgeb = new DBWorkKursgebuehr();
    foreach ($kurse as $kurs) {
      if ($dbwgeb->isKursErmaessigbar($kurs->id)) {
        return true;
      }
    }

    return false;
  }

  public function explodeEntry($exEntry)
  {
    DBWorkWarenkorb::explodeEntry($exEntry);
    if (!isset($this->dbkurse)) {
      $this->dbkurse = new DBWorkKurse();
    }
    $this->data->kurs = $this->dbkurse->getKurs($this->data->id);
    $this->data->epreis = $this->mathop->floatToString($this->data->kurs->gebuehr);
    $this->data->gpreis = $this->mathop->floatToString($this->mathop->stringToFloat($this->data->kurs->gebuehr) * $this->data->menge);
  }

  
  public function getWebflags()
  {
    $retour = 255; 
    $kurse = $this->getEntries();
    if (!is_null($kurse)) {
      foreach ($kurse as $kurs) {
        $webflags = $kurs->kurs->webflags;
        
        $retour = $retour & ($webflags == 0 ? 2 : $webflags);
      }
    }

    return $retour;
  }

  
  public function nurEineAnmeldeArtErlaubt()
  {
    $webflags = $this->getWebflags();
    switch ($webflags) {
      case \Kurs::WEBFLAG_NORMAL:
      case \Kurs::WEBFLAG_FIRMA:
      case \Kurs::WEBFLAG_ELTERNKIND:
      case \Kurs::WEBFLAG_PAAR:
      case \Kurs::WEBFLAG_MEHRFACH:
        return true;
      default:
        return false;
    }
  }

  public function getGebuehrenNichtErmaessigt()
  {
    $loader = KursgebuehrBerechnungsKontextLaderAnmeldungFactory::getLader();
    $warenkorbKontextLoader = WarenkorbBerechnungsKontextLaderAnmeldungFactory::getLader();
    $kontextOhneGutschein = $warenkorbKontextLoader->load();
    $kontextOhneGutschein->gutscheinBetrag = null;
    $kontextLaderOhneGutschein = new WarenkorbBerechnungsKontextLaderInjected($kontextOhneGutschein);

    return GebuehrenBerechnungsFassade::getGebuehrenSummeNichtErmaessigt($loader, $kontextLaderOhneGutschein);
  }

  public function getGebuehrenErmaessigt()
  {
    $loader = KursgebuehrBerechnungsKontextLaderAnmeldungFactory::getLader();
    $warenkorbKontextLoader = WarenkorbBerechnungsKontextLaderAnmeldungFactory::getLader();
    $kontextOhneGutschein = $warenkorbKontextLoader->load();
    $kontextOhneGutschein->gutscheinBetrag = null;
    $kontextLaderOhneGutschein = new WarenkorbBerechnungsKontextLaderInjected($kontextOhneGutschein);

    return GebuehrenBerechnungsFassade::getGebuehrenSumme($loader, $kontextLaderOhneGutschein);
  }

  
  public function getGebuehrenErmaessigtMitGutschein()
  {
    $loader = KursgebuehrBerechnungsKontextLaderAnmeldungFactory::getLader();
    $wkKontextLoaderMitGutschein = WarenkorbBerechnungsKontextLaderAnmeldungFactory::getLader();

    return GebuehrenBerechnungsFassade::getGebuehrenSumme($loader, $wkKontextLoaderMitGutschein);
  }

  public function getGebuehrenImmerErmaessigt()
  {
    $loader = KursgebuehrBerechnungsKontextLaderAnmeldungFactory::getLader(false);
    $warenkorbKontextLoader = WarenkorbBerechnungsKontextLaderAnmeldungFactory::getLader();
    $kontextOhneGutschein = $warenkorbKontextLoader->load();
    $kontextOhneGutschein->gutscheinBetrag = null;
    $kontextLaderOhneGutschein = new WarenkorbBerechnungsKontextLaderInjected($kontextOhneGutschein);

    return GebuehrenBerechnungsFassade::getGebuehrenSumme($loader, $kontextLaderOhneGutschein);
  }

  
  public function getGebuehren($pErmaess, $pLfdNr = '', $pMitUnterkursen = false, $pAnminfo = null)
  {
    if ($pAnminfo !== null) {
      if (isset($pAnminfo->kurse)) {
        if (isset($pAnminfo->kurse[$pLfdNr], $pAnminfo->kurse[$pLfdNr]->weitereTeilnehmer)) {
          $anzahl = count($pAnminfo->kurse[$pLfdNr]->weitereTeilnehmer) + ($pAnminfo->kurse[$pLfdNr]->hauptTnAuch ? 1 : 0);
        } else {
          $anzahl = 0; 
          
        }
      } else {
        $anzahl = 0;
      }
      $anmart = SessionOperations::getAnmeldeArt(); 
      $ermgrund = SessionOperations::getVarValueWk('w_erm_grund'); 
    } else {
      $anzahl = SessionOperations::getAnzahlPersonen();
      $anmart = SessionOperations::getAnmeldeArt();
      $ermgrund = SessionOperations::getVarValueWk('w_erm_grund');
    }

    return $this->_getGebuehren($pErmaess, $pLfdNr, $pMitUnterkursen, $anzahl, $anmart, $ermgrund);
  }

  
  private function _getGebuehren($pErmaess, $pLfdNr = '', $pMitUnterkursen = false, $pAnzahl = 0, $pAnmart = '', $pErmgrund = false)
  {
    
    
    
    
    $gebSumme = new Gebuehr();
    $gebSumme->gebBetrag = 0;
    $gebSumme->gebErmbar = 0;
    $gebSumme->gebErm = 0;
    $gebSumme->gebNoErm = 0;
    
    $wkurse = $this->getEntries();
    if (is_null($wkurse)) {
      return $gebSumme;
    }
    $kurse = ArrayOperations::mapAttribut($wkurse, 'kurs');
    $kurse = $this->_unterKurseHinzufuegen($kurse, $pMitUnterkursen);

    
    $count = count($kurse);
    $dbwgeb = ($count > 0) ? new DBWorkKursgebuehr() : null;
    $anzahl = $pAnzahl;
    $anmart = $pAnmart;
    $ermgrund = $pErmgrund;

    if ($pLfdNr !== '') { 
      $gebSumme = $this->_getGebsummeKursXImWk($pLfdNr, $kurse, $dbwgeb, $pErmaess, $anzahl, $anmart, $ermgrund);
    } else { 
      for ($k = 0; $k < $count; $k++) {
        $gebs = $this->_getGebsummeKursXImWk($k, $kurse, $dbwgeb, $pErmaess, $anzahl, $anmart, $ermgrund);
        
        $gebSumme->gebBetrag += $gebs->gebBetrag;
        $gebSumme->gebErmbar += $gebs->gebErmbar;
        $gebSumme->gebNoErm += $gebs->gebNoErm;
        
        if ($pErmaess) {
          $gebSumme->gebErm += $gebs->gebErm;
        }
      } 
    }

    return $gebSumme;
  }

  private function _unterKurseHinzufuegen($pKurse, $pMitUnterkursen = false)
  {
    $kurse = $pKurse;
    $count = count($kurse);
    if ($count > 0) {
      if (!isset($this->dbkurse)) {
        $this->dbkurse = new DBWorkKurse();
      }
      
      if ($pMitUnterkursen) {
        $kursIds = ArrayOperations::mapAttribut($kurse, 'id');
        
        $unterkurse = $this->dbkurse->getUnterkurseForKnrs($kursIds, false, false);
        $kurse = array_merge($kurse, $unterkurse);
      }
    }

    return $kurse;
  }

  

  private function _getGebsummeKursXImWk($k, $kurse, $dbwgeb, $pErmaess, $anzahl, $anmart, $pErmgrund = '', $pZpId = -1)
  {
    
    
    $kurs = clone($kurse[$k]);
    
    
    


    $kurs->geb_kind = MathOperations::stringToFloat($kurs->geb_kind);
    $kurs->geb_zuskind = MathOperations::stringToFloat($kurs->geb_zuskind);

    
    
    
    $gebs = $dbwgeb->getGebuehrenSummeSortiert($kurs->id, $pZpId);
    
    if ($pErmaess) {
      $gebapi = new APIGebuehren();
      
      
      $gebErm = $gebapi->berechneErmaessigung($gebs, $pErmgrund);
    }
    
    
    if ($anzahl > 1) {
      $gebapi = new APIGebuehren();
      
      if ($pErmaess) {
        $gebObj = $gebapi->berechneGebuehren($gebErm, $kurs->geb_kind, $kurs->geb_zuskind, $anzahl, $anmart, $gebs->gebErmbar);
        $gebErm = $gebObj->gebBetrag;
      }
      
      $gebObj = $gebapi->berechneGebuehren($gebs->gebBetrag, $kurs->geb_kind, $kurs->geb_zuskind, $anzahl, $anmart, $gebs->gebErmbar);
      $gebs->gebBetrag = $gebObj->gebBetrag;
      $gebs->gebErmbar = $gebObj->gebErmbar;
      $gebs->gebNoErm = $gebObj->gebNoErm;
    }
    if ($pErmaess) {
      $gebs->gebErm = $gebErm;
    }

    return $gebs;
  }

  
  public function hasKennzeichen($pKennz)
  {
    $dbwk = new DBWorkKennz();
    $kurseIds = $this->getEntriesIDSerialized();

    foreach ($kurseIds as $knr) {
      $kennzAry = $dbwk->getKennzeichen4Kurs($knr);
      foreach ($kennzAry as $kennz) {
        if ($kennz->kennz == $pKennz) {
          return true;
        }
      }
    }

    return false;
  }

  
  public function anzahlKurseMitKennzeichen($pKennz)
  {
    $dbwk = new DBWorkKennz();
    $kurseIds = $this->getEntriesIDSerialized();
    $result = 0;
    foreach ($kurseIds as $knr) {
      $kennzAry = $dbwk->getKennzeichen4Kurs($knr);
      foreach ($kennzAry as $kennz) {
        if ($kennz->kennz == $pKennz) {
          $result++;
        }
      }
    }

    return $result;
  }

  
  public function anzahlKurseMitZahlplaenen()
  {
    $kurseIds = $this->getEntriesIDSerialized();
    $result = 0;
    $dbwkz = new DBWorkKurszahlplan();
    foreach ($kurseIds as $knr) {
      if ($dbwkz->getAnzahlKurszahlplaeneByKnr($knr) > 0) {
        $result++;
      }
    }

    return $result;
  }

  
  public function alleKurseOhneKennzeichen($pKennzeichen, $pDbwkennz = null)
  {
    if (!is_array($pKennzeichen) || count($pKennzeichen) == 0) {
      return true;
    }
    if (is_null($pDbwkennz)) {
      $dbwkennz = new DBWorkKennz();
    } else {
      $dbwkennz = $pDbwkennz;
    }
    $kurseIds = $this->getEntriesIDSerialized();
    foreach ($kurseIds as $knr) {
      $kennzlist = $dbwkennz->getKennzListbyKnr($knr);
      $dieserKursHatEinsDerKennzeichen = false;
      foreach ($pKennzeichen as $kennz) {
        if (in_array($kennz, $kennzlist)) {
          $dieserKursHatEinsDerKennzeichen = true;
        }
      }
      if (!$dieserKursHatEinsDerKennzeichen) {
        return true;
      }
    }

    return false;
  }

  
  public function getSummeGebErm()
  {
    $summe = 0;
    $wkurse = $this->getEntries();


    $count = count($wkurse);
    if ($count > 0) {
      if (!isset($this->dbkurse)) {
        $this->dbkurse = new DBWorkKurse();
      }
    }

    for ($k = 0; $k < $count; $k++) {
      $kurs = $wkurse[$k]->kurs;
      $geb_erm = MathOperations::stringToFloat($kurs->geb_erm);
      $summe += $geb_erm;
    }

    return $summe;
  }
}