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

namespace Kufer\Web\Webbasys\Includee\Datamenu\TerminAnfrage;

use Kufer\Web\Classes\Anmeldung as Anmeldung;
use PHPMailer\PHPMailer\Exception;

class DataMenuTerminAnfrageAbsenden extends \DataMenuMainTopLeft
{
  private $exportadapterKurse;

  private $sightId = 807;

  private $factory;

  public function __construct($urlparameter, $factory)
  {
    parent::__construct($urlparameter);

    $this->exportadapter = new \Kufer\Web\Classes\ExportAdapter\ExpTerminAnfrage();
    $this->exportadapterKurse = new \ExpKurse();

    $this->factory = $factory;
  }

   public function prepareStep()
   {
   }

   public function canAccess($previousDataMenu) : bool
   {
     if (!\RequestOperations::isPost()) {
       return false;
     }

     if ($this->factory->getKnrFromSession() == '') {
       return false;
     }

     if ($this->urlparameter->schritt != '3') {
       return false;
     }

     return $this->factory->isTerminAnfrageOk();
   }

  public function getsight($sightid = 0)
  {
    parent::getsight($this->sightId);
  }

  public function getdataarrayheader()
  {
    $this->dataarrayheader = array($this->getKurs());
  }

  private function getKurs()
  {
    $knr = $this->factory->getKnrFromSession();

    return \WBKursStore::getKurs($knr);
  }

  protected function innerContent() : void
  {
    
    $terminAnfrage = \SessionOperations::getTerminAnfrageFromSession();
    if (is_null($terminAnfrage)) {
      \Logger::logg('Terminanfrage: war beim Absenden leer!', 4013);
      die('ungültiger Systemzustand - bitte nochmals versuchen');
    }

    $this->dataarraynocolumn = $this->dataarrayfooter = $this->dataarraybody = array($terminAnfrage);

    if (!$this->isKuferSqlReachable()) {
      echo $this->getKuferSqlNotReachableMessage();

      return;
    }


    $logmsg = $this->exportadapter->simpleReplace('Terminanfrage: Terminanfrage fuer {%k_id%} ({%k_kurzbez%} - von {%terminanf_wunschdatvon%} bis {%terminanf_wunschdatbis%} um {%terminanf_wunschuhrvon%} Uhr bis {%terminanf_wunschuhrbis%} Uhr in {%terminanf_wunschort%} / {%terminanf_wunschwebinar%} / {%terminanf_bemerkung%} - '
      . 'Anfragender: {%terminanf_einrichtung%} ({%terminanf_anrede%} {%terminanf_vorname%} {%terminanf_name%} {%terminanf_email%} {%terminanf_tel%}) in Bearbeitung', array($terminAnfrage));
    \Logger::logg($logmsg, 9120);
    $terminAnfrageOk = $this->doUebermittlung($terminAnfrage);


    if ($terminAnfrageOk) {
      $this->sendMailToMitarbeiter();

      echo $this->getsightcomplete($this->sightId, $this->exportadapter, $this->exportadapterKurse);
      $this->cleanUp();
    } else {
      
      
      \Logger::logg('Terminanfrage: Übermittlung fehlgeschlagen, aber Behandlung nicht programmiert', 4015);

      throw new \Exception('invalid state - 4015');
    }
  }

  
  public function isKuferSqlReachable(): bool
  {
    try {
      $abgleichapi = new \AbgleichAPI();
      $abgleichapi->sendPingMessage();
    } catch (\Exception $e) {
      return false;
    }

    return true;
  }

  public function getKuferSqlNotReachableMessage(): string
  {
    parent::getsight(DataMenuTerminAnfrageKontrolle::SIGHTID);
    $this->exportadapter->initiate();
    $result = $this->renderSightPart($this->sight->nocolumn, $this->exportadapter, $this->dataarraynocolumn);
    $this->getsight();

    return $result;
  }

  private function doUebermittlung($terminAnfrage)
  {
    $anmeld = new Anmeldung\BuchungsvorgangWEBBASysTerminAnfrage($terminAnfrage);
    $anmeld->createTNInfo(); 

    $anmeld->setKurseBySession(); 
    $anmeld->setBuchungsVars(); 
    $anmeld->buchungStep1(); 

    
    $anmeld->buchungStep2();

    return true;
  }

  public function sendMailToMitarbeiter()
  {
    $kurs = $this->getKurs();
    $to = $this->exportadapter->simpleReplace('{%k_hpmverw_email%}', array($kurs));
    if ($to !== '') {
      $sightContent = $this->exportadapter->simpleReplace($this->sight->nocolumn, $this->dataarraynocolumn);
      $subject = \StringOperations::getBestaetigungSubject($sightContent);
      $body = \StringOperations::getBestaetigungBody($sightContent);

      \Logger::logg("Terminanfrage: Versende Terminanfrage fuer $kurs->id an $to", 9121);

      return \smtpMail::sendStandardHtmlMail($to, $subject, $body);
    } else {
      \Logger::logg("Terminanfrage: Kann Info-Mail NICHT versenden, keine Mail-Adresse: Terminanfrage fuer $kurs->id an $to", 9122);

      return false;
    }
  }

  private function cleanUp()
  {
    $this->factory->setKnrToSession('');
    \SessionOperations::setvarvaluewk('w-terminanfrage', null);
  }
}