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

namespace Kufer\KuferTools\Oeffentlich\OnlineKontoBeantragen\SendeOnlineKontoBeantragen;

class SendeOnlineKontoBeantragenUseCase extends \Kufer\KuferTools\Basis\UseCase\UseCase
{
  public const SUCCESS_FORMULAR_ERFOLGREICH_ABGESENDET = 'formularErfolgreichAbgesendet';
  public const ERROR_XML_KONNTE_NICHT_GESCHRIEBEN_WERDEN = 'formularErfolgreichAbgesendet';
  public const ERROR_KEINE_ANREDE_ANGEGEBEN = 'keinGeschlechtAngegeben';
  public const ERROR_KEIN_VORNAME_ANGEGEBEN = 'keinVornameAngegeben';
  public const ERROR_KEIN_NAME_ANGEGEBEN = 'keinNameAngegeben';
  public const ERROR_KEINE_FIRMA_APOTHEKE_ANGEGEBEN = 'keinFirmaApothekeAngegeben';
  public const ERROR_KEIN_GEBURTSDATUM_ANGEGEBEN = 'keinGeburtsdatumAngegeben';
  public const ERROR_KEINE_QUALIFIKATION_ANGEGEBEN = 'keineQualifikationAngegeben';
  public const ERROR_KEINE_STRASSE_ANGEGEBEN = 'keineStrasseAngegeben';
  public const ERROR_KEINE_PLZ_ANGEGEBEN = 'keinePLZAngegeben';
  public const ERROR_KEIN_ORT_ANGEGEBEN = 'keinOrtAngegeben';
  public const ERROR_KEINE_TELEFON_NR_ANGEGEBEN = 'keineTelefonNrAngegeben';
  public const ERROR_KEIN_GUELTIGES_GEBURTSDATUM = 'keinGueltigesGeburtsdatum';
  public const ERROR_KEINE_EMAIL_ANGEGEBEN = 'keineEMailAngegeben';
  public const ERROR_DATENSCHUTZ_NICHT_AKZEPTIERT = 'datenschutzNichtAkzeptiert';
  public const ERROR_CAPTCHA_LEER_ODER_FALSCH = 'CaptchaLeerOderFalsch';

  public function __construct($request)
  {
    parent::__construct($request, new SendeOnlineKontoBeantragenResponse());
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!\DBWorkBASysSettings::isBlak()) {
      return false;
    }
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $this->setzeMenupunkte();
    $this->response->statusCodes = array();
    if ($this->request->isRefresh) {
      if (!\SessionOperations::getVarValueWTIntern('onlineKontoErfolgreichBeantragt', false)) {
        $this->getFormValuesToResponse();
        $this->response->statusCodes = $this->validate();
      }
    } else {
      $statusCodes = $this->validate();
      if (empty($statusCodes)) {
        $this->response->statusCodes[] = $this->generateXML();
      } else {
        $this->response->statusCodes = $statusCodes;
      }

      if (!in_array(self::SUCCESS_FORMULAR_ERFOLGREICH_ABGESENDET, $this->response->statusCodes)) {
        $this->getFormValuesToResponse();
      }
    }

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

