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

include_once '../classes/constants.php';
if (!session_id()) {
  session_start();
}
$authenticated = SessionOperations::getVarValueIntern('admin_authenticated', false);
if (!$authenticated) {
  die('Um diese Funktion zu nutzen, muss man im Admin eingeloggt sein.');
}

class AdminBest
{
  public $fileName;

  public static $templateDir = BASEDIR . 'admin' . DIRECTORY_SEPARATOR . 'layout' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'best' . DIRECTORY_SEPARATOR;

  
  private $generator;

  public function setFileName($fileName)
  {
    $this->fileName = self::$templateDir . $fileName;
  }

  public function setGenerator($art)
  {
    $toolsettings = ToolSettingsAPI::getToolSettings(4);
    if ($toolsettings->neuesanmeldeverfahren) {
      if ($art === 'Email') {
        $this->generator = new BestaetigungEmailNeu();
      } else {
        $this->generator = new BestaetigungBrowserNeu();
      }
    } else {
      if ($art === 'Email') {
        $this->generator = new BestaetigungEmailAlt();
      } else {
        $this->generator = new BestaetigungBrowserAlt();
      }
    }
    $this->generator->setTemplateDir(self::$templateDir);
  }

  public function getVal($xmldaten, $varname)
  {
    if (isset($xmldaten[$varname])) {
      return \StringOperations::utf8_decode($xmldaten[$varname]);
    } else {
      return'';
    }
  }

  
  public function getTnPflichtAbweichenderZahler($xmldaten)
  {
    return $this->getTnPflichtAusXml($xmldaten, 4);
  }

  public function getTnPflichtAusXml($xmldaten, $offset = 0)
  {
    $tn = new TeilnehmerPflicht();
    foreach ($xmldaten as $schluessel => $wert) {
      $lower = strtolower(substr($schluessel, $offset));

      if ($tn->VarExist($lower)) {
        $tn->setValue2Var($lower, \StringOperations::utf8_decode($wert));
      } else {
        $varNameMapping = array('gebdatum' => 'gebdat', 'telefon' => 'tel');
        if (isset($varNameMapping[$lower])) {
          $tn->setValue2Var($varNameMapping[$lower], \StringOperations::utf8_decode($wert));
        }
      }
    }

    return $tn;
  }

  
  public function getTnPflichtAusStammdaten($xmldaten)
  {
    $tn = $this->getTnPflichtAusXml($xmldaten);
    if (isset($xmldaten['KOMMUNIKATION'])) {
      foreach ($xmldaten['KOMMUNIKATION']->KOMMUNIKATIONSEINTRAG as $k) {
        $art = (string)$k->KOMMART;
        $artZuKuerzel = array('T' => 'tel', 'E' => 'email', 'M' => 'mobil', 'F' => 'fax');
        $tn->setValue2Var($artZuKuerzel[$art], (string)$k->KOMMWERT);
      }
    }

    return $tn;
  }

  public function getKursFromXml($xmlKursElement)
  {
    $kursDataAsArray = get_object_vars($xmlKursElement);
    $result = new Kurs();
    $result->knr = $this->getVal($kursDataAsArray, 'KURSNUMMER');
    $result->id = $result->knr;
    $result->gebuehrGeparsed = $this->getVal($kursDataAsArray, 'KURSGEBUEHR');
    $result->beginn_dat = '11.09.2018';
    $result->hauptTnAuch = true;
    $result->teil_max = 8;
    $result->teil_akt = 8;
    $result->weitereTeilnehmer = array();

    if (isset($xmlKursElement->WEITEREANM->WEITERANM)) {
      foreach ($xmlKursElement->WEITEREANM->WEITERANM as $weiterer) {
        $result->weitereTeilnehmer[] = $this->getTnPflichtAusStammdaten(get_object_vars($weiterer->WEITERSTAMM));
        $weiterData = get_object_vars($weiterer);
        if ($weiterData['TYP'] == 'F') {
          $result->hauptTnAuch = 0;
        }
      }
    }

    return $result;
  }

