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

namespace Kufer\KuferTools\Utils\Ummelden;

abstract class Ummelden
{
  protected $dbwBelegung;
  protected $toolId;
  protected $toolSettings;

  public function __construct($toolId)
  {
    $this->dbwBelegung = new \DBWorkBelegung();
    $this->toolId = $toolId;
    $this->toolSettings = \ToolSettingsAPI::getToolSettings($toolId);
  }

  abstract protected function doUmmeldung($belegungsArray, $zielKursNr);

  abstract protected function getHindernisGruende($belegung, $zielKursNr);

  public static function getUmmeldenArt($toolId)
  {
    if (!\SessionOperations::isReplikat()) {
      return new UmmeldenDirekt($toolId);
    } elseif (\SessionOperations::isDmzBetrieb()) {
      return new UmmeldenDMZ($toolId);
    } else {
      return new UmmeldenEmail($toolId);
    }
  }

  public function ummelden($belegungsArray, $zielKursNr)
  {
    if (count($belegungsArray) < 1) {
      return '';
    }
    $aktuelleKursNr = $belegungsArray[0]->knr;
    $ummeldenStatus = new UmmeldenStatus();
    
    
    $gruende = $this->getBelegungsIdsMitHindernisGruenden($belegungsArray, $zielKursNr);

    
    $belegungenOhneHindernisGruende = array_filter($belegungsArray, function($belegung) use ($gruende) {
      return count($gruende[$belegung->id]) == 0;
    });

    
    $belegungenMitHindernisGruende = array_filter($belegungsArray, function($belegung) use ($gruende) {
      return count($gruende[$belegung->id]) > 0;
    });

    $ummeldenStatus->hindernisGruende = $belegungenMitHindernisGruende;

    if (count($belegungenOhneHindernisGruende) > 0) {
      $doUmmeldungResult = $this->doUmmeldung($belegungenOhneHindernisGruende, $zielKursNr);
      $ummeldenStatus->successStatus = $doUmmeldungResult->successStatus;
      $ummeldenStatus->errorStatus = $doUmmeldungResult->errorStatus;
      $ummeldenStatus->fatalError = $doUmmeldungResult->fatalError;
      
      if ($this->toolSettings->meldeImmerBenachrichtigungsMail) {
        $this->sendUmmeldungPerEmail($belegungenOhneHindernisGruende, $zielKursNr, $ummeldenStatus);
      }
    }
    
    
    if (count($belegungenMitHindernisGruende) > 0) {
      
      $hilfsSuccessStatus = $ummeldenStatus->successStatus;
      $ummeldenStatus->successStatus = array();
      $this->sendUmmeldungPerEmail($belegungenMitHindernisGruende, $zielKursNr, $ummeldenStatus);
      
      $ummeldenStatus->successStatus = $hilfsSuccessStatus;
    }

    return $this->getStatusMeldungFromUmmeldenResult($ummeldenStatus, $aktuelleKursNr, $zielKursNr);
  }

  protected function getStatusMeldungFromUmmeldenResult($ummeldenStatus, $aktuelleKursNr, $zielKursNr)
  {
    $statusMeldung = '';
    if ($ummeldenStatus->fatalError) {
      return $this->getFatalErrorAlert();
    }
    if (count($ummeldenStatus->successStatus) > 0) {
      $statusMeldung .= $this->getSuccessStatusAlert($ummeldenStatus->successStatus, $zielKursNr);
    }
    if (count($ummeldenStatus->errorStatus) > 0) {
      $statusMeldung .= $this->getErrorStatusAlert($ummeldenStatus->errorStatus, $zielKursNr);
    }
    if (count($ummeldenStatus->hindernisGruende) > 0) {
      $statusMeldung .= $this->getHindernisGruendeAlert($ummeldenStatus->hindernisGruende, $aktuelleKursNr, $zielKursNr);
    }

    return $statusMeldung;
  }

  protected function getFatalErrorAlert()
  {
    $text = 'Das Ummelden der Belegungen war aufgrund technischer Probleme nicht möglich.';

    return \HTMLOperations::getBootstrapAlert('danger', $text);
  }

