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

class DataMenuZsaRegistrierung extends DataMenuMain
{
  private $dbwTeilnehmer;
  private $dbwBkBvTn;
  private $dbwTnZbZg;

  private $zsaHelper;

  private $formatFehlerArray = array();
  private $pflichtFehlerArray = array();

  private $exportadapterTn;

  public function __construct($urlparameter)
  {
    parent::__construct(new URLParameterNavigation());
    $this->exportadapterTn = new ExpTeilnehmer();
    $this->exportadapterTn->export->expCalculation->enforceParamForValueTeilnehmerEdit = true;
    $this->exportadapterTn->export->expCalculation->isDataBinding = false;
    $this->exportadapterTn->setSightInfo('fehler_beim_speichern', '0');
    $this->exportadapter = $this->exportadapterTn;
    $this->dbwTeilnehmer = new DBWorkTeilnehmer(1, true);
    $this->dbwBkBvTn = new DBWorkZsaBkBvTn(1, true);
    $this->dbwTnZbZg = new DBWorkZsaTnZbZg();
    $this->zsaHelper = new Kufer\Web\Classes\Api\Helpers\ZsaHelper($this->dbwBkBvTn);
  }

  public function mainmenu()
  {
    $isRefresh = $this->handleRefresh();
    if (!$isRefresh && trim(PostOperations::getVarValue('tedit_name', '')) != '') {
      $tn = $this->getTeilnehmerFromRequest();
      $kennwort = $this->checkStammhoerer();
      if (count($this->formatFehlerArray) != 0 || count($this->pflichtFehlerArray) != 0) {
        $tn->kennwort = $kennwort;
        $this->dataarrayheader = array($tn);
        $this->dataarraybody = array($tn);
      } else {
        try {
          $this->handleFormularKorrektAbgesendet($tn, $kennwort);
        } catch (Exception $e) {
          Logger::logg('ZSA - Registrierung folgende Exception ist aufgetreten: ' . $e->getMessage(), 300);
          $this->exportadapterTn->setSightInfo('fehler_beim_speichern', '1');
          
          $tn->kennwort = $kennwort;
          $this->dataarrayheader = array($tn);
          $this->dataarraybody = array($tn);
        }
      }
    }
    parent::mainmenu();
  }

  private function handleFormularKorrektAbgesendet($tn, $kennwort)
  {
    $this->handleStammhoererLogin($tn, $kennwort);

    
    $xsrf = GetOperations::getVarValue('xsrf');
    SessionOperations::setVarValueIntern('zsa_reg_' . $xsrf, $tn);

    $this->showBestaetigung($tn);
  }

  
  private function handleRefresh()
  {
    $xsrf = GetOperations::getVarValue('xsrf');
    $tn = SessionOperations::getVarValueIntern('zsa_reg_' . $xsrf);
    if (is_a($tn, 'Datamodul')) {
      $this->showBestaetigung($tn);

      return true;
    } else {
      return false;
    }
  }

  private function showBestaetigung($teilnehmer)
  {
    $this->dataarrayheader = array($teilnehmer);
    $this->dataarraybody = array($teilnehmer);
    $this->dataarrayfooter = array($teilnehmer);

    $this->getSight('545');
  }

  private function checkStammhoerer()
  {
    $kennwort = PostOperations::getVarValue('tedit_kennwort');

    $email = PostOperations::getVarValue('tedit_email');

    $kennwortFehlerText = $this->pflichtFehlerArray['kennwort'];
    if (trim($kennwort) != '') {
      unset($this->pflichtFehlerArray['kennwort']);
    }
    $po = new PasswordOperations();
    if (!$po->isValid($kennwort)) {
      $this->formatFehlerArray['kennwort'] = $kennwortFehlerText;
    }

    if ($email !== '' && !StammhoererAPI::isLoginUnique($email)) {
      $this->formatFehlerArray['email'] = 'Die E-Mail-Adresse ist bereits als Login vergeben.';
      $this->exportadapterTn->setSightInfo('login_schon_vergeben', '1');
    } else {
      $this->exportadapterTn->setSightInfo('login_schon_vergeben', '0');
    }

    return $kennwort;
  }

  private function handleStammhoererLogin($teilnehmer, $passwort)
  {
    $dbloptin = $this->getDblOptin($teilnehmer, $passwort);

    
    $dbwork = new DBWorkDblOptinStammhoererRegistrierung(1, true);
    $optincode = $dbwork->saveDblOptin($dbloptin);

    $dbloptin->optinlink = $this->setOptinLink($dbloptin, $optincode);

    
    $result = $this->sendOptInMail($dbloptin);

    if (!$result) {
      $dbwork->deleteByOptin($optincode);
    }

    return $result;
  }

  
  private function setOptinLink($pDbloptin, $pOptincode)
  {
    $hash = md5($pDbloptin->getVarValue('email'));
    $t3id = GetOperations::getVarValue('id', '');
    if ($t3id != '') {
      $t3id = "&id=$t3id";
    }
    $commonPart = "?kathaupt=266&key=$pOptincode&hash=$hash";
    if (SERVER_PFAD != '') {
      $optinlink = SERVER_PFAD . $commonPart . $t3id;
    } else {
      $optinlink = StringOperations::getCompleteUrlToSkript() . $commonPart . $t3id;
    }

    return trim($optinlink);
  }

  
  protected function getDblOptin($teilnehmer, $passwort)
  {
    $optin = new WebDblOptin();
    $optin->feature = WebDblOptin::FEATURE_STAMMHOERER_REGISTRIERUNG;
    $optin->name = $teilnehmer->name;
    $optin->vorname = $teilnehmer->vorname;

    $optin->strasse = $teilnehmer->strasse;
    $optin->ort = $teilnehmer->ort;
    $optin->tel = $teilnehmer->tel->wert;
    $optin->tel2 = $teilnehmer->tel2->wert;
    $optin->mobil = $teilnehmer->mobil->wert;
    $optin->name_titel = $teilnehmer->name_titel;
    $optin->sozarbeitgeber = $teilnehmer->sozarbeitgeber;
    $optin->gebdat = $teilnehmer->gebdat;
    $optin->geschlecht = $teilnehmer->geschlecht;

    $optin->email = $teilnehmer->email->wert;
    $optin->status = 'R'; 
    $optin->salt = SecurityOperations::generateSalt();
    $optin->passwort = SecurityOperations::getSaltedHash($passwort, $optin->salt);
    $dtop = new DateTimeOperations();
    $optin->bearbdatum = $dtop->getDateTimeNow();

    return $optin;
  }

