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

namespace Kufer\KuferTools\Utils\HindernisGruende;

class HindernisGruende
{
  private $dbwBelegung;
  private $dbwZahlung;

  public function __construct()
  {
    $this->dbwBelegung = \DBWorkBelegung::getDefaultInstance();
    $this->dbwZahlung = \DBWorkZahlung::getDefaultInstance();
  }

  public const DMZBETRIEB_NICHT_AKTIV = 1;
  public const IST_TEIL_VON_MEHRFACHANMELDUNG = 2;
  public const IST_ELTERN_KIND_ANMELDUNG = 3;
  public const KURS_IST_BEREITS_ABGESCHLOSSEN = 4;
  public const ZIEL_KURS_IST_BEREITS_ABGESCHLOSSEN = 5;
  public const ZAHLUNG_BEREITS_ERFOLGT = 6;
  public const TEILNEHMER_NICHT_IM_KURS_ANGEMELDET = 7;
  public const BELEGUNG_NICHT_VORHANDEN = 8;
  public const ABGLEICH_VALIDIERUNGSFEHLER_BELEGUNGS_ID = 9;
  public const ABGLEICH_VALIDIERUNGSFEHLER_KURS_NR = 10;
  public const ABGLEICH_VALIDIERUNGSFEHLER_TN_NR = 11;
  public const ABGLEICH_TECHNISCHER_FEHLER = 12;

  
  public const KURS_HAT_BEREITS_BEGONNEN = 13;
  public const KURS_IST_ANMELDESCHLUSS_ERREICHT = 14;
  public const MIN_TN_ANZAHL_WIRD_UNTERSCHRITTEN = 15;
  public const STATUS_PASST_NICHT = 16;
  public const JOURNAL_NICHT_UEBERTRAGEN = 17;
  public const KURSBEGINN_IN_WENIGER_ALS_X_TAGEN = 18;

  
  public static function getMessageForGrund($grund, $aktuelleKursId = '', $zielKursId = '')
  {
    $sprachSettings = \SettingsFactory::getSettings(\SprachSettingsObject::class);
    $tnPrefix = ucfirst($sprachSettings->Teilnehmer['Singular_mit_Artikel']['Nominativ']);

    switch ($grund) {
      case self::DMZBETRIEB_NICHT_AKTIV:
        return 'Die DMZ ist nicht aktiv.';
      case self::IST_TEIL_VON_MEHRFACHANMELDUNG:
        return $tnPrefix . ' ist Teil einer Firmen- bzw. Mehrfachanmeldung.';
      case self::IST_ELTERN_KIND_ANMELDUNG:
        return $tnPrefix . ' ist mit Kindern angemeldet.';
      case self::KURS_IST_BEREITS_ABGESCHLOSSEN:
        return self::getKursAbgeschlossenMessage($aktuelleKursId, $sprachSettings);
      case self::ZIEL_KURS_IST_BEREITS_ABGESCHLOSSEN:
        return self::getKursAbgeschlossenMessage($zielKursId, $sprachSettings);
      case self::ZAHLUNG_BEREITS_ERFOLGT:
        return 'Aufgrund bereits erfolgter Zahlungen/Rechnungen ist eine Ummeldung nicht möglich.';
      case self::TEILNEHMER_NICHT_IM_KURS_ANGEMELDET:
        return $tnPrefix . ' ist nicht mit Status angemeldet in ' . $sprachSettings->Kurs['Singular_mit_Artikel']['Dativ'];
      case self::BELEGUNG_NICHT_VORHANDEN:
        return 'Belegungssatz ist auf dem Ernstbestand nicht (mehr) vorhanden.';
      case self::ABGLEICH_VALIDIERUNGSFEHLER_BELEGUNGS_ID:
      case self::ABGLEICH_VALIDIERUNGSFEHLER_KURS_NR:
      case self::ABGLEICH_VALIDIERUNGSFEHLER_TN_NR:
        return 'Technische Probleme: Plausibilitätsproblem beim Abgleich';
      case self::ABGLEICH_TECHNISCHER_FEHLER:
        return 'Technische Probleme: Fehler bei der Datenübertragung für die Plausibilitätsprüfung.';
      
      
      case self::KURS_IST_ANMELDESCHLUSS_ERREICHT:
        return 'Der Anmeldeschluss ist bereits erreicht ';
      case self::KURS_HAT_BEREITS_BEGONNEN:
        return $sprachSettings->Kurs['Singular_mit_Artikel']['Nominativ'] . ' hat bereits begonnen.';
      case self::JOURNAL_NICHT_UEBERTRAGEN:
        return 'Die Journaldaten sind nicht verfügbar, daher kann nicht geprüft werden, ob der Teilnehmer bereits Zahlungen getätigt hat.';
      default:
        return 'Kein Hindernisgrund gefunden.';
    }
  }

  private static function getKursAbgeschlossenMessage($knr, $sprachSettings)
  {
    return ucfirst($sprachSettings->Kurs['Singular_mit_Artikel']['Nominativ']) . ' ' . $knr . ' ist bereits abgeschlossen';
  }

