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

namespace Kufer\Web\Classes\Export\ExportCalculation;

use Kufer\Web\Classes\Addfunctions\KursOperations;

class ExportCalcWarenkorb extends ExportCalc
{
  public function resolveVar(string $varname, ?\Datamodul $datamodul = null): string
  {
    
    
    $varparam = '';
    if (\StringOperations::strpos($varname, ':')) {
      $parts = explode(':', $varname);
      $varname = $parts[0];
      $varparam = $parts[1];
    }

    switch (\StringOperations::strtolower($varname)) {
      default:
        return $this->getDefaultVarValue($varname, $datamodul);
      case 'gebucht':
        if (\DBWorkWarenkorbKurseWB::getDefaultInstance()->getEntryIndex($datamodul->id) != -1) {
          $layoutDir = \Kufer\Web\Classes\KwResourceLocator::getInstance()->locateLayoutDirRelative();

          return \HTMLOperations::CreateImageTag(
            $layoutDir . 'warenkorb.gif',
            'gebucht',
            '',
            '',
            'title="Veranstaltung bereits im Warenkorb"'
          );
        }
        break;
      case 'delkurs':
      case 'delall':
      case 'delkurs_ssl':
      case 'delall_ssl':
        $urlparam = new \URLParameterNavigation();
        $urlparam->stream = \GetOperations::getVarValue('urlparameter', '');
        $urlparam->explodeSettingStream();
        $urlparam->implodeSettings();
        if (\StringOperations::substr(\StringOperations::strtolower($varname), -4, 4) == '_ssl') {
          $server = \Kufer\Web\Classes\Addfunctions\UrlOperations::getServerAddressFromSettings(true);
          $varname = \StringOperations::substr($varname, 0, -4);
        } else {
          $server = \Kufer\Web\Classes\Addfunctions\UrlOperations::getServerAddressFromSettings(false);
        }
        if (\StringOperations::strtolower($varname) == 'delkurs') {
          return  \CleanOperations::cleanStringForHtml($server . INDEXSCRIPT . '?urlparameter='
                 . $urlparam->getStreamWith(array('knrdel'), array($datamodul->id)));
        } elseif (\StringOperations::strtolower($varname) == 'delall') {
          return \CleanOperations::cleanStringForHtml($server . INDEXSCRIPT . '?urlparameter='
                 . $urlparam->getStreamWith(array('warenkorbclear'), array('true')));
        }
        
      case 'anzahlweitere':
        return (string)count(\SessionOperations::getWeitereFromSession());
      case 'countkurse':
        return (string)\DBWorkWarenkorbKurseWB::getDefaultInstance()->EntryCount();
      case 'gutscheinbetrag':
        return  \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($this->getGutscheinBetragAsFloat()));
      case 'sumkursgeb':
        $gebs = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getGebuehrenNichtErmaessigt();

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($gebs));
        