  public function sendOptInMail($pDbloptin)
  {
    if (!$pDbloptin->isEmpty() && $pDbloptin->optinlink != '') {
      $tmpExpAdapter = $this->exportadapter;
      $this->exportadapter = new ExpTeilnehmer();
      $sightTmp = $this->sight;
      $mailText = $this->getSightPart(482, WB_SIGHT_PART_BODY, array($pDbloptin)); 
      $this->sight = $sightTmp;
      $subject = StringOperations::getBestaetigungSubject($mailText);
      $mailText = StringOperations::getBestaetigungBody($mailText);
      $this->exportadapter = $tmpExpAdapter;

      $email = new smtpMail();
      $email->SetVar2Value('to', $pDbloptin->getVarValue('email'));
      $email->SetVar2Value('subject', $subject);
      $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_HTML);
      $email->SetVar2Value('body', $mailText);
      $retour = $email->sendMail();
      if (!$retour) {
        Logger::logg(WB_LOG_PREFIX_STAMMHOERER . 'Fehler beim Versenden der eMail an ' . $pDbloptin->getVarValue('email'), 50);
      } else {
        Logger::logg('dbloptin mail sent (stammh)', 1);
      }

      return $retour;
    } else {
      return false;
    }
  }

  public function isInputForDublettenCheckOk()
  {
    
    $name = trim(PostOperations::getVarValue('tedit_name'));
    $vorname = trim(PostOperations::getVarValue('tedit_vorname'));
    $gebdat = trim(PostOperations::getVarValue('tedit_gebdat'));

    return ('' !== $name && '' !== $vorname && DateTimeOperations::isValidDate($gebdat));
  }

  
  public function isDublette()
  {
    
    $tnIdAry = TeilnehmerAPI::isDublette($this->getTeilnehmerFromRequest(), TeilnehmerAPI::ALGORITHM_DUBLETTE_SIMPEL_GEBDAT);

    if ($tnIdAry == false) {
      $tnIdAufOriginalDb = false;
    } else {
      $tnIdAufOriginalDb = $tnIdAry['sqlid'];
      $tnIdMysql = $tnIdAry['replikatid'];
    }
    if ($tnIdAufOriginalDb === 'nichtAktiviert') {
      throw new DmzNotAvailableException('DMZ nicht erreichbar');
    }

    return false !== $tnIdAufOriginalDb;
  }

  private function getTeilnehmerFromRequest()
  {
    SessionOperations::getTeilnehmerFromRequest2Session('tedit', 'reg');
    $tnPflicht = SessionOperations::getTeilnehmerFromSession('reg');

    $validierung = new WBAnmeldungCheckHauptTNNeu($tnPflicht[0]);
    $sight = SightsAPI::getSight('544');
    $validierung->vorlage = $sight->header;
    $validierung->check('tedit');
    $this->formatFehlerArray = $validierung->formatFehlerArray;
    $this->pflichtFehlerArray = $validierung->pflichtfeldFehlerArray;

    

    $result = $tnPflicht[0]->copyAsTeilnehmer();

    
    $pflichtFelderAusSicht = StringOperations::getPflichtFelder('tedit', $sight->header);
    if (array_key_exists('email2', $pflichtFelderAusSicht)) {
      $email = PostOperations::getVarValue('tedit_email');
      $email2 = PostOperations::getVarValue('tedit_email2');
      if ($email2 != '' && $email2 !== $email) {
        $this->exportadapterTn->setSightInfo('email2_weicht_ab', '1');
        $this->formatFehlerArray[] = 'email2';
      } else {
        $this->exportadapterTn->setSightInfo('email2_weicht_ab', '0');
        $result->email2 = $email2;
      }
    }

    return $result;
    
  }

  public function showheader()
  {
    $this->exportadapter = $this->exportadapterTn;
    $this->exportadapter->setFehler($this->pflichtFehlerArray, $this->formatFehlerArray);
    parent::showheader();
  }

  public function getdataarrayheader()
  {
    if (!is_array($this->dataarrayheader)) {
      $this->dataarrayheader = array($this->dbwTeilnehmer->getNewObject());
    }
  }

  public function showbody()
  {
    $this->exportadapter = $this->exportadapterTn;
    parent::showbody();
  }

  public function getdataarraybody()
  {
    if (!is_array($this->dataarraybody)) {
      $this->dataarraybody = array($this->dbwTeilnehmer->getNewObject());
    }
  }

  public function showfooter()
  {
    $this->exportadapter = $this->exportadapterTn;
    $this->exportadapter->setFehler($this->pflichtFehlerArray, $this->formatFehlerArray);
    parent::showfooter();
  }

  public function getdataarrayfooter()
  {
    if (!is_array($this->dataarrayfooter)) {
      $this->dataarrayfooter = array($this->dbwTeilnehmer->getNewObject());
    }
  }

  public function getSight($pSightId = '544')
  {
    if (!isset($this->sight)) {
      parent::getSight($pSightId);
    }
  }
}