<?php

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


class HotelOperations
{
  private static $expHotel = null;

  
  private static function getExpHotel()
  {
    if (is_null(static::$expHotel)) {
      static::$expHotel = new ExpHotel();
    }

    return static::$expHotel;
  }

  public static function getVarValue4HotelFromWarenkorb($pVarname)
  {
    $exphotel = static::getExpHotel();
    $exphotel->export->initiate();

    $exphotel->export->exportresults = SessionOperations::getHoteldatenFromSession(true);
    $exphotel->filestream = $pVarname;
    $exphotel->replaceVarNames();

    return $exphotel->resultlist[0];
  }

  public static function getHoteldatenFromRequest2Session($pKnr)
  {
    static::setStandardDaten($pKnr);

    
    if (PostOperations::getVarValue('hedit_uebernachtung_jn', '--') == '1') { 
      static::setZimmergebuehr();
    } else {
      static::setKeineUebernachtung();
    }

    static::setEssengebuehr($pKnr);
  }

  private static function setZimmergebuehr()
  {
    switch (PostOperations::getVarValue('hedit_zimmerart')) {
      case 'EZ': SessionOperations::setVarValueWk(
        'wh_zimmergebuehr',
        static::getVarValue4HotelFromWarenkorb('{%kh_ezpreis%}')
      );
        break;
      case 'DZ': SessionOperations::setVarValueWk(
        'wh_zimmergebuehr',
        static::getVarValue4HotelFromWarenkorb('{%kh_dzpreis%}')
      );
        break;
      case '3Z': SessionOperations::setVarValueWk(
        'wh_zimmergebuehr',
        static::getVarValue4HotelFromWarenkorb('{%kh_3zpreis%}')
      );
        break;
      case '4Z': SessionOperations::setVarValueWk(
        'wh_zimmergebuehr',
        static::getVarValue4HotelFromWarenkorb('{%kh_4zpreis%}')
      );
        break;
    }
  }

  private static function setKeineUebernachtung()
  {
    SessionOperations::setVarValueWk('wh_kein_fruehstueck', '1');
    SessionOperations::setVarValueWk('wh_kein_abendessen', '1');
  }

  private static function setEssengebuehr($pKnr)
  {
    $dbwke = new DBWorkKursEssen();
    $essgeb = $dbwke->getPrice4AllMealsForKurs($pKnr);
    if (PostOperations::getVarValue('hedit_essen_jn')) {
      $sett = ToolSettingsAPI::getToolSettings(4);
      if (PostOperations::getVarValue('hedit_kein_fruehstueck')) {
        $essgeb -= $dbwke->getPrice4OptionalMealsForKursByType($pKnr, $sett->typeFS); 
      }
      if (PostOperations::getVarValue('hedit_kein_abendessen')) {
        $essgeb -= $dbwke->getPrice4OptionalMealsForKursByType($pKnr, $sett->typeAE); 
      }
    } else {
      $essgeb = 0;
    }
    SessionOperations::setVarValueWk('wh_essengebuehr', MathOperations::floatToString($essgeb));
  }

  private static function setStandardDaten($pKnr)
  {
    $tmphotel = new AnmeldedatenHotel();
    
    for ($i = 0; $i < $tmphotel->getVarCount(); $i++) {
      $varname = $tmphotel->getVarName($i);
      if (RequestOperations::isDefined('hedit_' . $varname)) {
        $value = trim(RequestOperations::getVarValue('hedit_' . $varname));
      } else {
        $value = ''; 
      }
      
      SessionOperations::setVarValueWk('wh_' . $varname, $value);
    }
    
    SessionOperations::setVarValueWk('wh_knr', $pKnr);
  }

  
  

  
  public static function getHotelEndGebuehr($pAnmeldedatenHotel, $pKurs = null)
  {
    if (is_null($pKurs)) {
      $kurs = WBKursStore::getKurs($pAnmeldedatenHotel->knr);
    } else {
      $kurs = $pKurs;
    }
    $betrag = MathOperations::stringToFloat($kurs->gebuehr);
    if ($pAnmeldedatenHotel->uebernachtung_jn) {
      switch ($pAnmeldedatenHotel->zimmerart) {
        case 'EZ':
          $betrag += MathOperations::stringToFloat(self::getZimmerPreis($kurs, 'EZ', true));
          break;
        case 'DZ':
          $betrag += MathOperations::stringToFloat(self::getZimmerPreis($kurs, 'DZ', true));
          break;
        case '3Z':
          $betrag += MathOperations::stringToFloat(self::getZimmerPreis($kurs, '3Z', true));
          break;
        case '4Z':
          $betrag += MathOperations::stringToFloat(self::getZimmerPreis($kurs, '4Z', true));
          break;
      }
    }
    $dbwke = new DBWorkKursEssen();
    if (!$pAnmeldedatenHotel->essen_jn) { 
      $betrag -= $dbwke->getPrice4AllMealsForKurs($kurs->id);
    } else {
      $sett = ToolSettingsAPI::getToolSettings(4);
      if ($pAnmeldedatenHotel->kein_fruehstueck) {
        $betrag -= $dbwke->getPrice4OptionalMealsForKursByType($kurs->id, $sett->typeFS); 
      }
      if ($pAnmeldedatenHotel->kein_abendessen) {
        $betrag -= $dbwke->getPrice4OptionalMealsForKursByType($kurs->id, $sett->typeAE); 
      }
    }

    return MathOperations::floatToString($betrag);
  }

  
  public static function getZimmerPreis($pKurs, $pZimmerArt, $pGesamt = false)
  {
    $dbzb = new DBWorkZimmerBeleg();
    $faktor = DateTimeOperations::getNightsBetween(
      $pKurs->getVarValue('beginn_dat'),
      $pKurs->getVarValue('ende_dat')
    );
    $tmp = $dbzb->getUebernachtungspreise($pKurs->getVarValue('id'), $faktor);
    foreach ($tmp as $zimmer) {
      if ($zimmer->bettnr == $pZimmerArt) {
        if ($pGesamt) {
          return $zimmer->uepreis;
        } else {
          return $zimmer->preis;
        }
      }
    }

    return '';
  }

  public static function getHotelDatenFromPost($knr)
  {
    $hd = PostOperations::getDataModulFromPost(new AnmeldedatenHotel(), array('hotel', $knr));
    $hd->knr = $knr;
    if ($hd->uebernachtung_jn != '1') {
      $hd->kein_fruehstueck = '1';
      $hd->kein_abendessen = '1';
    }

    return $hd;
  }

  
  

  public static function getHotel2datenFromSessionRegardingWarenkorb($pWarenkorb)
  {
    $kursdaten = SessionOperations::getHotel2datenFromSession();
    if (is_null($pWarenkorb) && is_null($kursdaten)) {
      return array();
    }
    if (is_null($kursdaten)) {
      $kursdaten = array();
    }
    
    $knrsInWk = ArrayOperations::mapAttribut($pWarenkorb, 'id');
    $validKursData = array();
    foreach ($kursdaten as $kursdat) {
      if (in_array($kursdat->knr, $knrsInWk)) {
        $validKursData[] = $kursdat;
      }
    }
    
    $knrsMitHotelDaten = ArrayOperations::mapAttribut($validKursData, 'knr');
    foreach ($pWarenkorb as $wareKurs) {
      if (!in_array($wareKurs->id, $knrsMitHotelDaten)) {
        $tmpho = new AnmeldedatenHotel();
        $tmpho->knr = $wareKurs->id;
        $validKursData[] = $tmpho;
      }
    }

    return $validKursData;
  }
}