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




class DataMenuLoginRegistrierungPersNr extends DataMenuLoginRegistrierung
{
  public function __construct($pUrlparameter)
  {
    parent::__construct($pUrlparameter);
    $this->dublettenAlgorithmus = TeilnehmerAPI::ALGORITHM_DUBLETTE_SIMPEL_PERSNR;
  }

  public function internerContent()
  {
    $this->getsight();

    if (!$this->istZugriffErlaubt()) {
      $this->showAccessDenied();
    } else {
      if ($this->isRegistrierung()) {
        $registrierungOk = $this->handleRegistrierung();
        if ($registrierungOk !== false) {
          if ($registrierungOk instanceof WebDblOptin) {
            
            $this->doWbLogin($registrierungOk->email);
          }

          $this->addStatus('Ihr Login wurde erfolgreich registriert.', 'success');
          $this->showWillkommen();
        } else {
          if (DBWorkBASysSettings::isRMA()) {
            $this->addStatus('Ihr Login konnte nicht registriert werden. Bitte versuchen Sie es später erneut oder setzen Sie sich mit der Rhein-Mosel-Akademie in Verbindung unter der Telefonnummer (02632) 407-5614', 'error');
          } else {
            $this->addStatus('Ihr Login konnte nicht registriert werden. Bitte versuchen Sie es später erneut oder setzen Sie sich mit uns in Verbindung.', 'error');
          }
          $this->showFailureFormular();
        }
      } else {
        if (SessionOperations::isStammhoererLoggedIn()) {
          $this->showWillkommen();
        } else {
          $this->showFormular();
        }
      }
    }
  }

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

  protected function handleRegistrierung()
  {
    if ($this->checkVoraussetzungenRegistrierung()) {
      $dbloptin = $this->getDblOptin();

      $stammhAngelegt = $this->checkDublettenAndDoInserts($dbloptin);

      if ($stammhAngelegt) {
        return $dbloptin;
      }
    }

    return false;
  }

  
  protected function getDblOptin()
  {
    $optin = new WebDblOptin();
    $optin->name = $this->getPostVar('name');
    $optin->vorname = $this->getPostVar('vorname');
    $optin->email = $this->getPostVar('email'); 
    
    $optin->salt = SecurityOperations::generateSalt();
    $optin->passwort = SecurityOperations::getSaltedHash($this->getPostVar('newpw1'), $optin->salt);

    return $optin;
  }

  
  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');
    }

    if (false === $tnIdAufOriginalDb) {
      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->pers_nr, 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;
      }
      Logger::logg(__CLASS__ . 'else zweig', 1);
      
    }

    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('pers_nr', $pDbloptin->email); 

    return $tnObject;
  }

  
  protected function insertTeilnehmerDMZ(\Teilnehmer $pTnObject): array
  {
    $kennzeichen = array();
    $changedFields = array('name', 'vorname', 'pers_nr');

    return TeilnehmerAPI::insertTeilnehmer4DMZ(
      $pTnObject,
      $kennzeichen,
      $changedFields,
      AbgleichAPI::ABGLEICH_TEILNEHMER
    );
  }

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

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

    
    if (!StammhoererAPI::isLoginUnique($this->getPostVar('email'))) {
      $result['vergeben'] = 'Dieses Login ist bereits vergeben.';
    }

    
    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('pers_nr' => 'Personalnummer',
        'pwvoraussetzungen' => 'Das Passwort erfüllt die Voraussetzungen nicht.',
        'unique' => 'Das Login ist bereits vergeben');

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


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

    return $result;
  }

  protected function stammhoererAnlegenGesamteKommunikationOk($pTnIdAufOriginalDb, $pNameMssql, $pNameDblOptin, $pVornameMssql, $pVornameDblOptin, $pEmailDblOptin)
  {
    if (trim(StringOperations::strtolower($pNameMssql)) === trim(StringOperations::strtolower($pNameDblOptin))
          && trim(StringOperations::strtolower($pVornameMssql)) === trim(StringOperations::strtolower($pVornameDblOptin))) {
      $tn = TeilnehmerAPI::getTeilnehmerInfosPerDMZ($pTnIdAufOriginalDb, true);

      return $pEmailDblOptin == $tn->pers_nr;
    }

    return false;
  }
}