  public function getHindernisGruende($belegung, $zielKursNr = '')
  {
    $hindernisGruende = array();

    if ($this->isDmzBetriebAktiv() == false) {
      $hindernisGruende[] = self::DMZBETRIEB_NICHT_AKTIV;
    }
    if ($this->isTeilVonMehrfachanmeldung($belegung)) {
      $hindernisGruende[] = self::IST_TEIL_VON_MEHRFACHANMELDUNG;
    }
    if ($this->isTeilVonFirmenanmeldung($belegung)) {
      $hindernisGruende[] = self::IST_TEIL_VON_MEHRFACHANMELDUNG;
    }
    if ($this->isElternKindAnmeldung($belegung)) {
      $hindernisGruende[] = self::IST_ELTERN_KIND_ANMELDUNG;
    }

    if (\APIGebuehren::hasKursFortlaufendeGebuehren($belegung->kurs->id) == false) {
      if ($this->isKursBereitsAbgeschlossen($belegung->kurs)) {
        $hindernisGruende[] = self::KURS_IST_BEREITS_ABGESCHLOSSEN;
      }
      if ($this->isZielKursBereitsAbgeschlossen($zielKursNr)) {
        $hindernisGruende[] = self::ZIEL_KURS_IST_BEREITS_ABGESCHLOSSEN;
      }
      if ($this->isZahlungBereitsErfolgt($belegung)) {
        $hindernisGruende[] = self::ZAHLUNG_BEREITS_ERFOLGT;
      }
      if ($this->isTeilnehmerInKursAngemeldetOhneTeilnahme($belegung) == false) {
        $hindernisGruende[] = self::TEILNEHMER_NICHT_IM_KURS_ANGEMELDET;
      }



      if ($this->isJournalUebertragen($belegung->id) == false) {
        $hindernisGruende[] = self::JOURNAL_NICHT_UEBERTRAGEN;
      }
    }

    if ($this->isBelegungInErnstbestandVorhanden() == false) {
      $hindernisGruende[] = self::BELEGUNG_NICHT_VORHANDEN;
    }
    if ($this->isBelegungsIdKorrekt($belegung) == false) {
      $hindernisGruende[] = self::ABGLEICH_VALIDIERUNGSFEHLER_BELEGUNGS_ID;
    }
    if ($this->isKursNrKorrekt($belegung) == false) {
      $hindernisGruende[] = self::ABGLEICH_VALIDIERUNGSFEHLER_KURS_NR;
    }
    if ($this->isTeilnehmerNrKorrekt($belegung) == false) {
      $hindernisGruende[] = self::ABGLEICH_VALIDIERUNGSFEHLER_TN_NR;
    }

    return $hindernisGruende;
  }

  
  protected function isJournalUebertragen($belegungsId)
  {
    $dbwZahlung = new \DBWorkZahlung(1, true);

    return count($dbwZahlung->getZahlungJournalByBelegId($belegungsId, true)) > 0;
  }

  protected function isDmzBetriebAktiv()
  {
    return \SessionOperations::isDmzBetrieb();
  }

  protected function isTeilVonMehrfachanmeldung($belegung)
  {
    return $this->dbwBelegung->isTeilEinerMehrfachAnmeldung($belegung->id) && \SessionOperations::isCurrentUserMitveranstalter();
  }

  protected function isTeilVonFirmenanmeldung($belegung)
  {
    return $this->dbwBelegung->isTeilEinerMehrfachAnmeldung($belegung->id) && \SessionOperations::isCurrentUserMitveranstalter();
  }

  protected function isElternKindAnmeldung($belegung)
  {
    return $this->dbwBelegung->IsElternKindanmeldung($belegung);
  }

  protected function isKursBereitsAbgeschlossen($pKurs)
  {
    return $pKurs->isAbgeschlossen();
  }

  protected function isZielKursBereitsAbgeschlossen($zielKursNr)
  {
    $dbwKurse = \DBWorkKurse::getDefaultInstance();
    $zielKurs = $dbwKurse->getKurs($zielKursNr);

    return $zielKurs->isAbgeschlossen();
  }

  protected function isZahlungBereitsErfolgt($belegung)
  {
    return $this->dbwZahlung->isStornoBzglZahlungOkForBelegung($belegung->id) == false;
  }

  
  protected function isTeilnehmerInKursAngemeldetOhneTeilnahme($pBelegung)
  {
    
    
    return in_array($pBelegung->status, array('A', 'P', ' ', '', 'W'));
  }

  protected function isBelegungInErnstbestandVorhanden()
  {
    return true;
  }

  protected function isBelegungsIdKorrekt($belegung)
  {
    return true;
  }

  protected function isKursNrKorrekt($belegung)
  {
    return true;
  }

  protected function isTeilnehmerNrKorrekt($belegung)
  {
    return true;
  }

  
  protected function hatKursBereitsBegonnen($pKurs)
  {
    if ($pKurs->beginn_dat != '') {
      if (\DateTimeOperations::isDatebeforeNow($pKurs->beginn_dat)) {
        return true;
      }
    }

    return false;
  }

  
  protected function isKursBeginnInWenigerAlsXTagen($pKurs, $pTagevorher)
  {
    if ($pKurs->beginn_dat != '') {
      
      if (\DateTimeOperations::isDatebeforeNow($pKurs->beginnDat, (-$pTagevorher))) {
        return true;
      }
    }

    return false;
  }
}