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


class Bucher
{
  
  public $_zentraleEinstellungen;
  public $id;

  public function __construct($pZentraleEinstellungen)
  {
    $this->id = microtime();
    if ($pZentraleEinstellungen != null) {
      $this->_zentraleEinstellungen = $pZentraleEinstellungen;
    } else {
      $this->_zentraleEinstellungen = new ZentraleEinstellungen();
    }
  }

  


  
  public function doBuchungStep1($pKurs, $pTNInfo, $pEPayInfo = null, $pAnmeldungenEinzeln = false, $pAnmbeginnIgnorieren = false)
  {
    return 0;
  }

  
  public function doBuchungStep2($pKurs, $pTNInfo, $pEPayInfo = null)
  {
    return 0;
  }

  
  public function isAnmNecessary($pStatus)
  {
    switch ($pStatus) {
      case ANMELDUNGONLINE_KNRUNGUELTIG:
        return false;
      case ANMELDUNGONLINE_AUSFALL:
        return (bool)$this->_zentraleEinstellungen->anmKursAusfallDoAnm;
      case ANMELDUNGONLINE_ABSCHLUSS:
        return (bool)$this->_zentraleEinstellungen->anmKursAbgeschlDoAnm;
      case ANMELDUNGONLINE_ANMELDEBEGINN:
        return (bool)$this->_zentraleEinstellungen->anmAnmBeginnDoAnm;
      case ANMELDUNGONLINE_ANMELDESCHLUSS:
        return (bool)$this->_zentraleEinstellungen->anmAnmSchlussDoAnm;
      case ANMELDUNGONLINE_KURSENDE:
        return (bool)$this->_zentraleEinstellungen->anmKursEndeDoAnm;
      case ANMELDUNGONLINE_KURSVOLL:
        return (bool)$this->_zentraleEinstellungen->anmKursVollDoAnm;
      case ANMELDUNGONLINE_OK:
      case ANMELDUNGONLINE_OFFLINE:
        return true;
      case ANMELDUNGONLINE_TECHNISCHEPROBLEME:
        return false;
      default:
        DebugOperations::writeLogDatei(__CLASS__ . '::doBuchungStep1: ungültiger Returnwert(' . $pStatus . ') von DBWorkKurse::platzfrei');
        DebugOperations::showUserMessageAndDie();
    }
  }

