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

namespace Kufer\Web\KuferTools\Oeffentlich\LoginAnfordern\SendeLoginAnfordern;

class SendeLoginAnfordernUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\UseCase
{
  public const SUCCESS_EMAIL_VERSANDT = 'eMailVersandt';
  public const ERROR_KEINE_EMAIL_VERSANDT = 'keineEMailVersandt';
  public const ERROR_KEINE_BENUTZER_GRUPPE_ANGEGEBEN = 'keineBenutzerGruppeAngegeben';
  public const ERROR_KEINE_ANREDE_ANGEGEBEN = 'keineAnredeAngegeben';
  public const ERROR_KEIN_NAME_ANGEGEBEN = 'keinNameAngegeben';
  public const ERROR_KEIN_VORNAME_ANGEGEBEN = 'keinVornameAngegeben';
  public const ERROR_KEINE_TELEFON_NR_ANGEGEBEN = 'keineTelefonNrAngegeben';
  public const ERROR_KEINE_EMAIL_ANGEGEBEN = 'keineEMailAngegeben';
  public const ERROR_KEINE_STRASSE_ANGEGEBEN = 'keineStrasseAngegeben';
  public const ERROR_KEINE_HAUSNUMMER_ANGEGEBEN = 'keineHausnummerAngegeben';
  public const ERROR_KEINE_PLZ_ANGEGEBEN = 'keinePLZAngegeben';
  public const ERROR_KEIN_ORT_ANGEGEBEN = 'keinOrtAngegeben';
  public const ERROR_CAPTCHA_LEER_ODER_FALSCH = 'CaptchaLeerOderFalsch';
  public const ERROR_DOPPELT_ABSENDEN = 'DoppeltSubmit';
  public const ERROR_ZU_DATENSCHUTZ_NICHT_ZUGESTIMMT = 'zuDatenschutzNichtZugestimmt';
  public const ERROR_ZU_FREIES_PFLICHTFELD_NICHT_ZUGESTIMMT = 'freiesPflichtfeldNichtZugestimmt';

  private $toolSettings;

  
  protected $allowedUserGroups;

  public function __construct($request, $pToolSettings)
  {
    parent::__construct($request, new SendeLoginAnfordernResponse());
    $this->toolSettings = $pToolSettings;
    $this->allowedUserGroups = \Kufer\Web\KuferTools\Utils\LoginAnfordern\LoginAnfordernUtils::getKurzbezManuellBenutzergruppe(\AllgSettingsAPI::getAllgSettings());
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (isset($this->toolSettings->dozAutoLogin) && $this->toolSettings->dozAutoLogin) {
      return false;
    }
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    if (empty($this->allowedUserGroups)) {
      return false;
    }

    if ($this->request->userGroup !== ''
      && !in_array($this->request->userGroup, $this->allowedUserGroups)) {
      
      
      return false;
    }

    return true;
  }

  public function action()
  {
    $this->setzeMenupunkte();

    $this->response->benutzergruppen
      = \Kufer\Web\KuferTools\Utils\LoginAnfordern\LoginAnfordernUtils::getBenutergruppenDatamodules(\AllgSettingsAPI::getAllgSettings(), $this->request->userGroup);
    $this->response->benutzergruppenCount = count($this->response->benutzergruppen);

    if ($this->request->isRefresh) {
      if (\SessionOperations::getVarValueWTIntern('loginErfolgreichAngefordert', false)) {
        $this->response->statusCodes[] = self::ERROR_DOPPELT_ABSENDEN;
      }
      
      else {
        $this->getFormValuesToResponse();
        $this->response->statusCodes = $this->validate();
      }
    } else {
      $this->response->statusCodes = array();
      $statusCodes = $this->validate();
      if (empty($statusCodes)) {
        $this->response->statusCodes[] = $this->sendEmail();
      } else {
        $this->response->statusCodes = $statusCodes;
      }
      $this->getFormValuesToResponse();
    }

    $settingsTool0 = \ToolSettingsAPI::getToolSettings(0);
    if ($settingsTool0->SSLLogin) {
      $this->response->https = \ConstantOperations::getHTTPSPath4Url(LOGIN);
    }

    return $this->response;
  }

