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

namespace Kufer\Web\KuferTools\Mitarbeiter\KursUebersicht\Detailsreiter\Teilnehmer\HandleTnWeitermeldung;

use Kufer\Web\Classes\Mail\Sender\Settings\RecipientEinrichtung\EMailEinrichtungRecipientToolsKursSettings;

class HandleTnWeitermeldungUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, new HandleTnWeitermeldungResponse());
  }

  public static function getToolSectionId()
  {
    return 377;
  }

  public static function getToolId()
  {
    return \ToolsAPI::TOOL_KURSPLANUNG_MA;
  }

  public function hasAccess($pToolsectionId = null)
  {
    if (!parent::hasAccess($pToolsectionId)) {
      return false;
    } elseif (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $statusMessage = $this->handleWeitermeldenTN($this->request->knr);

    return $this->getResponse($statusMessage);
  }

  
  private function handleWeitermeldenTN($pKnr)
  {
    $statusMessage = '';
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    $maAnmToolsettings = \ToolSettingsAPI::getToolSettings(\ToolsAPI::TOOL_ANMELDUNGBUCHEN_MA);
    
    
    
    $kursNr = $this->request->folgekurs;  

    $teilnehmerObjAry = array();
    $weiterMeldeText = 'Für folgende Teilnehmer wurde eine Weitermeldung an den Folgekurs ' . $kursNr . ' erfolgreich durchgeführt: ' . BR;
    $fehlerMeldeText = 'Für folgenden Teilnehmer konnte die Weitermeldung an den Folgekurs ' . $kursNr . ' wegen eines Fehlers NICHT durchgeführt werden: ' . BR;

    
    if (\PostOperations::getVarValue('teilnehmerObjAry') != '') {
      
      $teilnehmerObjAry = \JsonOperations::getFromStringBase64(\PostOperations::getVarValue('teilnehmerObjAry'));
    }
    $tnAry4WeiterMelden = array();
    $tnAryFault4WeiterMelden = array();
    $anmeldeStaticSight = new \AnmeldeStaticSight();
    $dbwTeiln = new \DBWorkTeilnehmer();
    $tnEmailFault4WeiterMelden = '';
    $tnEmailsVersendet = false;
    $tnAry4FaultStatus = array();
    $tnUpd4EntryOK = true;
    $kurs = $this->getKursDataByDMZ($kursNr);
    $anzFreiePlaetze = $kurs->getVarValue('teil_frei');
    
    foreach ($teilnehmerObjAry as $tnObj) {
      
      \SessionOperations::setVarValueIntern('w_eintritt', $tnObj->eintritt);
      \SessionOperations::setVarValueIntern('w_anmeldeart', $maAnmToolsettings->anmeldeArt);

      $tool6Settings = \ToolSettingsAPI::getToolSettings(6);
      $belegungsstatus = 'A';
      if (!$tool6Settings->ueberbuchenErlaubt && $anzFreiePlaetze <= 0) {
        $belegungsstatus = 'W';
      }
      \SessionOperations::setVarValueIntern('w_belegungsstatus', $belegungsstatus);

      
      
      $tnUpdateInfoObj = $this->updateSomeEntry4Teilnehmer($dbwTeiln, $tnObj, $allgSettings);
      $tnAry4FaultStatus[] = $tnUpdateInfoObj['tnName4Status'];
      $tnUpd4EntryOK = $tnUpd4EntryOK & $tnUpdateInfoObj['tnUpdOK'];
      
      
      $tmpSession = $_SESSION;
      $anmeldevorgangAr = $anmeldeStaticSight->doAnmeldung($tnObj->id, $kursNr, null, null, true);
      $success = $anmeldevorgangAr[0];
      $infoMailSent = $anmeldevorgangAr[1];
      $_SESSION = $tmpSession;

      $tnNameVorname = \CleanOperations::cleanStringForHtml($tnObj->name) . ', ' . \CleanOperations::cleanStringForHtml($tnObj->vorname) . BR;
      if ($success) {
        $anzFreiePlaetze -= 1;
        
        
        $tnAry4WeiterMelden[] = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => false);
        $weiterMeldeText .= $tnNameVorname;

        if ($this->toolSettings->weitermeldenSendInfoMail && !$infoMailSent['sent']) {
          $tnEmailFault4WeiterMelden .= $tnNameVorname;
        } else {
          $tnEmailsVersendet = true;
        }
      } else { 
        $tnAryFault4WeiterMelden[] = array('id' => $tnObj->id, 'name_vorname' => $tnObj->name . ', ' . $tnObj->vorname, 'zahlung' => false);
        $fehlerMeldeText .= $tnNameVorname;
      }
    }
    $tnNames4FaultStatus = '';
    
    if (!$tnUpd4EntryOK) {
      foreach ($tnAry4FaultStatus as $tnObjName) {
        $tnNames4FaultStatus .= '<div>' . \CleanOperations::cleanStringForHtml($tnObjName) . '</div>';
      }
    }
    $weiterMeldeTextDiv = '';
    $tnEmailFault4WeiterMeldenDiv = '';
    $weitermeldeCount = count($tnAry4WeiterMelden);
    $fehlermeldeCount = count($tnAryFault4WeiterMelden);

    
    
    if ($weitermeldeCount > 0) {
      $weiterMeldeTextDiv = '<div class="successbox_text weitermelden">' . $weiterMeldeText . '</div>';
      
      if ($this->toolSettings->meldeImmerBenachrichtigungsMail) {
        $this->sendSimpleMeldeMail(242, $tnAry4WeiterMelden, $pKnr, $kursNr, false, true);
      }

      if ($this->toolSettings->weitermeldenSendInfoMail && $tnEmailsVersendet) {
        $weiterMeldeTextDiv .= '<div class="weitermelenSendInfo_abstand" >Eine Bestätigungs-E-Mail wurde ebenfalls an die Teilnehmer versendet.</div>';
      }
      if ($tnEmailFault4WeiterMelden !== '') {
        $tnEmailFault4WeiterMeldenDiv .= '<div> Die Bestätigungs-E-Mail konnte nicht an folgende Teilnehmer versendet werden: </div>'
                                        . '<div>' . $tnEmailFault4WeiterMelden . '</div>';
      }
    }
    
    if ($weitermeldeCount > 0) {
      $statusMessage .= '<div role="status" class="alert alert-success">' . $weiterMeldeTextDiv . '</div>';
    }

    if ($fehlermeldeCount > 0) {
      $fehlerMeldeTextDiv = '<div role="status" class="alertbox_text fehlermelden">' . $fehlerMeldeText . '</div>';

      $statusMessage .= '<div role="status" class="alert alert-danger">' . $fehlerMeldeTextDiv . '</div>';
    }

    if ($tnEmailFault4WeiterMeldenDiv !== '') {
      $statusMessage .= '<div role="status" class="alert alert-danger">' . $tnEmailFault4WeiterMeldenDiv . '</div>';
    }

    
    
    
    return $statusMessage;
  }

  
  private function updateSomeEntry4Teilnehmer($pDbwTeiln, $pTnObj, $pAllgSettings)
  {
    $entryUpd4TeilnOK = true;
    
    
    $teilnehmer = $pDbwTeiln->getTeilnehm($pTnObj->id, true);
    $origTeilnehmer = clone $teilnehmer;

    
    
    
    $changedFields = array();
    if (!isset($pTnObj->newsLetterAllow)) {
      $pTnObj->newsLetterAllow = '';
    }
    if ($teilnehmer->newsl_erlaubt != $pTnObj->newsLetterAllow) {
      $changedFields = array('newsl_erlaubt');
      
      $teilnehmer->newsl_erlaubt = $pTnObj->newsLetterAllow;
    }
    try {
      if (\SessionOperations::isReplikat() && $pAllgSettings->dmzEnabled) {
        
        $teilnehmerTuple = new \Tuple($teilnehmer, $changedFields, $origTeilnehmer);
        \TeilnehmerAPI::correctTeilnehmer($teilnehmerTuple, 'update');
        
        
        
        $pDbwTeiln->updateTeilnehmer($teilnehmer, true);
      } 
      else {
        
        $pDbwTeiln->updateTeilnehmer($teilnehmer, false);
      }
      
    } 
    catch (\Exception $e) {
      $entryUpd4TeilnOK = false;
      \Logger::logg('Teilnehmerupdate - folgende Exception ist aufgetreten: ' . $e->getMessage() . "\n" . ' [' . $e->getTraceAsString() . ']', 200);
    }

    return array('tnUpdOK' => $entryUpd4TeilnOK, 'tnName4Status' => $pTnObj->name . ', ' . $pTnObj->vorname);
  }

  private function getKurs($knr)
  {
    $dbwKurse = new \DBWorkKurseWT(1, true);

    return $dbwKurse->getKurs($knr);
  }

  
  protected function sendSimpleMeldeMail(
    array $pTeilnehmerAry,
    string $pVonKnr,
    string $pNachKnr,
    bool $pIsUmmeldung,
    bool $pSucces4Melden = false
  ) {
    $fromKurs = $this->getKurs($pVonKnr);
    $toKurs = $this->getKurs($pNachKnr);

    $meldungsBez = 'Weitermeldung';
    $mailSubject = 'Kurs Weitermelden';
    $vonPart = ' von ' . $this->response->sprachSettings->Kurs['Singular']['Dativ'] . ' ' . $pVonKnr;
    if ($pIsUmmeldung) {
      $meldungsBez = 'Ummeldung';
      $mailSubject = 'Kurs Ummelden';
      $vonPart = ' von ' . $this->response->sprachSettings->Kurs['Singular']['Dativ'] . ' "' . $fromKurs->getVarValue('kurzbez_titel') . "\" ($pVonKnr)";
    }
    $ansprache4Teilnehmer = $this->response->sprachSettings->Teilnehmer['Singular']['Akkusativ'];
    if (count($pTeilnehmerAry) > 1) {
      $ansprache4Teilnehmer = $this->response->sprachSettings->Teilnehmer['Plural']['Akkusativ'];
    }

    $text = 'Für folgende ' . $ansprache4Teilnehmer . ' ist eine ' . $meldungsBez . $vonPart . ' nach '
            . $this->response->sprachSettings->Kurs['Singular']['Dativ'] . ' "' . $toKurs->getVarValue('kurzbez_titel') . "\" ($pNachKnr)" . ' durchzuführen:' . "\n";
    if ($pSucces4Melden) {
      $text = 'Für folgende ' . $ansprache4Teilnehmer . ' wurde eine ' . $meldungsBez . $vonPart . ' nach '
              . $this->response->sprachSettings->Kurs['Singular']['Dativ'] . ' "' . $toKurs->getVarValue('kurzbez_titel') . "\" ($pNachKnr)" . ' erfolgreich durchgeführt:' . "\n";
    }
    foreach ($pTeilnehmerAry as $teilnehmer) {
      $text .= ' ' . $teilnehmer['name_vorname'] . '(' . $teilnehmer['id'] . ')';
      if ($teilnehmer['zahlung']) {
        $text .= "\t" . "\t" . "\t" . 'Zahlung liegt vor';
      }
      $text .= "\n";
    }

    $text .= "\n" . 'Diese Nachricht wurde automatisch von den KuferTools generiert.';

    $email = new \Kufer\Mail\EMail\EMailPlaintext($mailSubject, $text);

    $sender = \Kufer\Mail\Sender\EMailSenderFactory::create();
    $senderRecipient = new EMailEinrichtungRecipientToolsKursSettings($toKurs);
    $senderRecipient
      ->setSettingMailToPlanendenMitarbeiter($this->toolSettings->meldeBenachrichtigungsMailAnPlanMa)
      ->setSettingMailToVerwaltendenMitarbeiter($this->toolSettings->meldeBenachrichtigungsMailAnVerwMa)
      ->setSettingMailToVerantwortendenMitarbeiter($this->toolSettings->meldeBenachrichtigungsMailAnVerantwMa)
      ->setSettingsVhsEMail($this->toolSettings->vhsEmailTool8Section242);
    $sender->sendFromToolsUserToEinrichtung($email, $this->getUser(), $senderRecipient);
  }

  private function getKursDataByDMZ($kursNr)
  {
    $kurs = $this->getKurs($kursNr);
    if (isset($kurs->id) && \AnmeldevorgangAdapter::getUebermittlungsart() == ANMELDUNG_MATOOL_DMZ) {
      try {
        $kurs = \AnmeldeAPI::updateKursData($kurs);
      } catch (\Exception $e) {
      }
    }

    return $kurs;
  }

  protected function getResponse($statusMessage)
  {
    $this->response->statusMessage = $statusMessage;

    return $this->response;
  }
}

class HandleTnWeitermeldungRequest
{
  public $knr;
  public $folgekurs;
  public $isRefresh;
  public $isXsrfOk;
}

class HandleTnWeitermeldungResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $statusMessage;
}