  public function setZentraleEinstellungen($pEinstellungen)
  {
    $this->_zentraleEinstellungen = $pEinstellungen;
  }

  
  public static function getEmailXMLKurseFromKursBuchung($pKursbuchung, $pHotel = null)
  {
    $emailxmlkurse = new EmailXMLKurse();
    for ($i = 0; $i < $emailxmlkurse->getVarCount(); $i++) {
      $varname = $emailxmlkurse->getVarName($i);
      $value = $pKursbuchung->getKursVarValue($varname);
      
      if ($varname == 'zahlart' && $value == 'epay') {
        $value = '';
      }
      if ($value !== '') {
        $emailxmlkurse->{$varname} = $value;
      }
    }
    for ($i = 0; $i < $pKursbuchung->getAnzahlWeitere(); $i++) {
      $emailxmlkurse->addWeitere(static::getEmailXMLWeitereFromKursBuchung($pKursbuchung, $i));
    }
    if ($pHotel != null) {
      $xmlhotel = new EmailXMLHotel();
      $xmlhotel->copyFromAnmeldedatenHotel($pHotel);
      $emailxmlkurse->hotelAnm = $xmlhotel;
    }
    
    $emailxmlkurse->gutschein_empfaenger = SessionOperations::getVarValueGv('empfaenger');
    $emailxmlkurse->is_gutschein = (SessionOperations::getVarValueGv('is_gutscheinbestellung', false)) ? 'W' : 'F';
    $emailxmlkurse->gutschein_id = SessionOperations::getVarValueGv('gutschein_id', -1);

    if ($pKursbuchung->getKursVarValue('abw_dse')) {
      $emailxmlkurse->dse_unterschrieben_datum = DateTimeOperations::getDateTimeNow();
      $emailxmlkurse->dse_unterschrieben_weg = 'I';
    }

    
    return $emailxmlkurse;
  }

  
  public static function getEmailXMLWeitereFromKursBuchung($pKursbuchung, $pIndex)
  {
    $emailxmlweitere = new EmailXMLWeitere();
    for ($i = 0; $i < $emailxmlweitere->getVarCount(); $i++) {
      $varname = $emailxmlweitere->getVarName($i);
      $emailxmlweitere->{$varname} = $pKursbuchung->getWeitereVarValue($varname, $pIndex);
    }
    $hoteldatenWeiterer = $pKursbuchung->getWeitereVarValue('hotelDaten', $pIndex);
    if ($hoteldatenWeiterer instanceof AnmeldedatenHotel) {
      $xmlhotel = new EmailXMLHotel();
      $xmlhotel->copyFromAnmeldedatenHotel($hoteldatenWeiterer);
      $emailxmlweitere->hotelAnm = $xmlhotel;
    }

    return $emailxmlweitere;
  }

  
  public static function getEmailXMLFromTeilnehmer($pTeilnehmer)
  {
    $emailxml = new EmailXML();
    $excludes = array('arykennzeichen', 'noWerbBemerk', 'aryattachments', 'arybranchen');

    for ($i = 0; $i < $emailxml->getVarCount(); $i++) {
      $varname = $emailxml->getVarName($i);
      if (!in_array($varname, $excludes)) {
        $value = $pTeilnehmer->getVarValue(
          $emailxml->getVarName4Person($varname)
        );

        
        if (($varname == 'kontonr' || $varname == 'iban') && (preg_match('/\\*/', $value) != 0)) {
          $value = '';
        }

        if ($value !== '') {
          $emailxml->{$varname} = $value;
        }
      }
    }

    
    
    if (isset($pTeilnehmer->id) && $pTeilnehmer->id != '') {
      $emailxml->tnr = $pTeilnehmer->id;
    } else {
      $emailxml->tnr = 0;
    }
    
    if ($emailxml->tnr > 0) {
      $emailxml->status = 1;
    } else {
      $emailxml->status = 0;
    }

    
    
    $emailxml->typ = '';

    
    if ($emailxml->newsl_erlaubt === '1') {
      $emailxml->newsl_erlaubt = 'J';
    }
    
    if ($emailxml->wblogin === '1') {
      $emailxml->wblogin = 'W';
    }
    
    if ($emailxml->keinebankverbindung === '1') {
      $emailxml->keinebankverbindung = 'W';
    } else {
      $emailxml->keinebankverbindung = 'F';
    }

    
    if ($emailxml->weitergabekommunikationfg == 1) {
      $emailxml->weitergabekommunikationfg = 'W';
    } else {
      $emailxml->weitergabekommunikationfg = 'F';
    }

    
    if ($emailxml->nicht_auf_dioezesanliste == 1) {
      $emailxml->nicht_auf_dioezesanliste = 'F'; 
    } else {
      $emailxml->nicht_auf_dioezesanliste = 'W';
    }

    
    if ($emailxml->zustimmung_hygiene == 1) {
      $emailxml->zustimmung_hygiene = 'W';
    } else {
      $emailxml->zustimmung_hygiene = 'F';
    }
    if ($emailxml->zustimmung_indiv == 1) {
      $emailxml->zustimmung_indiv = 'W';
    } else {
      $emailxml->zustimmung_indiv = 'F';
    }
    if ($emailxml->zustimmung_fuehrung == 1) {
      $emailxml->zustimmung_fuehrung = 'W';
    } else {
      $emailxml->zustimmung_fuehrung = 'F';
    }

    $emailxml->rech_dauerhaft = $emailxml->rech_dauerhaft == 1 ? 'W' : 'F';

    
    if (trim($pTeilnehmer->getVarValue('titel')) != '') {
      $emailxml->vorname = trim(trim($pTeilnehmer->getVarValue('titel')) . ' ' . trim($pTeilnehmer->getVarValue('vorname')));
    }

    
    if (trim($pTeilnehmer->getVarValue('gebjahr')) != ''
      && DateTimeOperations::isDateTimeEmptyOrDefault(trim($pTeilnehmer->getVarValue($emailxml->getVarName4Person('gebdatum'))))) {
      $emailxml->gebdatum = '01.01.' . trim($pTeilnehmer->getVarValue('gebjahr'));
    }

    
    if (($pTeilnehmer->getVarValueEx('tel', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        KommunikationOperations::getKommArt($pTeilnehmer->getVarValueEx('tel', 'kommunikation')),
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'tel', 'Telefon'),
        $pTeilnehmer->getVarValueEx('tel', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('tel2', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        KommunikationOperations::getKommArt($pTeilnehmer->getVarValueEx('tel2', 'kommunikation') ?? ''),
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'tel2', 'Dienstlich'),
        $pTeilnehmer->getVarValueEx('tel2', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('tel3', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        KommunikationOperations::getKommArt($pTeilnehmer->getVarValueEx('tel3', 'kommunikation')),
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'tel3', 'Telefon'),
        $pTeilnehmer->getVarValueEx('tel3', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('tel4', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        KommunikationOperations::getKommArt($pTeilnehmer->getVarValueEx('tel4', 'kommunikation')),
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'tel4', 'Telefon'),
        $pTeilnehmer->getVarValueEx('tel4', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('tel5', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        KommunikationOperations::getKommArt($pTeilnehmer->getVarValueEx('tel5', 'kommunikation')),
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'tel5', 'Dienstlich'),
        $pTeilnehmer->getVarValueEx('tel5', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('tel6', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        KommunikationOperations::getKommArt($pTeilnehmer->getVarValueEx('tel6', 'kommunikation')),
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'tel6', 'Telefon'),
        $pTeilnehmer->getVarValueEx('tel6', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('mobil', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'M',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'mobil', 'Mobil'),
        $pTeilnehmer->getVarValueEx('mobil', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('mobil2', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'M',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'mobil2', 'Mobil'),
        $pTeilnehmer->getVarValueEx('mobil2', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('mobil3', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'M',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'mobil3', 'Mobil'),
        $pTeilnehmer->getVarValueEx('mobil3', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('fax', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'F',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'fax', 'Fax'),
        $pTeilnehmer->getVarValueEx('fax', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('fax2', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'F',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'fax2', 'Fax'),
        $pTeilnehmer->getVarValueEx('fax2', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('fax3', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'F',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'fax3', 'Fax'),
        $pTeilnehmer->getVarValueEx('fax3', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('email', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'E',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'email', 'E-Mail'),
        $pTeilnehmer->getVarValueEx('email', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('email_2', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'E',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'email_2', 'E-Mail'),
        $pTeilnehmer->getVarValueEx('email_2', 'kommunikation')
      );
    }
    if (($pTeilnehmer->getVarValueEx('email_3', 'kommunikation') ?? '') !== '') {
      $emailxml->addKommunikationByParam(
        'E',
        SessionOperations::getVarValueAnm(PREFIX_KOMMBEZ . 'email_3', 'E-Mail'),
        $pTeilnehmer->getVarValueEx('email_3', 'kommunikation')
      );
    }


    
    if (trim($pTeilnehmer->getVarValue('ort')) == '') {
      
      $emailxml->ort = trim($pTeilnehmer->getVarValue('nurplz'));
      if ($emailxml->ort !== '' && trim($pTeilnehmer->getVarValue('nurort') != '')) {
        $emailxml->ort .= ' ' . trim($pTeilnehmer->getVarValue('nurort'));
      } elseif ($emailxml->ort === '' && trim($pTeilnehmer->getVarValue('nurort') != '')) {
        $emailxml->ort .= trim($pTeilnehmer->getVarValue('nurort'));
      }
    }
    if (trim($pTeilnehmer->getVarValue('strasse')) == '') {
      $emailxml->strasse = trim($pTeilnehmer->getVarValue('nurstrasse'));
      if ($emailxml->strasse !== '' && trim($pTeilnehmer->getVarValue('nurhausnr') != '')) {
        $emailxml->strasse .= ' ' . trim($pTeilnehmer->getVarValue('nurhausnr'));
      } elseif ($emailxml->strasse === '' && trim($pTeilnehmer->getVarValue('nurhausnr') != '')) {
        $emailxml->strasse = trim($pTeilnehmer->getVarValue('nurhausnr'));
      }
    }

    
    if ($pTeilnehmer->hasKennzeichen()) {
      foreach ($pTeilnehmer->arykennzeichen as $kennz) {
        $emailxml->addKennzeichenByParam($kennz->kennz);
        
      }
    }
    
    if ($pTeilnehmer->hasBranchen()) {
      foreach ($pTeilnehmer->arybranchen as $key => $branchen) {
        foreach ($branchen->kennz as $index => $branche) {
          if (!is_array($branchen->kennz[$index])) {
            $emailxml->addBranchenByParam($branchen->kennz[$index]);
          }
        }
      }
    }
    
    if (DBWorkBASysSettings::isBlak() && (!SessionOperations::isKuferTools())) {
      if ($pTeilnehmer->beruf != '') {
        for ($kennz = 11; $kennz <= 14; $kennz++) {
          if ($pTeilnehmer->beruf == ConstantOperations::getBlakBerufsgruppenNamen($kennz)) {
            $emailxml->addKennzeichenByParam($kennz);
            break;
          }
        }
      }
    }

    if (!\SessionOperations::isKuferTools()) {
      $emailxml->staatsang = \MehrsprachigkeitOperations::translateStaatsangToOriginalLanguage($emailxml->staatsang);
      $emailxml->nation = \MehrsprachigkeitOperations::translateNationToOriginalLanguage($emailxml->nation);
    }

    
    if ($pTeilnehmer->hasAttachments()) {
      foreach ($pTeilnehmer->aryattachments as $attachment) {
        $emailxml->addAttachmentByParam($attachment->name, $attachment->localname, $attachment->type, $attachment->nachweis, $attachment->beschreibung);
      }
    }

    if (StringOperations::strtoupper(get_class($pTeilnehmer)) !== 'KIND') {
      
      if (in_array($pTeilnehmer->nowerbung, array('W', '1', 'J'))) {
        $emailxml->addKWerbByParam('P', 'W', $pTeilnehmer->nowerbbemerk);
      } elseif (in_array($pTeilnehmer->nowerbung, array('F', '0', 'N'))) {
        $emailxml->addKWerbByParam('P', 'F', $pTeilnehmer->nowerbbemerk);
      }
      
      if (in_array($pTeilnehmer->notelwerbung, array('W', '1', 'J'))) {
        $emailxml->addKWerbByParam('T', 'W', $pTeilnehmer->notelwerbungbemerk);
      } elseif (in_array($pTeilnehmer->notelwerbung, array('F', '0', 'N'))) {
        $emailxml->addKWerbByParam('T', 'F', $pTeilnehmer->notelwerbungbemerk);
      }
      
      if (in_array($pTeilnehmer->nomailwerbung, array('W', '1', 'J'))) {
        $emailxml->addKWerbByParam('E', 'W', $pTeilnehmer->nomailwerbungbemerk);
      } elseif (in_array($pTeilnehmer->nomailwerbung, array('F', '0', 'N'))) {
        $emailxml->addKWerbByParam('E', 'F', $pTeilnehmer->nomailwerbungbemerk);
      }
    }

    
    if (isset($pTeilnehmer->dse) && $pTeilnehmer->dse) {
      $emailxml->dse_unterschrieben_datum = DateTimeOperations::getDateTimeNow();
      $emailxml->dse_unterschrieben_weg = 'I';
    }

    if (($pTeilnehmer->rech_email_check ?? false) && (!isset($pTeilnehmer->rech_email) || trim($pTeilnehmer->rech_email) === '')) {
      $pTeilnehmer->rech_email = $pTeilnehmer->email->wert;
    }

    
    $emailxml->sessionid = SessionOperations::getSessionID();
    $emailxml->sessiontime = SessionOperations::getSessionTime();
    
    $dtop = new DateTimeOperations();
    $emailxml->eingelesen = $dtop->getDateTimeNow();

    
    if (StringOperations::strtolower(get_class($pTeilnehmer)) == 'kind') {
      $emailxml->bemerkung = $pTeilnehmer->getVarValue('info');
    }

    return $emailxml;
  }

  
  protected function getTestHotelDaten()
  {
    $hotel = new AnmeldedatenHotel();
    $hotel->uebernachtung_jn = 'J';
    $hotel->zimmerart = 'a';
    $hotel->zimmergebuehr = 2.0;
    $hotel->essengebuehr = 3.0;
    $hotel->dz_mit = 'J';
    $hotel->dz_statt_ez_ok = 'J';
    $hotel->sw_zimmer1 = 'a';
    $hotel->sw_zimmer2 = 'a';
    $hotel->sw_essen1 = 'a';
    $hotel->sw_essen2 = 'a';
    $hotel->essen_jn = 'J';
    $hotel->kein_fruehstueck = 'J';
    $hotel->kein_abendessen = 'J';
    $hotel->keine_weitergabe_name = 'J';

    return $hotel;
  }

  public function writeAnmeldelogCsv($pKurs, $pTNInfo)
  {
    $tn = $pTNInfo->getTeilnehmer();
    $knr = $pKurs->getKursVarValue('kursnummer');

    $ipPart = '';
    if ($this->_zentraleEinstellungen->loggip) {
      $ipPart = 'IP: ' . RequestOperations::getClientIPAddress();
    }

    $einleitungstext = $this->getCsvLogBegin();

    $knr = $knr . ';';
    $tnvorname = $tn->getVarValue('vorname') . ';';
    $tnnachname = $tn->getVarValue('name') . ';';
    $tnemail = $tn->getVarValueEx('email', 'kommunikation') . ';';
    $tntel = $tn->getVarValueEx('tel', 'kommunikation') . ';';
    $tnip = $ipPart . ';';
    $tnweitere = $pKurs->getAnzahlWeitere() . ' Weitere;';
    $tnstatus = 'Status ' . $pKurs->getKursVarValue('status') . ';';
    $msg = $einleitungstext . $knr . $tnvorname . $tnnachname . $tnemail . $tntel . $tnip . $tnweitere . $tnstatus;
    LoggerAnmeldung::logg($msg, 3);
  }

  protected function getCsvLogBegin()
  {
    return 'Anmeldung wird/wurde gerade bearbeitet. Anmeldedaten: ';
  }

  protected function getAnzahlTeilnehmerKinderAnmeldungen(\KursBuchung $kursbuchung): array
  {
    $anmart = $kursbuchung->getWeitereVarValue('typ', 0);
    if (StringOperations::strtoupper($anmart) === 'K') {
      return array(1, $kursbuchung->getKursVarValue('anzahl') - 1);
    } elseif (StringOperations::strtoupper($anmart) === 'F') { 
      return array($kursbuchung->getKursVarValue('anzahl') - 1, 0);
    } else {
      return array($kursbuchung->getKursVarValue('anzahl'), 0);
    }
  }
}