  private function getFormValuesToResponse(): void
  {
    $this->response->geschlecht = $this->request->geschlecht;
    $this->response->name = $this->request->name;
    $this->response->vorname = $this->request->vorname;
    $this->response->telefonnummer = $this->request->telefonnummer;
    $this->response->email = $this->request->email;
    $this->response->bemerkung = $this->request->bemerkung;
    $this->response->userGroup = $this->request->userGroup;
    $this->response->plz = $this->request->plz;
    $this->response->strasse = $this->request->strasse;
    $this->response->hausnummer = $this->request->hausnummer;
    $this->response->ort = $this->request->ort;
    $this->response->hinweis = $this->toolSettings->hint4Login;
    $this->response->showDseZustimmung = $this->toolSettings->dseZustimmung4Login;
    $this->response->dseZustimmungLink = $this->toolSettings->dseZustimmungLink4Login;
    $this->response->dseZustimmungChecked = $this->request->dseZustimmung ? \HTMLOperations::getEmptyAttribute('checked') : '';

    if ($this->toolSettings->freiesPflichtfeldZustimmung4Login) {
      $this->response->freiesPflichtfeld = true;
      $this->response->textFreiesPflichtfeld = $this->toolSettings->freiesPflichtfeldZustimmungText4Login;
    } else {
      $this->response->freiesPflichtfeld = false;
      $this->response->textFreiesPflichtfeld = '';
    }

    $this->response->freiesPflichtfeldChecked = $this->request->freiesPflichtfeldZustimmung ? \HTMLOperations::getEmptyAttribute('checked') : '';
  }

  private function validate(): array
  {
    $statusCodes = array();

    
    

    
    $validation = \ValidierungBasis::getInstance();
    if (true !== $validation->isValidVar('email', $this->request->email)) {
      $statusCodes[] = self::ERROR_KEINE_EMAIL_ANGEGEBEN;
    }

    
    $pflichtfelder = array('geschlecht' => self::ERROR_KEINE_ANREDE_ANGEGEBEN, 'name' => self::ERROR_KEIN_NAME_ANGEGEBEN, 'vorname' => self::ERROR_KEIN_VORNAME_ANGEGEBEN);

    
    if ($this->toolSettings->telefonnummerBeiLoginAnforderung == 1) {
      $pflichtfelder = array_merge($pflichtfelder, array('telefonnummer' => self::ERROR_KEINE_TELEFON_NR_ANGEGEBEN));
    }

    
    if ($this->toolSettings->needAdress4Login) {
      $pflichtfelder = array_merge(
        $pflichtfelder,
        array(
          'strasse' => self::ERROR_KEINE_STRASSE_ANGEGEBEN,
          'hausnummer' => self::ERROR_KEINE_HAUSNUMMER_ANGEGEBEN,
          'plz' => self::ERROR_KEINE_PLZ_ANGEGEBEN,
          'ort' => self::ERROR_KEIN_ORT_ANGEGEBEN)
      );
    }

    foreach ($pflichtfelder as $name => $meldung) {
      if ($this->request->{$name} === '') {
        $statusCodes[] = $meldung;
      }
    }

    if (!$this->request->captchaOk) {
      $statusCodes[] = self::ERROR_CAPTCHA_LEER_ODER_FALSCH;
    }

    if ($this->toolSettings->dseZustimmung4Login && !$this->request->dseZustimmung) {
      $statusCodes[] = self::ERROR_ZU_DATENSCHUTZ_NICHT_ZUGESTIMMT;
    }

    if ($this->toolSettings->freiesPflichtfeldZustimmung4Login && !$this->request->freiesPflichtfeldZustimmung) {
      $statusCodes[] = self::ERROR_ZU_FREIES_PFLICHTFELD_NICHT_ZUGESTIMMT;
    }

    return $statusCodes;
  }

  private function getUserGroups(): array
  {
    static $result = null;
    if (is_null($result)) {
      $result = \Kufer\Web\KuferTools\Utils\LoginAnfordern\LoginAnfordernUtils::getKurzbezManuellBenutzergruppe(\AllgSettingsAPI::getAllgSettings());
    }

    return $result;
  }

