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




class DataMenuLoginRegistrierungTnr extends DataMenuLoginRegistrierung
{
  public function __construct($pUrlparameter)
  {
    parent::__construct($pUrlparameter);
    $this->dublettenAlgorithmus = TeilnehmerAPI::ALGORITHM_DUBLETTE_SIMPEL_TNR;
    $this->kathaupt = 403;
  }

  public function getsight($sightid = 525)
  {
    parent::getsight($sightid);
  }

  
  protected function getDblOptin()
  {
    $optin = parent::getDblOptin();
    $optin->krit1 = $this->getPostVar('krit1'); 

    return $optin;
  }

  protected function getLoginValue($pDbloptin)
  {
    return $pDbloptin->krit1;
  }

  
  protected function checkDublettenAndDoInserts($pDbloptin): bool
  {
    $tnObject = $this->getTeilnehmerFromDbloptin($pDbloptin);
    $tnIdAufOriginalDb = false;
    try {
      $tnIdAry = TeilnehmerAPI::isDublette($tnObject, $this->dublettenAlgorithmus);
      if (is_array($tnIdAry)) {
        $tnIdAufOriginalDb = $tnIdAry['sqlid'];
      }
    } catch (Exception $e) {
      Logger::logg($e->getMessage(), 200);
      die(WB_LOG_PREFIX_STAMMHOERER . 'Ein Fehler ist aufgetreten - es konnte kein Dublettenprüfung auf der Original-DB durchgeführt werden (Registrierung per Tnr)');
    }

    if ($tnIdAufOriginalDb === false) {
      Logger::logg(WB_LOG_PREFIX_STAMMHOERER . 'Es wollte sich jemand mit folgenden Daten registrieren - aber nicht in Live-DB gefunden: '
        . $tnObject->name . ' ' . $tnObject->vorname . ' ' . $tnObject->id . ' ' . $tnObject->getVarValue('email'), 51);

      return false;
    } else {
      if (!is_numeric($tnIdAufOriginalDb)) {
        Logger::logg(
          WB_LOG_PREFIX_STAMMHOERER . "Beim StammhörerLogin registrieren: Wahrscheinlich ist die DMZ nicht aktiviert! $tnIdAufOriginalDb",
          49
        );

        return false;
      } elseif ($tnIdAufOriginalDb != $tnObject->id) {
        Logger::logg(WB_LOG_PREFIX_STAMMHOERER . 'Problem bei Stammhoerer-Registrierung per Tnr: Dublette hat andere Teilnehmernummer ' . $tnIdAufOriginalDb . ' != ' . $tnObject->id, 8015);

        return false;
      }
    }

    return $this->stammhoererAnlegen($pDbloptin, $tnIdAufOriginalDb);
  }

  protected function getTeilnehmerFromDbloptin($pDbloptin): \Teilnehmer
  {
    $tnObject = new Teilnehmer();
    $tnObject->setValue2Var('name', $pDbloptin->name);
    $tnObject->setValue2Var('vorname', $pDbloptin->vorname);
    $tnObject->setValue2Var('email', $pDbloptin->email);
    $tnObject->setValue2Var('id', $pDbloptin->krit1); 

    return $tnObject;
  }

