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

namespace Kufer\Web\KuferTools\Utils\HindernisGruende;

use Kufer\Web\Classes\Addfunctions\KursOperations;

class HindernisGruendeStornoDMZ extends HindernisGruendeDMZ
{
  protected $anzahlFreiWerdenderPlaetze;
  protected $toolSettings;
  private $isAutoStorno;

  public function __construct($pDmzResponseArray, $pAnzahlFreiWerdenderPlaetze, $pToolSettings)
  {
    parent::__construct($pDmzResponseArray);
    
    $this->anzahlFreiWerdenderPlaetze = $pAnzahlFreiWerdenderPlaetze;
    $this->toolSettings = $pToolSettings;
    
    $this->isAutoStorno = false;
  }

  
  protected function setAutoStorno()
  {
    $this->isAutoStorno = true;
  }

  
  protected function resetAutoStorno()
  {
    $this->isAutoStorno = false;
  }

  protected function isAutoStorno()
  {
    return $this->isAutoStorno;
  }

  
  public function getHindernisGrundArray($pBelegung, $pKurs, $pIsAuto)
  {
    if ($pIsAuto) {
      
      
      return $this->getHinderungsGruendeAutomatisch($pBelegung);
    }
    
    return $this->getHinderungsGruendeGeneral($pKurs, $this->anzahlFreiWerdenderPlaetze);
  }

  
  protected function getHinderungsGruendeAutomatisch($pBelegung)
  {
    
    $this->setAutoStorno();
    
    $hindernisGruende4Belegungen = $this->getHindernisGruende($pBelegung);

    
    $hindernisGruende4Kurs = $this->getHinderungsGruendeGeneral($pBelegung->kurs, $this->anzahlFreiWerdenderPlaetze);
    $this->resetAutostorno();
    
    return array_merge($hindernisGruende4Belegungen, $hindernisGruende4Kurs);
  }

  
  protected function getHinderungsGruendeGeneral($pKurs, $pAnzahlFreiwerdenderPlaetze)
  {
    $hindernisgruende = array();

    
    
    if ($this->isAnmeldeschlussErreicht($pKurs)) {
      $hindernisgruende[] = $this->getHindernisGrundObj(self::KURS_IST_ANMELDESCHLUSS_ERREICHT);
    }

    
    
    if ($this->hatKursBereitsBegonnen($pKurs)) {
      $hindernisgruende[] = $this->getHindernisGrundObj(self::KURS_HAT_BEREITS_BEGONNEN);
    }

    
    

    
    $autoSuffix = $this->isAutoStorno() ? 'Auto' : '';
    $stornoNurXTageVorher = 'stornoNurXTageVorher' . $autoSuffix;
    
    
    if ($this->isKursBeginnInWenigerAlsXTagen($pKurs, $this->toolSettings->{$stornoNurXTageVorher})) {
      $hindernisgruende[] = $this->getHindernisGrundObj(self::KURSBEGINN_IN_WENIGER_ALS_X_TAGEN, $this->toolSettings->{$stornoNurXTageVorher});
    }


    
    if ($this->wirdMinTnAnzahlUnterschritten($pAnzahlFreiwerdenderPlaetze)) {
      $hindernisgruende[] = $this->getHindernisGrundObj(self::MIN_TN_ANZAHL_WIRD_UNTERSCHRITTEN);
    }


    if ($this->isKursBereitsAbgeschlossen($pKurs)) {
      $hindernisgruende[] = $this->getHindernisGrundObj(self::KURS_IST_BEREITS_ABGESCHLOSSEN);
    }

    

    return $hindernisgruende;
  }

  

  
  public function getHindernisGruende($pBelegung, $pZielKursNr = '')
  {
    $hindernisGrundIds = parent::getHindernisGruende($pBelegung);
    
    $hindernisGruende = array();
    foreach ($hindernisGrundIds as $hindernisGrundId) {
      $hindernisGruende[] = $this->getHindernisGrundObj($hindernisGrundId);
    }

    
    
    $statusAllowed = \PhpOperations::getIfIsset($this->toolSettings, 'storno_status_allowed');

    if (trim($statusAllowed) === '') {
      
      if (!self::checkBelegungsStatus($pBelegung, $statusAllowed)) {
        $hindernisGruende[] = $this->getHindernisGrundObj(self::STATUS_PASST_NICHT);
      }
    } 

    return $hindernisGruende;
  }

  

  
  private function getHindernisGrundObj($pHindernisGrundId, $pAttrib = '')
  {
    $obj = new \stdClass();
    $obj->id = $pHindernisGrundId;
    $obj->attrib = $pAttrib;

    return $obj;
  }

  
  protected static function checkBelegungsStatus($pBelegung, $pAllowedStati)
  {
    if (trim($pAllowedStati) === '') {
      return true;
    }
    $status = trim($pBelegung->status) != '' ? $pBelegung->status : 'A';

    return \StringOperations::stripos($pAllowedStati, $status) !== false;
  }

  
  private function isAnmeldeschlussErreicht($pKurs)
  {
    
    $autoSuffix = $this->isAutoStorno() ? 'Auto' : '';
    $stornoKursAnmEndePruefen = 'stornoKursAnmEndePruefen' . $autoSuffix;

    
    if (is_object($this->toolSettings) && $this->toolSettings->{$stornoKursAnmEndePruefen}) {
      $anmende = KursOperations::getAnmEnde($pKurs);
      
      if (!\DateTimeOperations::isDateTimeEmptyOrDefault($anmende)) {
        $heute = \DateTimeOperations::getDateNow();

        return \DateTimeOperations::isDateBefore($anmende, $heute);
      }
      
      return false;
    } 

    return false;
  }

  

  
  protected function hatKursBereitsBegonnen($pKurs)
  {
    
    $autoSuffix = $this->isAutoStorno() ? 'Auto' : '';
    $stornoKursBeginnPruefen = 'stornoKursBeginnPruefen' . $autoSuffix;

    if (is_object($this->toolSettings) && $this->toolSettings->{$stornoKursBeginnPruefen}) {
      return parent::hatKursBereitsBegonnen($pKurs);
    }

    return false;
  }

  
  protected function isKursBeginnInWenigerAlsXTagen($pKurs, $pTageVorher)
  {
    
    if ($pTageVorher > 0) {
      return parent::isKursBeginnInWenigerAlsXTagen($pKurs, $pTageVorher);
    }

    return false;
  }

  
  protected function isKursBereitsAbgeschlossen($pKurs)
  {
    
    
    $autoSuffix = $this->isAutoStorno() ? 'Auto' : '';
    $stornoKursAbschlussPruefen = 'stornoKursAbschlussPruefen' . $autoSuffix;

    if (is_object($this->toolSettings) && $this->toolSettings->{$stornoKursAbschlussPruefen}) {
      return parent::isKursBereitsAbgeschlossen($pKurs);
    }

    return false;
  }

  
  protected function wirdMinTnAnzahlUnterschritten($pAnzahlFreiWerdenderPlaetze)
  {
    
    $autoSuffix = $this->isAutoStorno() ? 'Auto' : '';
    $stornoMinTNanzahlPruefen = 'stornoMinTNanzahlPruefen' . $autoSuffix;
    if (is_object($this->toolSettings) && $this->toolSettings->{$stornoMinTNanzahlPruefen}) {
      return $pAnzahlFreiWerdenderPlaetze > 0 && $this->dmzResponse->tnMin > $this->dmzResponse->anzahlAnmeldungen - $pAnzahlFreiWerdenderPlaetze;
    }

    return false;
  }

  protected function isZielKursBereitsAbgeschlossen($pZielKursNr)
  {
    return false;
  }
}