  public function getBestaetigung($pStatus = ANMELDUNGONLINE_OK, $encodingweglassen = false)
  {
    $result = '';
    $daten = simplexml_load_file($this->fileName);

    $resultEncoder = new EncodeCharset4RequestAndResponse();

    $result .= $this->generator->getRahmenVorher();


    $toolsettings = ToolSettingsAPI::getToolSettings(4);
    if ($toolsettings->neuesanmeldeverfahren) {
      $bestText = $this->getBestaetigungNeu($daten, $pStatus);
    } else {
      $bestText = $this->getBestaetigungAlt($daten, $pStatus);
    }

    $encodedResult = $resultEncoder->decode($bestText);
    if ($encodingweglassen) {
      $encodedResult = $bestText;
    }
    $result .= $encodedResult;
    $result .= $this->generator->getRahmenNachher();

    return $result;
  }

  private function getBestaetigungNeu($daten, $pStatus)
  {
    $kurseuTn = get_object_vars($daten->ANMELDUNG->KURSE);
    $ersterTn = get_object_vars($daten->ANMELDUNG->STAMMDATEN);
    $teilnehmer = $this->getTnPflichtAusStammdaten($ersterTn);
    $kursnummern = $daten->xpath('/ANMELDUNGEN/ANMELDUNG/KURSE/KURS/KURSNUMMER');
    $weitere = array();

    $anminfo = new stdClass();
    $anminfo->hauptTn = $teilnehmer;
    $anminfo->kurse = array();

    $dbwwk = new DBWorkWarenkorbKurse();
    if (is_array($kurseuTn['KURS'])) {
      foreach ($kurseuTn['KURS'] as $ki) {
        $kurs = $this->getKursFromXml($ki);
        $anminfo->kurse[] = $kurs;
        $dbwwk->addEntry($kurs->id);
      }
    } else {
      $kurs = $this->getKursFromXml($kurseuTn['KURS']);
      $abwZahler = $this->getTnPflichtAbweichenderZahler($kurseuTn['KURS']);
      if ($abwZahler->name != '') {
        array_unshift($kurs->weitereTeilnehmer, $teilnehmer);
        $anminfo->hauptTn = $abwZahler;
        $kurs->hauptTnAuch = false;
      }
      $anminfo->kurse[] = $kurs;
      $dbwwk->addEntry($kurs->id);
    }
    SessionOperations::setVarValueAnmInfo($anminfo);

    $tnpart = $this->generator->getHtmlBestaetigungTnPart($teilnehmer);

    $kurspart = $this->generator->getHtmlBestaetigungKursPart($teilnehmer, $kursnummern, $weitere, $pStatus);
    $footer = $this->generator->getHtmlBestaetigungFooter();

    return $tnpart . $kurspart . $footer;
  }

