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


class WBAnmeldungInnsbruckStadt extends WBAnmeldungNormal
{
  private $expTeilnehmer;
  private $webSettings;
  private $sightIdEingabe = 573;
  private $sightIdKontrolle = 574;
  private $tnr;
  private $dbwTn;
  private $kinder;

  public function __construct($urlparameter)
  {
    $this->anmeldeart = ANMELDEART_URL_NORMAL;
    $this->expTeilnehmer = new ExpTeilnehmer();
    $this->expTeilnehmer->export->expCalculation->enforceParamForValueTeilnehmerEdit = true;
    $this->webSettings = ToolSettingsAPI::getToolSettings(4);
    $this->tnr = SessionOperations::getVarValueWk('w_tnr');

    $this->dbwTn = DBWorkTeilnehmer::getDefaultInstance();

    parent::__construct($urlparameter); 
  }

  private function getKinder()
  {
    if (is_null($this->kinder)) {
      $this->kinder = $this->dbwTn->getKinderAnhandBeziehung($this->tnr);
    }

    return $this->kinder;
  }

  
  public function _checkStep($ziel, $geprueft = 0)
  {
    if (!is_numeric($ziel) || $ziel <= 0) {
      $ziel = 1;
    }
    
    $this->setStepAndValidated(2);
    if (!SessionOperations::isStammhoererLoggedIn()) {
      return;
    }
    if ($ziel >= 3) {
      if ($geprueft >= 3) {
        $this->setStepAndValidated(3);
      } else {
        $tmpurlparam = new URLParameterAnmeldungZusatzPerson();
        $this->getSight($this->sightIdEingabe);
        
        if ($ziel == 3 && RequestOperations::isPost() && $tmpurlparam->schrittback == '') {
          SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_FIRMA);
          
          
          SessionOperations::setVarValueWk('w_agb', PostOperations::getVarValue('tedit_agb'));
          $bemerkung = trim(PostOperations::getVarValue('tedit_bemerkung'));
          SessionOperations::setVarValueWk('w_bemerkung', $bemerkung);

          if ($bemerkung != '' && (!ctype_digit($bemerkung) || $bemerkung < 0 || $bemerkung > 3)) {
            $this->pflichtfeldFehlerArray['bemerkung'] = 'Die Anzahl der Begleitpersonen muss zwischen 0 und 3 liegen.';
          }

          $this->getBelegungFromRequest2Session();

          
          $success = $this->gewaehlteKinderAlsMitarbeiterInSessionSchreiben();
          if (!$success) {
            $this->pflichtfeldFehlerArray['fehlerKindHinzufuegen'] = 'Es gab einen technischen Fehler beim Hinzufügen Ihres Kindes. Bitte versuchen Sie es erneut.';
          }
        }

        
        $check = new WBAnmeldungCheckHauptTN();
        $check->suppressInfoMail = true;
        $this->checkEingaben($check);

        if (count($this->getGewaehlteKinderIds()) < 1) {
          $this->pflichtfeldFehlerArray['keineKinder'] = 'Sie haben keine Kinder ausgewählt';
        }

        if (count($this->pflichtfeldFehlerArray) > 0 || count($this->formatFehlerArray) > 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 setStepAndValidated($pStep)
  {
    $this->step = $pStep;
    SessionOperations::setVarValueWk('last_validated_step', $pStep);
  }

  private function gewaehlteKinderAlsMitarbeiterInSessionSchreiben()
  {
    $kinderInfos = RequestOperations::getVarValue('bedit_fp_kinder', array());

    
    $kinderInfosAry = array_map(function($kinderInfo) {
      $kindAry = explode('_:_', $kinderInfo);
      $kind = new Teilnehmer();
      $kind->id = $kindAry[0];
      $kind->name = $kindAry[1];
      $kind->vorname = $kindAry[2];
      $kind->gebdat = $kindAry[3];

      return $kind;
    }, $kinderInfos);

    $kinderByTnrs = ArrayOperations::setAttributAsKey($kinderInfosAry, 'id');

    $gewaehlteKinder = array_values(array_filter(
      $this->getKinder(),
      function($kind) use ($kinderByTnrs) {
        return
                
                
                isset($kinderByTnrs[$kind->id])
                && $kinderByTnrs[$kind->id]->name == $kind->name
                && $kinderByTnrs[$kind->id]->vorname == $kind->vorname
                && $kinderByTnrs[$kind->id]->gebdat == $kind->gebdat; 
      }
    )); 

    $fields = array('name' => 'name', 'vorname' => 'vorname', 'gebdat' => 'gebdat', 'id' => 'tnr');
    $kinderCount = count($gewaehlteKinder);
    $kinderCountOld = SessionOperations::getVarValueWk('gAnzahl_Mitarbeiter', 0);
    if ($kinderCountOld > $kinderCount) {
      for ($i = $kinderCountOld; $i > $kinderCount; $i--) {
        foreach ($fields as $nameSession) {
          $sessionName = 'w_' . $nameSession . '_ma' . $i;
          SessionOperations::setVarValueWk($sessionName, null);
        }
      }
    }

    if (count($gewaehlteKinder) != count($kinderByTnrs)) {
      return false;
    }

    for ($i = 1; $i <= $kinderCount; $i++) {
      $kind = $gewaehlteKinder[$i - 1];
      $kind->id = $this->getKuferSqlTnrAndCheckData($kind->id, $kind);
      foreach ($fields as $nameDatamodul => $nameSession) {
        $sessionName = 'w_' . $nameSession . '_ma' . $i;
        SessionOperations::setVarValueWk($sessionName, $kind->getVarValue($nameDatamodul));
      }
    }
    SessionOperations::setVarValueWk('gAnzahl_Mitarbeiter', $kinderCount);

    return true;
  }

  private function getKuferSqlTnrAndCheckData($tnIdAufReplikatDb, $tnObject)
  {
    $abgleichApi = new AbgleichAPI();
    $tnIdAufOriginalDb = $abgleichApi->getOriginalId('teilnehm', $tnIdAufReplikatDb);
    

    
    
    
    $tnMssql = TeilnehmerAPI::getTeilnehmerInfosPerDMZ($tnIdAufOriginalDb);
    
    
    
    
    $ok = StringOperations::strtolower($tnMssql->name) === StringOperations::strtolower($tnObject->name)
            && StringOperations::strtolower($tnMssql->vorname) === StringOperations::strtolower($tnObject->vorname);

    if (!$ok) {
      Logger::logg("Problem bei Anmeldung Innsbruck: Teilnehmerdaten konnten nicht mit vermeintlicher Tnr (KuferSQL: $tnIdAufOriginalDb , Replikat: $tnIdAufReplikatDb)"
              . ' aus KuferSQL DB gelesen werden - schlechter Übertragungszeitpunkt?!'
              . 'KuferSQL: ' . $tnMssql->vorname . ' ' . $tnMssql->name . ' <> MySQL: ' . $tnObject->vorname . ' ' . $tnObject->name, 8010);
      try {
        
        $tnIdAry = TeilnehmerAPI::isDublette($tnObject, $this->dublettenAlgorithmus);
        $tnIdAufOriginalDb = $tnIdAry['sqlid'];

        if (false === $tnIdAufOriginalDb) {
          Logger::logg('Problem bei Anmeldung Innsbruck: Teilnehmer konnte auch nicht als Dublette in KuferSQL DB gefunden werden', 8011);
        } else {
          

          $tnMssql = TeilnehmerAPI::getTeilnehmerInfosPerDMZ($tnIdAufOriginalDb);
          
          $ok = StringOperations::strtolower($tnMssql->name) === StringOperations::strtolower($tnObject->name)
                  && StringOperations::strtolower($tnMssql->vorname) === StringOperations::strtolower($tnObject->vorname);
          if (!$ok) {
            
            Logger::logg("Problem bei Anmeldung Innsbruck: Teilnehmer wurde beim 2. Versuch als Dublette ($tnIdAufOriginalDb) in KuferSQL DB gefunden, aber Kontrolle fehlgeschlagen."
              . 'KuferSQL: ' . $tnMssql->vorname . ' ' . $tnMssql->name . ' <> MySQL: ' . $tnObject->vorname . ' ' . $tnObject->name, 8012);

            return false;
          } else {
            Logger::logg("Anmeldung Innsbruck: Teilnehmer wird mit gefundener Dublette ($tnIdAufOriginalDb) weitergemacht", 8013);
          }
        }
      } catch (Exception $e) {
        
        Logger::logg($e->getMessage(), 200);
        die('Ein Fehler ist aufgetreten - es konnte kein Dublettenprüfung auf der Original-DB durchgeführt werden');
      }
    }

    return $tnIdAufOriginalDb;
  }

  
  public function content()
  {
    SessionOperations::setVarValueAnm(ANMELDEART, ANMELDEART_INTERN_FIRMA);
    $isFehlerAufgetreten = (count($this->pflichtfeldFehlerArray) > 0 || count($this->formatFehlerArray) > 0);
    switch ($this->step) {
      default:
      case 1:
      case 2: 
        $this->dataarraybody = SessionOperations::getTeilnehmerFromSession();

        $this->expTeilnehmer->setSightInfo('kinder', $this->getKinder());
        $this->expTeilnehmer->setSightInfo('gewaehlteKinder', $this->getGewaehlteKinderIds());

        if ($isFehlerAufgetreten) {
          $this->warnungpflichtfelder($this->sightIdEingabe, $this->expTeilnehmer);
        } else {
          $this->showsightcomplete($this->sightIdEingabe, $this->expTeilnehmer);
        }

        break;
      case 3:
        $this->anmeldungbestaetigen();
        break;
      case 4: 
        $bemerkung = trim(SessionOperations::getVarValueWk('w_bemerkung', ''));
        if ($bemerkung != '' && ctype_digit($bemerkung)) {
          if ($bemerkung < 0 || $bemerkung > 3) {
            Logger::logg('Anmeldung Innsbruck Stadt: ungültige Anzahl an erwachsenen Begleitpersonen: ' . $bemerkung, 500);
            $this->showAnmeldungFehlgeschlagen();
            break;
          }

          $anzahlWeitere = $bemerkung;
          $dbwTeilnehm = new DBWorkTeilnehmer();

          if (!is_numeric($this->webSettings->tnrBegleitperson)) {
            Logger::logg('Anmeldung Innsbruck Stadt: Teilnehmernummer für erwachsene Begleitperson ist keine Zahl. TNR:' . $this->webSettings->tnrBegleitperson, 500);
            $this->showAnmeldungFehlgeschlagen();
            break;
          }
          $tn = $dbwTeilnehm->getTeilnehm($this->webSettings->tnrBegleitperson);


          if ($tn->id <= 0) {
            Logger::logg('Anmeldung Innsbruck Stadt: Teilnehmernummer für erwachsene Begleitperson nicht gefunden. TNR:' . $this->webSettings->tnrBegleitperson, 500);
            $this->showAnmeldungFehlgeschlagen();
            break;
          }

          $this->entferneBegleitpersonenAusSession();

          $anzahlAktuellMitarbeiter = SessionOperations::getVarValueWk('gAnzahl_Mitarbeiter', 0);
          $anzahlTmp = $anzahlAktuellMitarbeiter;

          for ($i = $anzahlAktuellMitarbeiter; $i < $anzahlAktuellMitarbeiter + $anzahlWeitere; $i++) {
            $anzahlTmp++;
            SessionOperations::setVarValueWk('w_name_ma' . ($i + 1), $tn->name);
            SessionOperations::setVarValueWk('w_vorname_ma' . ($i + 1), $tn->vorname);
            SessionOperations::setVarValueWk('w_gebdat_ma' . ($i + 1), $tn->gebdat);
            SessionOperations::setVarValueWk('w_tnr_ma' . ($i + 1), $tn->id);
          }
          SessionOperations::setVarValueWk('gAnzahl_Mitarbeiter', $anzahlTmp);
        }
        $this->anmeldungabschliessen();

        
        SessionOperations::setVarValueWk('w_bemerkung', null);
        SessionOperations::setVarValueAnm(ANMELDEART, null);
        SessionOperations::setVarValueWk('gAnzahl_Mitarbeiter', 0);
        break;
    }
  }

  private function entferneBegleitpersonenAusSession()
  {
    $anzahlAktuellMitarbeiter = SessionOperations::getVarValueWk('gAnzahl_Mitarbeiter', 0);
    if (is_numeric($anzahlAktuellMitarbeiter) && $anzahlAktuellMitarbeiter > 0 && SessionOperations::getVarValueWk('w_tnr_ma' . ($anzahlAktuellMitarbeiter)) == $this->webSettings->tnrBegleitperson) {
      SessionOperations::setVarValueWk('w_name_ma' . ($anzahlAktuellMitarbeiter), null);
      SessionOperations::setVarValueWk('w_vorname_ma' . ($anzahlAktuellMitarbeiter), null);
      SessionOperations::setVarValueWk('w_gebdat_ma' . ($anzahlAktuellMitarbeiter), null);
      SessionOperations::setVarValueWk('w_tnr_ma' . ($anzahlAktuellMitarbeiter), null);
      SessionOperations::setVarValueWk('gAnzahl_Mitarbeiter', $anzahlAktuellMitarbeiter - 1);

      $this->entferneBegleitpersonenAusSession();
    }
  }

  private function showAnmeldungFehlgeschlagen()
  {
    $dmbasis = new DataMenuBasis(null);
    $dmbasis->exportadapter = new ExpBasis();
    $dmbasis->getsight($this->_getNichtAbsendbarSightID());
    $dmbasis->dataarraynodata = array(new Datamodul());
    echo $dmbasis->getnodata();
  }

  private function getGewaehlteKinderIds()
  {
    $kinderCount = SessionOperations::getVarValueWk('gAnzahl_Mitarbeiter', 0);
    $result = array();
    for ($i = 1; $i <= $kinderCount; $i++) {
      $sessionName = 'w_tnr_ma' . $i;
      $result[] = SessionOperations::getVarValueWk($sessionName, 0);
    }

    return $result;
  }

  public function _anmeldungbestaetigenPersonenPart()
  {
    return '';
    
  }

  public function _anmeldungbestaetigenKursPart($pKurse)
  {
    $retour = '';
    $this->dataarrayfooter = $this->dataarrayheader = SessionOperations::getTeilnehmerFromSession();
    $this->dataarraybody = $pKurse;
    
    $this->expTeilnehmer->setSightInfo('kinderAusMa', SessionOperations::getMitarbeiterFromSession());
    $retour .= $this->getsightcomplete($this->sightIdKontrolle, new ExpKursuebersicht(), $this->expTeilnehmer);

    return $retour;
  }

  protected function _anmeldungbestaetigenFusszeile()
  {
    return '';
  }

  protected function getBuchungsVorgang()
  {
    $bv = parent::getBuchungsVorgang();
    $bv->erlaubeAlleGeschlechterBeiFirmenanmeldung = true;

    return $bv;
  }

  protected function anmeldungabschliessenHookAfterSetKurse($pBuchungsVorgang)
  {
    $kurse = $this->dbwWk->getKurse();
    $mitveranstalterKurse = array();
    foreach ($kurse as $kurs) {
      if ($kurs->isMitveranstalterKurs()) {
        $mitveranstalterKurse[] = $kurs->id;
      }
    }
    $pBuchungsVorgang->enforceAnmeldestatus('G', $mitveranstalterKurse);

    return $pBuchungsVorgang;
  }
}