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

namespace Kufer\KuferTools\Dozent\Anwesenheiten\Utils;

class KurstageUtils
{
  
  public static function hasAccessToKurstag($pKurstagId, $pToolSettings)
  {
    $excludeKurstagStatus = 'A';
    $dbwKurstage = self::getDbwKursTage($pToolSettings, $excludeKurstagStatus);
    $datum = $dbwKurstage->getKurstag($pKurstagId)->datum;
    $maxDaysBack = $pToolSettings->aktKurstageBackScroll;
    $maxDaysBack4Leiter = $maxDaysBack;
    $dozentIsLeiter = self::isDozentLeiter($pToolSettings);
    if ($dozentIsLeiter) {
      $maxDaysBack4Leiter = max($pToolSettings->aktKurstageBackScroll4Leiter, $maxDaysBack);
    }

    if (self::istDatumMehrAlsXTageInVergangenheit($datum, $maxDaysBack4Leiter)) {
      return false;
    }

    if (!\DateTimeOperations::isDatebeforeNow($datum, -1)) {
      return false;
    }

    $data = self::getKurstageFromUebersicht($pToolSettings, $datum, $pKurstagId);

    if (empty($data)) {
      return false;
    }

    return true;
  }

  
  public static function istDatumMehrAlsXTageInVergangenheit($datum, $tage)
  {
    return \DateTimeOperations::isDatebeforeNow($datum, $tage);
  }

  public static function isDozentLeiter($pToolSettings)
  {
    static $result = null;
    if (is_null($result)) {
      if ($pToolSettings->showKurstage === 'leiter') {
        $user = self::getUser();
        $dbwKT = self::getDbwKursTage($pToolSettings);
        $maxDaysBack4Leiter = max($pToolSettings->aktKurstageBackScroll4Leiter, $pToolSettings->aktKurstageBackScroll);
        $maxDateBack4Leiter = \DateTimeOperations::getNextDate(\DateTimeOperations::getDateNow(), (-1 * $maxDaysBack4Leiter));
        
        $result = $dbwKT->isDozentLeiterFuerKTinZeitraum($user->dnr, $maxDateBack4Leiter, \DateTimeOperations::getDateNow());
      } else {
        $result = false;
      }
    }

    return $result;
  }

  
  public static function getKurstageFromUebersicht($pToolSettings, $pDatum, $pKurstagId = null)
  {
    $excludeKurstagStatus = 'A';

    $dbwHlGrundSys = \DBWorkHLGrundSys::getDefaultInstance(1, true);
    $anwKurstageX = $dbwHlGrundSys->getFeldWert('ANW_KURSTAGEX');
    if ($anwKurstageX === 'W') {
      $excludeKurstagStatus .= 'X';
    }

    $dbwKurstage = self::getDbwKursTage($pToolSettings, $excludeKurstagStatus);
    $user = self::getUser();
    if ($user->dnr > 0) {
      $dbwKurstage->toobject->nodoztool = true;
    }
    if ($user->tnr > 0) {
      $dbwKurstage->toobject->notntool = true;
    }
    $maxDaysBack = $pToolSettings->aktKurstageBackScroll;

    if (self::isDozentLeiter($pToolSettings)) {
      
      
      
      $tagIstImNormalZeitraum = !self::istDatumMehrAlsXTageInVergangenheit($pDatum, $maxDaysBack);
      $kursTage = $dbwKurstage->getKurstagebyDozentNRAndDate4Leiter($user->dnr, $pDatum, !$tagIstImNormalZeitraum, $pKurstagId);
    } elseif ($pToolSettings->showKurstage === 'alle4kurs') {
      
      $kursTage = $dbwKurstage->getKurstage4DozentOfKursbyDateRange($user->dnr, $pDatum, $pDatum, $pKurstagId);
    } else { 
      
      $kursTage = $dbwKurstage->getKurstagebyDozentNRAndDateRange($user->id, $pDatum, $pDatum, $pKurstagId);
    }

    return $kursTage;
  }

  
  public static function getDbwKursTage($pToolSettings, $pExcludeKtStatus = '')
  {
    static $dbwKT = null;
    if (is_null($dbwKT)) {
      $ktStatusAndModifier = self::getKurstagStatusAndModifier($pToolSettings->ktstatus_ktuebersicht, $pExcludeKtStatus);
      $ktStatus = $ktStatusAndModifier['ktStatus'];
      $addKurstagWithSelectedStatus = $ktStatusAndModifier['modifier']; 
      $dbwKT = new \DBWorkKurseTageWT(1, false, $addKurstagWithSelectedStatus);
      $dbwKT->newSearch();
      $dbwKT->fromobject->ausfall = $ktStatus;
      $dbwKT->toobject->ausfall = $ktStatus;
      $dbwKT->orderby = $pToolSettings->sortkt_ktuebersicht;
      $dbwKT->orderbyasc = $pToolSettings->sortktasc_ktuebersicht;
    }

    return $dbwKT;
  }

  
  private static function getKurstagStatusAndModifier($pKtStatus, $pExcludeKtStatus)
  {
    $addKurstagWithSelectedStatus = true;
    if ($pExcludeKtStatus !== '') {
      if ($pKtStatus !== '') {
        for ($i = 0; $i < \StringOperations::strlen($pExcludeKtStatus); $i++) {
          $pKtStatus = str_replace($pExcludeKtStatus[$i], '', $pKtStatus);
        }
      } else {
        $pKtStatus = $pExcludeKtStatus;
        $addKurstagWithSelectedStatus = false;
      }
    }

    return array('ktStatus' => $pKtStatus, 'modifier' => $addKurstagWithSelectedStatus);
  }

  
  private static function getUser()
  {
    return \Kufer\KuferTools\Basis\UseCase\ToolUseCase::getUser();
  }

  public static function canDozentKursAbschliessen(\Kurs $kurs): bool
  {
    if (empty($kurs->id)) { 
      return false;
    }

    $dbwKurstage = \DBWorkKurseTage::getDefaultInstance();
    $kurstage = $dbwKurstage->getKurstageIdsByKursIdAndStatus($kurs->id, \ConstantOperations::getKurstagStatusKuerzelHasTeilnahme());
    $dbwAnw = \DBWorkAnwesenheit::getDefaultInstance();
    foreach ($kurstage as $kurstag) {
      if (!$dbwAnw->hasKurstagAnwesenheiten($kurstag)) {
        return false;
      }
    }

    return true;
  }
}