  protected function getSuccessStatusAlert($belegungsArray, $zielKursNr)
  {
    $text = 'Für folgende Teilnehmer wurde eine Ummeldung nach Kurs ' . \CleanOperations::cleanStringForHtml($zielKursNr) . ' erfolgreich durchgeführt: ' . BR;
    $text .= $this->getNameVornameListeFromBelegungsArray($belegungsArray);

    return \HTMLOperations::getBootstrapAlert('success', $text);
  }

  protected function getErrorStatusAlert($belegungsArray, $zielKursNr)
  {
    $text = 'Für folgende Teilnehmer konnte die Ummeldung nach Kurs ' . \CleanOperations::cleanStringForHtml($zielKursNr) . ' wegen eines Fehlers nicht durchgeführt werden: ' . BR;
    $text .= $this->getNameVornameListeFromBelegungsArray($belegungsArray);

    return \HTMLOperations::getBootstrapAlert('danger', $text);
  }

  protected function getHindernisGruendeAlert($belegungsArray, $aktuelleKnr, $zielKursNr)
  {
    $text = 'Die folgenden Teilnehmer werden aus folgenden Gründen nicht automatisch nach Kurs ' . \CleanOperations::cleanStringForHtml($zielKursNr) . ' umgemeldet: ' . BR;
    $text .= $this->getNameVornameMitHindernisGruendeFromBelegungsArray($belegungsArray, $aktuelleKnr, $zielKursNr);
    if (\APIGebuehren::hasKursFortlaufendeGebuehren($aktuelleKnr)) {
      $text .= BR . 'Führen Sie bitte die Abmeldung vom alten Kurs und Anmeldung zum neuen Kurs separat durch.';
    } else {
      $text .= BR . 'Es wurde eine E-Mail mit den gewünschten Ummeldungen an die Einrichtung versendet.';
    }

    return \HTMLOperations::getBootstrapAlert('info', $text);
  }

  private function getHindernisGruendeMessageArray($gruende, $aktuelleKursNr, $zielKursNr)
  {
    $hindernisGruendeHelper = new \Kufer\KuferTools\Utils\HindernisGruende\HindernisGruende();
    $gruendeMessageArray = array();
    foreach ($gruende as $grund) {
      $gruendeMessageArray[] = $hindernisGruendeHelper->getMessageForGrund($grund, $aktuelleKursNr, $zielKursNr);
    }

    return $gruendeMessageArray;
  }

  protected function getNameVornameListeFromBelegungsArray($belegungsArray)
  {
    $nameList = array_map(function($belegung) {
      return $belegung->teilnehmer->name_vorname;
    }, $belegungsArray);

    return implode(',' . BR, $nameList);
  }

  protected function getNameVornameMitHindernisGruendeFromBelegungsArray($belegungsArray, $aktuelleKnr, $zielKursNr)
  {
    $nameGruendeTextArray = array();
    $gruendeByBelId = $this->getBelegungsIdsMitHindernisGruenden($belegungsArray, $zielKursNr);
    foreach ($belegungsArray as $belegung) {
      $grundText = implode(BR, $this->getHindernisGruendeMessageArray($gruendeByBelId[$belegung->id], $aktuelleKnr, $zielKursNr));

      $nameGruendeTextArray[] = $belegung->teilnehmer->name_vorname . BR . $grundText . BR;
    }

    return implode(BR, $nameGruendeTextArray);
  }

  private function sendUmmeldungPerEmail($belegungsArray, $zielKursNr, $ummeldenResult)
  {
    $ummeldenEmailHelper = new UmmeldenEmail($this->toolId, $ummeldenResult);
    $ummeldenEmailHelper->ummelden($belegungsArray, $zielKursNr);
  }

  
  private function getBelegungsIdsMitHindernisGruenden($belegungsArray, $zielKursNr)
  {
    static $cache = null;
    if (is_null($cache)) {
      $gruende = array();
      foreach ($belegungsArray as $belegung) {
        $gruende[$belegung->id] = $this->getHindernisGruende($belegung, $zielKursNr);
      }
      $cache = $gruende;
    }

    return $cache;
  }
}


class UmmeldenStatus
{
  
  public $errorStatus = array();

  
  public $successStatus = array();

  
  public $hindernisGruende = array();

  
  public $fatalError = false;
}