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


class DataMenuLoginKinderAnhandBeziehungHinzufuegen extends DataMenuMain
{
  public function __construct($urlparameter)
  {
    parent::__construct($urlparameter);
    $this->exportadapter = new ExpTeilnehmer();
    $this->exportadapter->export->initiate();
    $this->exportadapter->export->expCalculation->enforceParamForValueTeilnehmerEdit = true;
  }

  public function getSight($sightid = 588)
  {
    parent::getSight($sightid);
  }

  public function mainmenu()
  {
    $stammhoererTnr = SessionOperations::getVarValueWk('w_tnr', 0);
    $this->getsight();

    if (is_numeric($stammhoererTnr) && $stammhoererTnr > 0) {
      $xsrf = Xsrf::checkAndUseXsrfFromGet('WbAddKind');
      if ($this->_isFormularSent() && $xsrf == Xsrf::KEY_OK) {
        $newKind = $this->getKindFromPost();
        if ($this->_isFormularValid($newKind)) {
          $success = true;
          try {
            $changedFiedls = $this->_getRelevantChangedLoginFields($newKind, new Teilnehmer());
            TeilnehmerAPI::insertTeilnehmer4DMZ($newKind, array(), array(), $changedFiedls);
            $elternKindBeziehung = $this->getElternKindBeziehung($stammhoererTnr, $newKind->id);
            $success = BeziehungAPI::insertBeziehung($elternKindBeziehung);
            
          } catch (Exception $e) {
            Logger::logg('DatamanuLoginKinderAnhandBeziehungHinzufuegen: Folgende Exception ist aufgetreten: ' . $e->getMessage(), 200);
            $success = false;
          }

          if ($success) {
            $this->addStatus('Die Daten Ihres Kindes wurden erfolgreich geändert.', 'success');

            
            $dm = new DataMenuLoginKinderAnhandBeziehungUebersicht($this->urlparameter);
            $dm->exportadapter = $this->exportadapter;
            $dm->mainmenu();
          } else {
            $this->addStatus('Beim Hinzufügen der Daten Ihres Kindes ist ein technischer Fehler aufgetreten. Bitte versuchen Sie es erneut oder wenden sich an uns.', 'error');
            parent::mainmenu();
          }
        } else {
          $this->addStatus('Das Formular wurde nicht korrekt ausgefüllt. Bitte überprüfen Sie u. a. die Pflichtfelder.', 'error');
          parent::mainmenu();
        }
      } else {
        parent::mainmenu();
      }
    } else {
      $this->getdataarraynocolumn();
      echo "<div class='hauptseite'>\n";
      echo $this->shownocolumn();
      echo '</div>';
    }
  }

  private function getElternKindBeziehung($pTnrElternteil, $pTnrKind)
  {
    $dbwBeziehung = new DBWorkBeziehung(1, true);
    $bezId = $dbwBeziehung->getHlBezId4BeziehungsArt(2);
    
    $beziehung = new Beziehung();
    $beziehung->typ1 = 'T';
    $beziehung->nr1 = $pTnrElternteil;
    $beziehung->typ2 = 'T';
    $beziehung->nr2 = $pTnrKind;
    $beziehung->bezId = $bezId;
    
    $beziehung->gueltig_von = DEFAULTDATE;
    $beziehung->gueltig_bis = DEFAULTDATE;

    return $beziehung;
  }

  private function getKindFromPost()
  {
    $tmpSession = $_SESSION;
    try {
      $kind = $this->getKind();
      SessionOperations::resetWBLoginInSession();
      SessionOperations::getTeilnehmerFromRequest2Session();
      $kindFromPost = SessionOperations::getDatamodulFromSession(clone($kind), SESSION_PREFIX_WK . 'w_');
      $kindFromPost->newsl_interessensgebiete = array();
      $kindFromPost->id = $kind->id;
    } catch (Exception $e) {
      Logger::logg('DatamanuLoginKinderAnhandBeziehungHinzufuegen: Folgende Exception ist aufgetreten: ' . $e->getMessage(), 201);
    }
    $_SESSION = $tmpSession;

    return $kindFromPost;
  }

  public function getdataarraybody()
  {
    if ($this->_isFormularSent()) {
      $kind = $this->getKindFromPost();
    } else {
      $kind = $this->getKind();
    }

    if ($kind !== false) {
      $this->dataarraybody = array($kind);
    } else {
      $this->dataarraybody = array();
    }
  }

  private function getKind()
  {
    return new Teilnehmer();
  }