  private function sendEMail(): string
  {
    $benutzerGruppen = $this->getUserGroups();
    if (empty($benutzerGruppen)) {
      $emailBezeichnung = '';
    } else {
      if (count($benutzerGruppen) == 1) {
        $gruppenName = array_pop($benutzerGruppen); 
      } else {
        $gruppenName = $this->request->userGroup;
      }

      $emailBezeichnung = $this->getNameByUserGroup($gruppenName, true);
    }

    $msg4UserGroup = (!trim($emailBezeichnung) == '') ? ' für das Tool für ' . $emailBezeichnung : '';

    $viewModel = new SendeLoginAnfordernEMailViewModel();
    $viewModel->geschlecht = $this->request->geschlecht;
    $viewModel->name = $this->request->name;
    $viewModel->vorname = $this->request->vorname;
    $viewModel->email = $this->request->email;
    $viewModel->strasse = $this->request->strasse;
    $viewModel->hausnummer = $this->request->hausnummer;
    $viewModel->plz = $this->request->plz;
    $viewModel->ort = $this->request->ort;
    $viewModel->bemerkung = $this->request->bemerkung;
    $viewModel->telefonnummer = $this->request->telefonnummer;
    $viewModel->telefonnummerBeiLoginAnforderung = $this->toolSettings->telefonnummerBeiLoginAnforderung;
    $viewModel->dseZustimmung = $this->request->dseZustimmung;
    $viewModel->msg4UserGroup = $msg4UserGroup;

    $emailPresenter = new SendeLoginAnfordernEMailPresenter($viewModel);
    $email = new \Kufer\Mail\EMail\EMailHTML($emailPresenter->getSubject(), $emailPresenter->getBody());
    $email->addKuferToolsFooter('Neues Login anfordern');
    $emailSender = \Kufer\Mail\Sender\EMailSenderFactory::createForToolsWithCustomAddress($this->toolSettings->vhsEmailTool0Section5);

    if ($emailSender->informEinrichtung($email)->hasSentAnyMails()) {
      return self::SUCCESS_EMAIL_VERSANDT;
    } else {
      return self::ERROR_KEINE_EMAIL_VERSANDT;
    }
  }

  private function getNameByUserGroup($pUserGroup, $pPlural = false): string
  {
    try {
      if ($pPlural) {
        return \ToolsAPI::getBezeichnungPluralForKurzBez($pUserGroup);
      } else {
        return \ToolsAPI::getBezeichnungSingularForKurzBez($pUserGroup);
      }
    } catch (\InvalidArgumentException $ex) {
      return ''; 
    }
  }

  private function setzeMenupunkte(): void
  {
    $menuBar = new \MenuBar();
    $menuBar->setMenuBarFromSettings(array(), 'LOGIN', null, true, true);
    $menuPunkte = $menuBar->getMenuPunkte();

    $zumLoginMenuPunkt = new \Kufer\Web\Classes\Menu\MenuPunkt\MenuPunkt4LoginSeite();
    array_unshift($menuPunkte, $zumLoginMenuPunkt);

    $this->response->menuPunkte = $menuPunkte;
  }
}

class SendeLoginAnfordernRequest
{
  public $geschlecht;
  public $name;
  public $vorname;
  public $telefonnummer;

  public $email;
  public $bemerkung;
  public $userGroup;

  public $plz;
  public $strasse;
  public $hausnummer;
  public $ort;

  public $captchaOk;

  public $isRefresh;
  public $isXsrfOk;

  public $dseZustimmung;
  public $freiesPflichtfeldZustimmung;
}

class SendeLoginAnfordernResponse extends \Kufer\Web\KuferTools\Basis\UseCase\BasisResponse
{
  public $menuPunkte;
  public $statusCodes;

  public $geschlecht;
  public $name;
  public $vorname;
  public $telefonnummer;

  public $email;
  public $bemerkung;
  public $userGroup;

  public $plz;
  public $strasse;
  public $hausnummer;
  public $ort;

  public $hinweis;
  public $https;
  public $showdseZustimmung;
  public $dseZustimmungLink;
  public $dseZustimmungChecked;

  public $benutzergruppen;
  public $benutzergruppenCount;

  public $freiesPflichtfeld;
  public $textFreiesPflichtfeld;
  public $freiesPflichtfeldZustimmung;
}