  protected function stammhoererAnlegen($pDblOptin, $pTnIdAufOriginalDb)
  {
    
    try {
      $tnMssql = TeilnehmerAPI::getTeilnehmerInfosPerDMZ($pTnIdAufOriginalDb);
      if (DBWorkWBLogins::existiertLogin($pTnIdAufOriginalDb)) {
        Logger::logg('Nach Klick auf den Double-Optin-Link wurde bei der Stammhörerregistrierung festgestellt, dass potentiell ein falscher Stammhörer (' . $pTnIdAufOriginalDb . ')
          zugeordnet worden ist, sodass die Registrierung sicherheitshalber verhindert wurde.', 41);

        return false;
      }
      $ok = trim(StringOperations::strtolower($tnMssql->name)) === trim(StringOperations::strtolower($pDblOptin->name))
              && trim(StringOperations::strtolower($tnMssql->vorname)) === trim(StringOperations::strtolower($pDblOptin->vorname))
              && trim($tnMssql->tnr) === trim($pDblOptin->krit1);
      
      if (!$ok) {
        $msg = "Problem bei Stammhoerer-Registrierung: Teilnehmerdaten konnten nicht mit vermeintlicher Tnr (KuferSQL: $pTnIdAufOriginalDb)"
                . ' aus KuferSQL DB gelesen werden - schlechter Übertragungszeitpunkt?!'
                . 'KuferSQL: ' . $tnMssql->vorname . ' ' . $tnMssql->name . ' ' . $tnMssql->email_anzeige . ' <> MySQL: ' . $pDblOptin->vorname . ' ' . $pDblOptin->name . ' ' . $pDblOptin->email;
        Logger::logg($msg, 8010);

        return false;
      }
    } catch (Exception $e) {
      $msg = "Problem bei Stammhoerer-Registrierung: Teilnehmerdaten konnten nicht mit vermeintlicher Tnr (KuferSQL: $pTnIdAufOriginalDb)"
                . ' aus KuferSQL DB gelesen werden - kein Datensatz gefunden (wblogin: ' . $pDblOptin->vorname . ' ' . $pDblOptin->name . ' ' . $pDblOptin->email;
      Logger::logg($msg, 8014);

      return false;
    }
    $wblogin = $this->dblOptinToStammhoerer($pDblOptin);
    $wblogin->login = $pTnIdAufOriginalDb;
    $wblogin->tnr = $pTnIdAufOriginalDb;

    
    if ($pDblOptin->email != '' && !$this->stammhoererAnlegenGesamteKommunikationOk($pTnIdAufOriginalDb, $tnMssql->name, $pDblOptin->name, $tnMssql->vorname, $pDblOptin->vorname, $pDblOptin->email)) {
      try {
        $this->fuegeTeilnehmerEmailHinzu($pTnIdAufOriginalDb, $pDblOptin->email);
      } catch (Exception $e) {
        $msg = "Problem bei Stammhoerer-Registrierung per Tnr: neue E-Mail Adresse konnte nicht hinzugefügt werden (KuferSQL: $pTnIdAufOriginalDb " . $pDblOptin->email . ')'
                  . $e->getMessage();
        Logger::logg($msg, 8016);

        return false;
      }
    }

    return StammhoererAPI::insertStammhoerer($wblogin);
  }

  
  private function fuegeTeilnehmerEmailHinzu($tnr, $mailadr)
  {
    $komm = new Kommunikation();
    $komm->art = 'E';
    $komm->typ = 'T';
    $komm->wert = $mailadr;
    $komm->bezeichner = 'E-Mail';
    $komm->nr = $tnr;
    

    $kommTuple = new Tuple($komm, KommunikationsAPI::$_changedKommFields, null);

    return KommunikationsAPI::correctKommunikation(array($kommTuple), 'insert', true);
  }

  
  protected function checkRegistrierungParameterPflichtfelder()
  {
    $result = array();

    
    $tocheck = array('name', 'vorname', 'krit1', 'newpw1', 'newpw2', 'email');
    $meldungen = array('name' => 'Name', 'vorname' => 'Vorname', 'krit1' => 'Teilnehmernummer',
        'email' => 'E-Mail', 'newpw1' => 'Passwort', 'newpw2' => 'Passwort wiederholen',
        'pw' => 'Die angegebenen Passwörter stimmen nicht überein.',
        'pwvoraussetzungen' => 'Das Passwort erfüllt die Voraussetzungen nicht.');

    
    foreach ($tocheck as $var) {
      if (trim($this->getPostVar($var)) === '') {
        $result[$var] = $meldungen[$var];
      }
    }

    if ($this->getPostVar('newpw1') != $this->getPostVar('newpw2')) {
      $result['pwungleich'] = $meldungen['pw'];
    }

    return $result;
  }

  protected function checkRegistrierungParameterValidierung()
  {
    $result = array();

    $meldungen = array('krit1' => 'Teilnehmernummer',
        'pwvoraussetzungen' => 'Das Passwort erfüllt die Voraussetzungen nicht.',
        'unique' => 'Das Login ist bereits vergeben.');

    $tnr = CleanOperations::cleanStringForHtml($this->getPostVar('krit1'));
    if ($tnr !== '' && !StammhoererAPI::isLoginUnique($tnr)) {
      $result['unique'] = $meldungen['unique'];
    }

    $pwdop = new PasswordOperations();
    if (!$pwdop->isValid($this->getPostVar('newpw1'))) {
      $result['pwvoraussetzungen'] = $meldungen['pwvoraussetzungen'];
    }

    return $result;
  }
}