<?php

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


class WBAnmeldungZsa extends WBAnmeldungNormal
{
  private $expTeilnehmer;
  private $expHotel;
  private $webSettings;
  private $pflichtfeldFehlerArrayHotel = array();
  private $formatFehlerArrayHotel = array();

  public function __construct($urlparameter)
  {
    $this->anmeldeart = ANMELDEART_URL_ZSA;
    $this->expTeilnehmer = new ExpTeilnehmer();
    $this->expTeilnehmer->addSightInfo('hastologin', '0');
    
    $this->expTeilnehmer->export->expCalculation->enforceParamForValueTeilnehmerEdit = true;
    $this->expHotel = new ExpHotel();
    $this->webSettings = ToolSettingsAPI::getToolSettings(4);

    parent::__construct($urlparameter); 
  }

  
  public function _checkStep($ziel, $geprueft = 0)
  {
    if (!is_numeric($ziel) || $ziel <= 0) {
      $ziel = 1;
    }

    if ($ziel >= 1 && $geprueft < 1) {
      $this->setStepAndValidated(1);
    }

    if ($ziel >= 2 && $geprueft < 2) {
      $this->setStepAndValidated(2);
    }
    if ($ziel >= 3 && $geprueft < 3) {
      $tmpurlparam = new URLParameterAnmeldungZusatzPerson();
      $this->getSight(62);
      
      if ($ziel == 3 && RequestOperations::isPost() && $tmpurlparam->schrittback == '') {
        SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_HOTEL);
        $this->getTeilnehmerFromRequest2Session(); 
        
        $this->getBelegungFromRequest2Session();
        HotelOperations::getHoteldatenFromRequest2Session($this->warenkorb[0]->kurs->id);
      }

      
      
      
      $alreadyHasLogin = $this->tnAlreadyHasLogin();

      if ($alreadyHasLogin) {
        $this->expTeilnehmer->addSightInfo('hastologin', '1');
      }

      $this->checkEingaben();
      $this->checkHotelEingaben();
      if ($alreadyHasLogin || count($this->pflichtfeldFehlerArray) > 0 || count($this->pflichtfeldFehlerArrayHotel) > 0
              || count($this->formatFehlerArray) > 0 || count($this->formatFehlerArrayHotel) > 0) {
        $this->step = 2;
        SessionOperations::setVarValueWk('last_validated_step', 2);
        $this->setBackToStep(2);

        return;
      }

      $this->setStepAndValidated(3);
    }
    if ($ziel >= 4 && $geprueft <= 4) {
      if (SessionOperations::getVarValueWk('last_validated_step') == 3) {
        $this->setStepAndValidated(4);
      } else {
        $this->setBackToStep(2);
      }
    }
  }

  protected function getVorlageForMainCheck()
  {
    $hotelsight = SightsAPI::getSight(133);

    return $this->sight->body . $hotelsight->footer;
  }

  private function checkHotelEingaben()
  {
    $this->pflichtfeldFehlerArrayHotel = array();
    $this->formatFehlerArrayHotel = array();
    $this->getSight(133);
    $check = new WBAnmeldungCheckHoteldaten();
    $check->vorlage = $this->sight->body;
    
    $tmp = SessionOperations::getHoteldatenFromSession(true);
    $check->datamodul = $tmp[0];

    if (!$check->check()) {
      $this->pflichtfeldFehlerArrayHotel = $check->pflichtfeldFehlerArray;
      $this->formatFehlerArrayHotel = $check->formatFehlerArray;

      return false;
    } else {
      return true;
    }
  }

  protected function setStepAndValidated($pStep)
  {
    $this->step = $pStep;
    SessionOperations::setVarValueWk('last_validated_step', $pStep);
  }

  
  private function tnAlreadyHasLogin()
  {
    $result = false;
    if (!SessionOperations::isStammhoererLoggedIn()) {
      try {
        $tn = SessionOperations::getTeilnehmerFromSession()[0];
        $duplicateCheck = TeilnehmerAPI::isDublette($tn, TeilnehmerAPI::ALGORITHM_DUBLETTE_SIMPEL_GEBDAT);
        if ($duplicateCheck['sqlid'] > 0) {
          $dbwblogin = DBWorkWBLogins::getDefaultInstance();
          
          $login = $dbwblogin->getByTnr($duplicateCheck['sqlid']);
          $result = !$login->isEmpty();
        }
      } catch (Exception $e) {
        Logger::logg('Problem bei der Dublettenprüfung für ' . $tn->getVarValue('name') . ' ' . $tn->getVarValue('vorname') . ' (' . $tn->getVarValue('gebdat') . ') :' . $e->getMessage(), 6664);
      }
    }

    return $result;
  }

  
  public function content()
  {
    $isFehlerAufgetreten = (count($this->pflichtfeldFehlerArray) > 0 || count($this->formatFehlerArray) > 0);
    switch ($this->step) {
      default:
      case 1:
      case 2: 
        $this->dataarraybody = SessionOperations::getTeilnehmerFromSession();
        if ($isFehlerAufgetreten) {
          $this->warnungpflichtfelder(62, $this->expTeilnehmer);
        } else {
          $this->showsightcomplete(62, $this->expTeilnehmer);
        }

        $this->dataarrayfooter = $this->dataarraybody; 
        $this->dataarraybody = SessionOperations::getHoteldatenFromSession(true);

        $this->getsight(133);
        $this->exportadapter = $this->expHotel;
        if (count($this->pflichtfeldFehlerArrayHotel) > 0 || count($this->formatFehlerArrayHotel) > 0) {
          $this->warnungpflichtfelderHotel();
        }
        $this->showheader();
        $this->showbody();
        $this->exportadapter = $this->expTeilnehmer;
        $this->showfooter();
        break;
      case 3:
        $this->dataarrayheader = SessionOperations::getTeilnehmerFromSession();
        $this->anmeldungbestaetigen();
        break;
      case 4: 
        $this->anmeldungabschliessen();
        if ($this->webSettings->tnDatenBeiAnmeldungBehalten == 0) {
          SessionOperations::setVarValueAnm(ANMELDEART, null);
        }
        break;
    }
  }

  public function _anmeldungbestaetigenPersonenPart()
  {
    $retour = '';

    $this->dataarrayheader = SessionOperations::getTeilnehmerFromSession();
    $retour .= $this->getsightcomplete(61, new ExpTeilnehmer());

    return $retour;
  }

  public function _anmeldungbestaetigenKursPart($pKurse)
  {
    $retour = parent::_anmeldungbestaetigenKursPart($pKurse);
    $this->dataarraybody = $pKurse;

    
    $this->dataarraybody = SessionOperations::getHoteldatenFromSession(true);
    $this->dataarrayfooter = $this->dataarraybody;
    $retour .= $this->getsightcomplete(205, new ExpHotel());

    return $retour;
  }

  
  public function getTeilnehmerFromRequest2Session($pRequestPraefix = 'tedit', $pSessionSuffix = '')
  {
    parent::getTeilnehmerFromRequest2Session($pRequestPraefix, $pSessionSuffix);
  }

  private function warnungpflichtfelderHotel()
  {
    echo '<ul class="warnungpflichtfelder">';
    foreach ($this->pflichtfeldFehlerArrayHotel as $meldung) {
      if ($meldung != '') {
        echo '<li class="warnungpflichtfelder">' . CleanOperations::cleanStringContainingHtml($meldung) . '</li>';
      }
    }

    foreach ($this->formatFehlerArrayHotel as $value) {
      echo "  <li class='warnungvalidierung'>" . CleanOperations::cleanStringContainingHtml($value) . "</li>\n";
    }

    echo '</ul>';

    $this->exportadapter->setFehler($this->pflichtfeldFehlerArrayHotel, $this->formatFehlerArrayHotel);
  }

  public function anmeldungabschliessen($pMessage = '', $pSplitAnmeldungKurs = false)
  {
    
    if ($this->anmeldungNichtAbsendbarAbbruch($this->_getNichtAbsendbarSightID())) {
      return false;
    }

    $isAnmeldungZuOeffentlichemKurs = $this->isAnmeldungZuOeffentlichemKurs();

    
    $this->setHotelDatenToBemerkung();

    $anmeld = new BuchungsvorgangWEBBASys();
    $anmeld->createTNInfo();
    $anmeld->setKurseBySession();

    if ($isAnmeldungZuOeffentlichemKurs) {
      $anmeld->enforceAnmeldestatus('A');
    } else {
      $anmeld->enforceAnmeldestatus('I');
    }

    
    $this->setDsAbwZahler($anmeld);

    $anmeld->setBuchungsVars(); 

    $anmeld->buchungStep1(); 
    

    $erfolgreich = $anmeld->buchungStep2();
    $this->kurse_anmstatus = $anmeld->kurse_anmstatus;
    $htmlbest = $anmeld->getAnmeldebestaetigungHTML($pMessage);
    echo $htmlbest;

    $anmeld->sendTNBestaetigung();
    $anmeld->sendBestaetigungKopie();


    if (!$isAnmeldungZuOeffentlichemKurs) {
      
      
      
      $this->mailToBv();
    }

    $anmeld->cleanUp();

    if (!$erfolgreich) {
      return false;
    }

    return true;
  }

  private function isAnmeldungZuOeffentlichemKurs()
  {
    return \Kufer\Web\Classes\Api\Helpers\ZsaHelper::isOeffentlicherKurs($this->getKurs()->id);
  }

  private function setDsAbwZahler($pBuchungsVorgang)
  {
    
    $teilnehmer = SessionOperations::getTeilnehmerFromSession()[0];
    if ($teilnehmer->zsa_dienststelle > 0) {
      $dbwTn = DBWorkTeilnehmer::getDefaultInstance();
      $ds = $dbwTn->getTeilnehm($teilnehmer->zsa_dienststelle);
      $abwVars = array('kontonr', 'bankbez', 'blz', 'name', 'vorname', 'titel', 'geschlecht',
          'gebdat', 'bic', 'iban', 'strasse', 'zusatz', 'zusatz2');
      foreach ($abwVars as $v) {
        $pBuchungsVorgang->setKursInfoVarValue('abw_' . $v, $ds->getVarValue($v));
      }
      $pBuchungsVorgang->setKursInfoVarValue('abw_ort', $ds->getVarValue('nurort'));
      $pBuchungsVorgang->setKursInfoVarValue('abw_plz', $ds->getVarValue('nurplz'));
      $pBuchungsVorgang->setKursInfoVarValue('abw_email', $ds->getVarValueEx('email', 'kommunikation'));
      $pBuchungsVorgang->setKursInfoVarValue('abw_telefon', $ds->getVarValueEx('tel', 'kommunikation'));

      
      $pBuchungsVorgang->setKursInfoVarValue('abw_id', $ds->getVarValue('id'));
    }
  }

  private function setHotelDatenToBemerkung()
  {
    $tmp = SessionOperations::getHoteldatenFromSession();
    if (is_array($tmp) && $tmp[0] instanceof AnmeldedatenHotel) {
      $bemerkung = $tmp[0]->formatForBelegungExterneBemerkung();
      if ($bemerkung != '') {
        SessionOperations::setVarValueWk(
          'w_bemerkung',
          StringOperations::substr(SessionOperations::getVarValueWk('w_bemerkung') . $bemerkung, 0, 255)
        );
      }
    }
  }

  private function mailToBv()
  {
    $dbwKurse = DBWorkKurse::getDefaultInstance();
    $knr = $this->getKurs()->id;
    $zbIds = $dbwKurse->getParentCategoryIdsForKurs($knr);
    $dbwBkBvTn = DBWorkZsaBkBvTn::getDefaultInstance();
    $dbwBkBvTn->newSearch();
    $dbwBkBvTn->fromobject->zb = $zbIds;
    $bkBvTnBildungsverantwortliche = $dbwBkBvTn->getBildungsverantwortliche4Teilnehmer(SessionOperations::getCurrentStammhoererTnr());

    $tnBildungsverantwortliche = array();
    foreach ($bkBvTnBildungsverantwortliche as $bkbvtn) {
      
      $tnBildungsverantwortliche[$bkbvtn->teilnehmer->id] = $bkbvtn->teilnehmer;
    }

    $emailResult = array();
    foreach ($tnBildungsverantwortliche as $tnBv) {
      $emailResult = $this->sendMailAnmeldung($tnBv, SessionOperations::getWbLogin(), $dbwBkBvTn);
    }
    
    return in_array(true, $emailResult, true);
  }

  private function sendMailAnmeldung($tnBv, $wblogin, $dbwBkBvTn)
  {
    $zsaHelper = new \Kufer\Web\Classes\Api\Helpers\ZsaHelper($dbwBkBvTn);
    if ($zsaHelper->moeglichstWenigEmailsAnBvBkTn($tnBv->id)) {
      return true;
    }

    $betreff = ' Anmeldung zu einer Fortbildung im Bildungsportal (LEL)';

    $ansprache = ConstantOperations::getAnredeByGeschlecht($wblogin->geschlecht);
    $tnName = $ansprache . ' ' . $wblogin->vorname . ' ' . $wblogin->name;

    $kurs = $this->getKurs();

    $inhalt = $tnName . ' hat sich zur Fortbildung "' . $kurs->id . ' / ' . $kurs->kurzbez . '" angemeldet.<br>';
    $inhalt .= 'Bitte prüfen Sie diese.<br><br>';
    $inhalt .= $zsaHelper->getLinkKuferTools();

    if (DEVELOP) {
      $inhalt .= BR . BR . $tnBv->getVarValue('email_anzeige');
    }

    return smtpMail::sendStandardHtmlMail($tnBv->getVarValue('email_anzeige'), $betreff, $inhalt);
  }

  private function getKurs()
  {
    return $this->dbwWk->getKurse()[0];
  }
}