      case 'sumkursgebmitgutschein':
        return \CleanOperations::cleanStringForHtml($this->berechneBetragInklGutschein($this->resolveVar('sumkursgeb', $datamodul)));
      case 'sumkursgebaltnetto':
        $lader = new \KursgebuehrBerechnungsKontextLaderAlteAnmeldung(\KursgebuehrBerechnungsKontextLaderAnmeldungFactory::getValidators(true));
        $kontexte = $lader->load();
        foreach ($kontexte as $kontext) {
          $kontext->brutto = false;
        }
        $berechnung = \GebuehrenBerechnungsFassade::setupGebuehrenBerechnung($kontexte);
        $betrag = $berechnung->berechneGebuehrenSumme();

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($betrag));
      case 'sumkursgebmitspende':
        return \CleanOperations::cleanStringForHtml($this->berechneBetragInklSpende($this->resolveVar('sumkursgeb', $datamodul)));
      case 'sumkursgebermbar':
        $ermaess = false;
        $gebSumme = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getGebuehren($ermaess);

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($gebSumme->gebErmbar));
      case 'sumkursgebanminfo':
        
        
        if ($varparam != '') {
          return '<span data-bind="text: gebuehrenSumme([' . $varparam . ']).replace(\'.\',\',\')"></span>';
        }

        return '<span data-bind="text: gebuehrenSumme().replace(\'.\',\',\')"></span>'; 
      case 'sumkursgebanminfomitspende':
        return \CleanOperations::cleanStringForHtml($this->berechneBetragInklSpende($this->resolveVar('sumkursgebanminfo', $datamodul)));
        
      case 'gebuehrensummeajax':
        return '<span data-bind="text: gebuehrenSummeAjax()"></span>' . \JsOperations::setAnmSettingsValue('useGebSumAjaxBrutto', 1);
      case 'gebuehrensummeajaxnichtermaessigt':
        return '<span data-bind="text: gebuehrenSummeAjaxNichtErmaessigt()"></span>' . \JsOperations::setAnmSettingsValue('useGebSumAjaxBrutto', 1);
      case 'gebuehrensummeajaximmerermaessigt':
        return '<span data-bind="text: gebuehrenSummeAjaxImmerErmaessigt()"></span>' . \JsOperations::setAnmSettingsValue('useGebSumAjaxBrutto', 1);
      case 'gebuehrensummeajaxnettoimmerermaessigt':
        return '<span data-bind="text: gebuehrenSummeAjaxNettoImmerErmaessigt()"></span>' . \JsOperations::setAnmSettingsValue('useGebSumAjaxNetto', 1);
      case 'gebuehrensummeajaxrabatt':
        return '<span data-bind="text: gebuehrenSummeAjaxRabatt()"></span>' . \JsOperations::setAnmSettingsValue('useGebSumAjaxBrutto', 1);
      case 'gebuehrensummeajaxnetto':
        return '<span data-bind="text: gebuehrenSummeAjaxNetto()"></span>' . \JsOperations::setAnmSettingsValue('useGebSumAjaxNetto', 1);
      case 'gebuehrensummeajaxnettonichtermaessigt':
        return '<span data-bind="text: gebuehrenSummeAjaxNettoNichtErmaessigt()"></span>' . \JsOperations::setAnmSettingsValue('useGebSumAjaxNetto', 1);
      case 'gebuehrensummeajaxnettorabatt':
        return '<span data-bind="text: gebuehrenSummeAjaxNettoRabatt()"></span>' . \JsOperations::setAnmSettingsValue('useGebSumAjaxNetto', 1);
      case 'sumkursgebnermbar':
        $ermaess = false;
        $gebSumme = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getGebuehren($ermaess);

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($gebSumme->gebNoErm));
      case 'sumkursgeberm':
        $gebs = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getGebuehrenErmaessigt();

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($gebs));
      case 'sumkursgeberm_float':
        return \CleanOperations::cleanStringForHtml(\MathOperations::stringToFloat($this->resolveVar('sumkursgeberm', $datamodul)));
      case 'sumkursgebimmererm':
        $gebs = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getGebuehrenImmerErmaessigt();

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($gebs));
      case 'sumkursgebermmitspende':
        return \CleanOperations::cleanStringForHtml($this->berechneBetragInklSpende($this->resolveVar('sumkursgeberm', $datamodul)));
      case 'sumkursgeb_mitunterkurs':  
        $gebSumme = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getGebuehren(false, '', true);  

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($gebSumme->gebBetrag));
      case 'sumkursgeberm_mitunterkurs':  
        $ermaess = true;
        $gebSumme = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getGebuehren($ermaess, '', true);  

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($gebSumme->gebErm));
      case 'sumkursgebermmax':
        $anzahlPersonen = \SessionOperations::getAnzahlPersonen();
        $summe = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getSummeGebErm();
        $summe = $anzahlPersonen * $summe;

        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString($summe));
      case 'sumkursgebermmaxeinfach':
        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString(\DBWorkWarenkorbKurseWB::getDefaultInstance()->getSummeGebErm()));
      case 'sumkursrabatt':
        return \CleanOperations::cleanStringForHtml(\MathOperations::floatToString(
          \MathOperations::stringToFloat($this->resolveVar('sumkursgeb', $datamodul))
                - \MathOperations::stringToFloat($this->resolveVar('sumkursgeberm', $datamodul))
        ));
      case 'ohne_kennzeichen':
        if ($varparam == '') {
          return '1';
        }

        return (\DBWorkWarenkorbKurseWB::getDefaultInstance()->alleKurseOhneKennzeichen(explode(',', $varparam), \DBWorkKennz::getDefaultInstance()) ? '1' : '0');
      case 'artikel_ohne_kennzeichen':
        if ($varparam == '') {
          return '1';
        }

        return (\DBWorkWarenkorbArtikel::getDefaultInstance()->alleArtikelOhneKennzeichen(explode(',', $varparam), \DBWorkKennz::getDefaultInstance()) ? '1' : '0');
      case 'kennzeichen':
        return \DBWorkWarenkorbKurseWB::getDefaultInstance()->hasKennzeichen($varparam) ? '1' : '0';
      case 'anzahlkennzeichen':
        return \DBWorkWarenkorbKurseWB::getDefaultInstance()->anzahlKurseMitKennzeichen($varparam);
      case 'anzahlzahlplaenevorhanden':
        return \CleanOperations::cleanInt(\DBWorkWarenkorbKurseWB::getDefaultInstance()->anzahlKurseMitZahlplaenen());
      case 'kursstatusok':
        $kurse = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getKurse();

        $anzPers = \SessionOperations::getAnzahlPersonen();

        foreach ($kurse as $kurs) {
          $status = \Kufer\Web\Classes\Addfunctions\KursOperations::getAnmeldeStatusForKnr($kurs->id, $anzPers);
          if ($status != ANMELDUNGONLINE_OK) {
            return '';
          }
        }

        return '1';

      case 'mehrfachsimpelok':
        $settings = \ToolSettingsAPI::getToolSettings(4);
        if ($settings->nurnormaleanmeldearten) {
          return '0';
        }
        if (!$settings->nurerlaubteanmeldearten) {
          return '1';
        }
        $dbwKurs = new \DBWorkKurseINetAktiv();
        $knrarray = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getEntriesIDSerialized();
        $webflag = $dbwKurs->getWebflagsbyKnrs($knrarray);
        
        if ($webflag % 2 === 1) {
          return '0';
        }
        $result = $webflag & \Kurs::WEBFLAG_MEHRFACH;

        return $result > 0 ? '1' : '0';
      case 'kursnurfirma':
        
        $settings = \ToolSettingsAPI::getToolSettings(4);
        
        if ($settings->nurnormaleanmeldearten || !$settings->nurerlaubteanmeldearten) {
          return '0';
        }
        $dbwKurs = new \DBWorkKurseINetAktiv();
        $knrarray = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getEntriesIDSerialized();
        foreach ($knrarray as $knr) {
          $webflag = $dbwKurs->getWebflagsbyKnrs(array($knr));
          if ($webflag === \Kurs::WEBFLAG_FIRMA) {
            return '1';
          }
        }

        return '0';
      case 'kursnurohnefirma':
        
        
        $settings = \ToolSettingsAPI::getToolSettings(4);
        if ($settings->nurnormaleanmeldearten) { 
          return '1';
        }
        if (!$settings->nurerlaubteanmeldearten) { 
          return '0';
        }
        $dbwKurs = new \DBWorkKurseINetAktiv();
        $knrarray = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getEntriesIDSerialized();
        foreach ($knrarray as $knr) {
          $webflag = $dbwKurs->getWebflagsbyKnrs(array($knr));
          if (($webflag & \Kurs::WEBFLAG_FIRMA) === 0) {
            return '1';
          }
        }

        return '0';
      case 'kursekeinefirma':
        
        $settings = \ToolSettingsAPI::getToolSettings(4);
        if ($settings->nurnormaleanmeldearten) { 
          return '1';
        }
        if (!$settings->nurerlaubteanmeldearten) { 
          return '0';
        }
        $dbwKurs = new  \DBWorkKurseINetAktiv();
        $knrarray = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getEntriesIDSerialized();
        foreach ($knrarray as $knr) {
          $webflag = $dbwKurs->getWebflagsbyKnrs(array($knr));
          if (($webflag & \Kurs::WEBFLAG_FIRMA) > 0) {
            return '0';
          }
        }

        return '1';
      case 'allekursenurwebflag':
        $settings = \ToolSettingsAPI::getToolSettings(4);
        if (!isset($varparam) || !is_numeric($varparam)) {
          return '0';
        }
        if (!$settings->nurerlaubteanmeldearten) {
          return '0';
        }
        if ($settings->nurnormaleanmeldearten && ($varparam == 0 || $varparam == 2)) {
          return '1';
        }
        if ($settings->nurnormaleanmeldearten) {
          return '0';
        }
        $dbwKurs = new \DBWorkKurseINetAktiv();
        $knrarray = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getEntriesIDSerialized();
        foreach ($knrarray as $knr) {
          $webflag = $dbwKurs->getWebflagsbyKnrs(array($knr));
          if ($webflag != $varparam) {
            return '0';
          }
        }

        return '1';
      case 'kinderkurs':
        if (\System::isKuferSql5()) {
          $dbwKurs = new \DBWorkKurseINetAktiv();
          $knrarray = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getEntriesIDSerialized();
          foreach ($knrarray as $knr) {
            $typ = $dbwKurs->getTypByKnr($knr);
            if ($typ == 'K') {
              return '1';
            }
          }
        }

        return '0';
      case 'mandantallekurse':
        $dbwWK = new \DBWorkWarenkorbKurseWB();
        $knrarray = $dbwWK->getEntriesIDSerialized();
        $mandantop = new \MandantOperations();

        return $mandantop->getMandantZuVerwenden($knrarray);
      case 'anminfo':
        return \JsonOperations::getJsonNeuesAnmeldeverfahren();
      case 'dublette_in_mindestens_einem_kurs':
        $dbwWK = new \DBWorkWarenkorbKurseWB();
        $knrarray = $dbwWK->getEntriesIDSerialized();
        foreach ($knrarray as $knr) {
          if (\LoginApi::checkCurrentAnmeldungTnIsInKurs($knr)) {
            return '1';
          }
        }

        return '0';
      case 'firmahotel_maliste':
        $ma = \SessionOperations::getMitarbeiterFromSession();
        $exportTn = new \ExpTeilnehmerRekursiv();

        return \CreateSightFassade::createListe(new \Datamodul(), 671, $ma, $exportTn, $exportTn);
      case 'knraddinwk':
        $urlparam = new \URLParameterWarenkorb();
        $knradd = \CleanOperations::cleanStringForHtml($urlparam->knradd);
        $wk = new \DBWorkWarenkorbKurseWB();

        return $wk->getEntryIndex($knradd) > -1 ? '1' : '0';
      case 'kursinwk':
        return \DBWorkWarenkorbKurseWB::getDefaultInstance()->getEntryIndex($varparam) > -1 ? '1' : '0';
      case 'kurs_spaeter_als_x_tage':
        $kurse = \DBWorkWarenkorbKurseWB::getDefaultInstance()->getKurse();

        return KursOperations::checkMindestensEinKursbeginnInMehrAlsXTagen($varparam, $kurse) ? '1' : '0';
    }

    return '';
  }

  private function berechneBetragInklSpende($pBetragOhneSpende = 0)
  {
    $betragOhneSpende = \MathOperations::stringToFloat($pBetragOhneSpende);
    $tn = \SessionOperations::getTeilnehmerFromSession();
    $spendenbetrag = \MathOperations::stringToFloat($tn[0]->getVarValue('spendenbetrag'));

    return \MathOperations::floatToString($spendenbetrag + $betragOhneSpende);
  }

  private function berechneBetragInklGutschein($pBetragOhneGutschein = 0)
  {
    $betragOhneGutschein = \MathOperations::stringToFloat($pBetragOhneGutschein);
    $gutscheinbetrag = $this->getGutscheinBetragAsFloat();

    if (($betragOhneGutschein - $gutscheinbetrag) < 0) {
      return 0;
    } else {
      return \MathOperations::floatToString($betragOhneGutschein - $gutscheinbetrag);
    }
  }

  private function getGutscheinBetragAsFloat()
  {
    $tn = \SessionOperations::getHauptTeilnehmerFromSession();

    return \MathOperations::stringToFloat($tn->getVarValue('gutschein_betrag'));
  }
}