    return $this->response;
  }

  private function generateXML()
  {
    $anmeldungenNode = new \XMLNode('ANMELDUNGEN');
    $anmeldungNode = new \XMLNode('ANMELDUNG');

    $stammdatenNode = $this->getStammdatenXMLNode();
    $anmeldungNode->addChild($stammdatenNode);

    $kurseNode = $this->getKurseXMLNode();
    $anmeldungNode->addChild($kurseNode);

    $anmeldungenNode->addChild($anmeldungNode);

    $filename = $this->writeXML($anmeldungenNode);
    if ($filename !== false) {
      return self::SUCCESS_FORMULAR_ERFOLGREICH_ABGESENDET;
    }

    return self::ERROR_XML_KONNTE_NICHT_GESCHRIEBEN_WERDEN;
  }

  private function getFormValuesToResponse()
  {
    $this->response->name = $this->request->name;
    $this->response->vorname = $this->request->vorname;
    $this->response->titel = $this->request->titel;
    $this->response->geschlecht = $this->request->geschlecht;
    $this->response->gebdatum = $this->request->gebdatum;
    $this->response->strasse = $this->request->strasse;
    $this->response->plz = $this->request->plz;
    $this->response->ort = $this->request->ort;
    $this->response->telefonnummer = $this->request->telefonnummer;
    $this->response->email = $this->request->email;
    $this->response->kennzeichen = $this->request->kennzeichen;
    $this->response->datenschutzAkzeptiert = $this->request->datenschutzAkzeptiert;
  }

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

    if ($this->request->geschlecht != 'F') {
      $pflichtfelder = array('geschlecht' => self::ERROR_KEINE_ANREDE_ANGEGEBEN, 'vorname' => self::ERROR_KEIN_VORNAME_ANGEGEBEN,
                             'name' => self::ERROR_KEIN_NAME_ANGEGEBEN, 'kennzeichen' => self::ERROR_KEINE_QUALIFIKATION_ANGEGEBEN,
                             'strasse' => self::ERROR_KEINE_STRASSE_ANGEGEBEN, 'plz' => self::ERROR_KEINE_PLZ_ANGEGEBEN,
                             'ort' => self::ERROR_KEIN_ORT_ANGEGEBEN, 'telefonnummer' => self::ERROR_KEINE_TELEFON_NR_ANGEGEBEN);
    } else {
      $pflichtfelder = array('name' => self::ERROR_KEINE_FIRMA_APOTHEKE_ANGEGEBEN, 'strasse' => self::ERROR_KEINE_STRASSE_ANGEGEBEN,
                             'plz' => self::ERROR_KEINE_PLZ_ANGEGEBEN, 'ort' => self::ERROR_KEIN_ORT_ANGEGEBEN,
                             'telefonnummer' => self::ERROR_KEINE_TELEFON_NR_ANGEGEBEN);
    }

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

    $validation = \ValidierungBasis::getInstance();

    if ($this->request->geschlecht != 'F') {
      if ($validation->isValidVar('gebdat', $this->request->gebdatum) !== true) {
        $statusCodes[] = self::ERROR_KEIN_GUELTIGES_GEBURTSDATUM;
      }
    }

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

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

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

    return $statusCodes;
  }

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

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

  private function getSessionTime()
  {
    static $sessionTime = null;
    if (is_null($sessionTime)) {
      $sessionTime = \SessionOperations::getSessionTime();
    }

    return $sessionTime;
  }

  private function getBeruf()
  {
    $beruf = '';
    if ($this->request->geschlecht != 'F') {
      $withAdditionalBerufsgruppen = true;
      $beruf = \ConstantOperations::getBlakBerufsgruppenNamen($this->request->kennzeichen, $withAdditionalBerufsgruppen);
    }

    return $beruf;
  }

  private function getXMLNodeFromArray($pNodeTag, $pXmlNodesArray)
  {
    $xmlNode = new \XMLNode($pNodeTag);
    foreach ($pXmlNodesArray as $key => $value) {
      $xmlNode->addChild(new \XMLNode($key, $value));
    }

    return $xmlNode;
  }

  private function getKommunikationsEintraege()
  {
    $kommunikationsEintraege = array();
    $kommunikationsEintraege[] = array('KOMMART' => 'E',
        'KOMMBEZ' => 'eMail', 'KOMMWERT' => $this->request->email);
    $kommunikationsEintraege[] = array('KOMMART' => 'T',
        'KOMMBEZ' => 'Telefon', 'KOMMWERT' => $this->request->telefonnummer);

    return $kommunikationsEintraege;
  }

  private function getKennzeichenEintrag()
  {
    return array('KENNZ' => $this->request->kennzeichen);
  }

  private function getStammdaten()
  {
    return array('GESCHLECHT' => $this->request->geschlecht,
                        'NAME_TITEL' => $this->request->titel,
                        'NAME' => $this->request->name,
                        'VORNAME' => $this->request->vorname,
                        'BERUF' => $this->getBeruf(),
                        'STRASSE' => $this->request->strasse,
                        'ORT' => $this->request->plz . ' ' . $this->request->ort,
                        'GEBDATUM' => $this->request->gebdatum,
                        'DSE_UNTERSCHRIEBEN_DATUM' => \DateTimeOperations::getDateTimeNow(),
                        'DSE_UNTERSCHRIEBEN_WEG' => 'I',
                        'SESSIONID' => \SessionOperations::getSessionID(),
                        'SESSIONTIME' => $this->getSessionTime());
  }

  private function getKurs()
  {
    return array('KURSNUMMER' => 'BYA124999',
                  'STATUS' => 'A',
                  'KURSGEBUEHR' => '0,00',
                  'ABW_TNR' => '-1',
                  'ANZAHL' => '1');
  }

  private function getStammdatenXMLNode()
  {
    $stammdaten = $this->getStammdaten();
    $stammdatenNode = $this->getXMLNodeFromArray('STAMMDATEN', $stammdaten);

    $kommunikationNode = new \XMLNode('KOMMUNIKATION');
    foreach ($this->getKommunikationsEintraege() as $kommunikationsEintrag) {
      $kommunikationsEintragNode = $this->getXMLNodeFromArray('KOMMUNIKATIONSEINTRAG', $kommunikationsEintrag);
      $kommunikationNode->addChild($kommunikationsEintragNode);
    }
    $stammdatenNode->addChild($kommunikationNode);

    if ($this->request->geschlecht != 'F') {
      $kennzeichenNode = new \XMLNode('KENNZEICHEN');
      $kennzeichenEintrag = $this->getKennzeichenEintrag();
      $kennzeichenEintragNode = $this->getXMLNodeFromArray('KENNZEICHENEINTRAG', $kennzeichenEintrag);
      $kennzeichenNode->addChild($kennzeichenEintragNode);
      $stammdatenNode->addChild($kennzeichenNode);
    }

    return $stammdatenNode;
  }

  private function getKurseXMLNode()
  {
    $kurseNode = new \XMLNode('KURSE');

    $kurs = $this->getKurs();
    $kursNode = $this->getXMLNodeFromArray('KURS', $kurs);
    $kurseNode->addChild($kursNode);

    return $kurseNode;
  }

  
  private function writeXML($pRootXmlNode)
  {
    $tool0Settings = \ToolSettingsAPI::getToolSettings(0);

    $tmpfile = new \SimpleFileWork();
    $tmpfile->clear();
    $tmpfile->access = 'a';

    $body = '<?xml version="1.0" encoding="' . \CodingOperations::getInternalEncoding() . '" ?' . ">\r\n"
            . $pRootXmlNode->getXMLstring();

    $tmpfile->content = $body;

    $directory = $tool0Settings->emailfilepath;
    if (\StringOperations::substr($directory, -1) != DIRECTORY_SEPARATOR) {
      $directory .= DIRECTORY_SEPARATOR;
    }

    
    
    do {
      $name = \StringOperations::cleanStringForUrl($this->request->name);
      $vorname = \StringOperations::cleanStringForUrl($this->request->vorname);
      $filename = $directory . $name . '_' . $vorname . '__webbasys' . $this->getSessionTime() . '_' . \SessionOperations::getSessionID() . '.xml';
    } while (file_exists($filename));

    $tmpfile->filename = $filename;
    $tmpfile->openFile();
    $tmpfile->setContent();
    $tmpfile->closeFile();

    $success = file_exists($filename);

    if ($success) {
      return $filename;
    }

    return false;
  }
}

class SendeOnlineKontoBeantragenRequest
{
  public $name;
  public $geschlecht;
  public $strasse;
  public $plz;
  public $ort;
  public $telefonnummer;
  public $email;
  public $datenschutzAkzeptiert;

  public $vorname;
  public $titel;
  public $gebdatum;
  public $kennzeichen;

  public $captchaOk;

  public $isRefresh;
  public $isXsrfOk;
}

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

  public $name;
  public $vorname;
  public $titel;
  public $geschlecht;
  public $gebdat;
  public $strasse;
  public $plz;
  public $ort;
  public $telefonnummer;
  public $email;
  public $kennzeichen;
  public $datenschutzAkzeptiert;

  public $hinweis;
  public $https;
}