  private function _isFormularSent()
  {
    return PostOperations::isDefined('wbl_add_kind');
  }

  
  private function _isFormularValid($pKind)
  { 
    $parsedBody = $this->exportadapter->parseScriptsForDatamodulArray($this->sight->body, array($pKind));

    $pflichtFelder = StringOperations::getPflichtFelder('', $parsedBody);

    $pflichtFeldFehler = array();
    foreach ($pflichtFelder as $pflichtFeldNameInSicht => $pflichtFeldGemapped) {
      $val = $pKind->getVarValue($pflichtFeldGemapped);
      if ($val === '' || ($val instanceof Kommunikation && $val->getVarValue('wert') === '')) {
        
        $pflichtFeldFehler[$pflichtFeldGemapped] = StringOperations::getPflichtfeldFehlerMeldung($pflichtFeldNameInSicht, $parsedBody);
        if ($pflichtFeldNameInSicht == $pflichtFeldFehler[$pflichtFeldGemapped]) {
          
          $tmp = StringOperations::getPflichtfeldFehlerMeldung($pflichtFeldGemapped, $parsedBody);
          if ($tmp != '') {
            $pflichtFeldFehler[$pflichtFeldGemapped] = $tmp;
          }
        }
      }
    }

    $validierungsFehler = $pKind->checkValidierung();

    if (count($validierungsFehler) > 0) {
      $tmp = array();
      foreach ($validierungsFehler as $fehler) {
        $tmp[$fehler] = StringOperations::getPflichtfeldFehlerMeldung($fehler, $parsedBody);
      }
      $validierungsFehler = $tmp;
    }

    if (count($pflichtFeldFehler) > 0 || count($validierungsFehler) > 0) {
      $this->exportadapter->setFehler($pflichtFeldFehler, $validierungsFehler);
      $message = '<p class="warnungpflichtfelder">Bitte überprüfen Sie folgende Datenfelder auf Vollständigkeit und Format:</p>'
              . $this->formatMessage($pflichtFeldFehler, $validierungsFehler);
      $this->exportadapter->addSightInfo('status', $message);

      return false;
    }

    return true;
  }

  
  private function addStatus($pMessage, $pStatus = 'neutral') 
  {
    $cssClass = 'wbl_status wbl_' . $pStatus;
    $message = '<div class="' . $cssClass . '">' . $pMessage . '</div>';
    $this->exportadapter->addSightInfo('status', $message);
  }

  private function formatMessage($pPflichtFeldFehler, $pValidierungsFehler)
  {
    if (KW_BOOTSTRAP) {
      $bsul = ' list-group';
      $bsli = ' list-group-item';
    } else {
      $bsul = '';
      $bsli = '';
    }
    $result = '<div class="warnungpflichtfelder wbl_register"><ul class="warnungpflichtfelder wbl_datenaendern' . $bsul . '"> ';

    $varsWithoutMessage = array();
    foreach ($pPflichtFeldFehler as $key => $var) {
      if (!in_array($key, $varsWithoutMessage)) {
        $result .= '<li class="warnungpflichtfelder' . $bsli . '">' . CleanOperations::cleanStringForHtml($var) . '</li>';
      }
    }
    foreach ($pValidierungsFehler as $key => $var) {
      if (!in_array($key, $varsWithoutMessage)) {
        $result .= '<li class="warnungvalidierung' . $bsli . '">' . CleanOperations::cleanStringForHtml($var) . '</li>';
      }
    }
    $result .= '</ul></div>';

    return $result;
  }

  
  protected function _getRelevantChangedLoginFields($pWbl1, $pWbl2)
  { 
    $varcount = $pWbl1->getVarCount();
    $changedTnFields = array();
    $fieldsToIgnore = $this->_getIgnoreFieldsForDmzUpdate();
    for ($i = 1; $i < $varcount; $i++) {
      $varname = $pWbl1->getVarName($i);
      if (!in_array($varname, $fieldsToIgnore)) {
        if (trim($pWbl1->getVarValue($varname)) != trim($pWbl2->getVarValue($varname))) {
          if ($varname === 'erm_grund') {
            if ((trim($pWbl1->getVarValue($varname)) == '' && trim($pWbl2->getVarValue($varname)) == 0)
                    || (trim($pWbl1->getVarValue($varname)) == 0 && trim($pWbl1->getVarValue($varname)) == '')) {
            } else {
              $changedTnFields[] = $varname;
            }
          } elseif ($varname === 'gebdatum') {
            if ((trim($pWbl1->getVarValue($varname)) == '' && trim($pWbl2->getVarValue($varname)) == DEFAULTDATE)
                    || (trim($pWbl1->getVarValue($varname)) == DEFAULTDATE && trim($pWbl1->getVarValue($varname)) == '')) {
            } else {
              $changedTnFields[] = $varname;
            }
          } elseif ($varname === 'gebjahr') {
            if ((trim($pWbl1->getVarValue($varname)) == '' && trim($pWbl2->getVarValue($varname)) == '1899')
                    || (trim($pWbl1->getVarValue($varname)) == '1899' && trim($pWbl1->getVarValue($varname)) == '')) {
            } else {
              $changedTnFields[] = $varname;
            }
          } else {
            $changedTnFields[] = $varname;
          }
        }
      }
    }

    
    $editFieldsInSight = StringOperations::getEditedVars('tedit', $this->sight->body);

    
    
    $editFieldsInSight = $this->addDependentVarnames($editFieldsInSight);

    return array_intersect($changedTnFields, $editFieldsInSight);
  }

  private function _getIgnoreFieldsForDmzUpdate()
  {
    return array('nurplz', 'nurort', 'nurstrasse',
        'nurhausnr', 'sepa_mandatam', 'newsl_erlaubt', 'newsl_bemerk', 'bankbez', 'blz', 'kontoinh',
        'kontonr', 'bic', 'iban', 'id', 'arykennzeichenJS', 'aryattachmentsJS', 'uploadAttachments', 'newsl_interessensgebiete', 'arykennzeichen');
  }

  private function addDependentVarnames($pEditFieldsInSight)
  {
    $map = array('gebdat' => 'gebdatum', 'nurstrasse' => 'strasse', 'nurort' => 'ort');
    foreach ($pEditFieldsInSight as $sightField) {
      if (isset($map[$sightField])) {
        $pEditFieldsInSight[] = $map[$sightField];
      }
    }

    return $pEditFieldsInSight;
  }
}