  private function getBestaetigungAlt($daten, $pStatus)
  {
    $ersterTn = get_object_vars($daten->ANMELDUNG->STAMMDATEN);
    $teilnehmer = $this->getTnPflichtAusStammdaten($ersterTn);
    $kursnummern = $daten->xpath('/ANMELDUNGEN/ANMELDUNG/KURSE/KURS/KURSNUMMER');
    $weitere = array();
    $anmart = '';

    if (isset($daten->ANMELDUNG->KURSE->KURS[0]->WEITEREANM->WEITERANM)) {
      $weitererCount = $daten->ANMELDUNG->KURSE->KURS[0]->WEITEREANM->WEITERANM->count();
      for ($i = 0; $i < $weitererCount; $i++) {
        $anmart = get_object_vars($daten->ANMELDUNG->KURSE->KURS[0]->WEITEREANM->WEITERANM[$i]->TYP)[0];
        $weitere[] = $this->getTnPflichtAusStammdaten(get_object_vars($daten->ANMELDUNG->KURSE->KURS[0]->WEITEREANM->WEITERANM[$i]->WEITERSTAMM));
      }
    }






    $kurseByStatus = array();
    $dbwk = DBWorkKurse::getDefaultInstance();

    if (!isset($kurseByStatus[$pStatus])) {
      $kurseByStatus[$pStatus] = array();
    }

    foreach ($kursnummern as $kursnummer) {
      $knr = get_object_vars($kursnummer)[0];
      $tmpkurs = $dbwk->getKurs($knr); 

      $kursInfo = new WeitereKursInfo();
      $kursInfo->kursnummer = $knr;
      $kursInfo->anzahl = 1;
      $kursInfo->kursgebuehr = MathOperations::floatToString($tmpkurs->gebuehr);
      $kursInfo->status = $tmpkurs->emailstatus;
      $kursInfo->aussenstelle = $tmpkurs->aussenst;
      $kb = new KursBuchung();
      $kb->setStatus($pStatus);
      $kb->setTNBestaetigung(new TNBestASAbhaengig(false));
      $kb->setBestaetigungKopie(new ASBestaetigungKeine());
      $kb->setKursInfo($kursInfo);
      $kurseByStatus[$pStatus][] = $kb;
    }
    $tnpart = $this->generator->getHtmlBestaetigungTnPart($teilnehmer);
    $kurspart = $this->generator->getHtmlBestaetigungKursPart($teilnehmer, $kurseByStatus, $weitere, $pStatus, $anmart);
    $footer = $this->generator->getHtmlBestaetigungFooter();

    return $tnpart . $kurspart . $footer;
  }
}

if (PostOperations::getVarValue('file', '') != '') {
  $best = new AdminBest();
  $best->setFileName(PostOperations::getVarValue('file', ''));
  $best->setGenerator(PostOperations::getVarValue('art'));

  switch (PostOperations::getVarValue('status')) {
  case 'ok': $status = ANMELDUNGONLINE_OK; break;
  case 'abschluss': $status = ANMELDUNGONLINE_ABSCHLUSS; break;
  case 'anmeldebeginn': $status = ANMELDUNGONLINE_ANMELDEBEGINN; break;
  case 'anmeldeschluss': $status = ANMELDUNGONLINE_ANMELDESCHLUSS; break;
  case 'ausfall': $status = ANMELDUNGONLINE_AUSFALL; break;
  case 'knrungueltig': $status = ANMELDUNGONLINE_KNRUNGUELTIG; break;
  case 'kursende': $status = ANMELDUNGONLINE_KURSENDE; break;
  case 'kursvoll': $status = ANMELDUNGONLINE_KURSVOLL; break;
  case 'offline': $status = ANMELDUNGONLINE_OFFLINE; break;
  case 'technischeprobleme': $status = ANMELDUNGONLINE_TECHNISCHEPROBLEME; break;
  default: $status = ANMELDUNGONLINE_OK; break;
  }
  $bestaetigungHtml = $best->getBestaetigung($status);

  echo $bestaetigungHtml;

  if (PostOperations::getVarValue('anmailverschicken', '') == 'on' && trim(PostOperations::getVarValue('andiesemailschicken', '')) != '' && PostOperations::getVarValue('art') == 'Email') {
    $bestaetigungHtml = $best->getBestaetigung($status, true);
    $emailwriter = new DatenEmailWriter();
    $success = $emailwriter->commit(
      trim(PostOperations::getVarValue('andiesemailschicken', '')),
      $bestaetigungHtml,
      'Testmail',
      '.xml',
      '',
      SMTP_CONTENTTYPE_HTML
    );
    if (!$success) {
      $lasterror = error_get_last();
      if (!is_null($lasterror)) {
        $errorMessage = $lasterror['message'];
        echo '<span>' . $errorMessage . '</span>';
      }
    }
  }

  $dbwWK = new DBWorkWarenkorbKurse();
  $dbwWK->clear();
}