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

namespace Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Termine;

use Kufer\Web\KuferTools\Dozent\Anwesenheiten\Utils\KurstageUtils;
use Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar\Vertrag\Utils\VertragUtils;
use Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\DozentenKurstage;

class DozTermineUseCase extends \Kufer\Web\KuferTools\Basis\Kursdetails\Detailsreiter\Termine\TermineUseCase
{
  public static function getToolId()
  {
    return \ToolsAPI::TOOL_KURSUEBERSICHT_DOZ;
  }

  public static function getToolSectionId()
  {
    return 4;
  }

  protected function getMainReiterId()
  {
    return 334;
  }

  protected function getDatamodulHelper($kurs): \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\KurstageZuKurs
  {
    return new \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\DozKurstageZuKurs($this->toolSettings, $this->getUser(), $this->request, $kurs);
  }

  protected function getButtons()
  {
    $buttonsObj = new \Kufer\Web\KuferTools\Basis\Kursdetails\Detailsreiter\DozTermineReiterButtons($this, $this->request, $this->response);

    return $buttonsObj->getButtons();
  }

  public function action()
  {
    $kurs = $this->getKurs($this->getKursNummer());
    $termine = $this->getKurstage($kurs);
    $termine = $this->aktualisiereKurstage($termine);

    $showInformiereTnDialog = false;
    $actionInformiereTnDialog = '';
    if ($this->toolSettings->terminAenderungMailAnTnDialog && ($this->request->eintraegeGeloescht || $this->request->eintraegeBearbeitet)) {
      $showInformiereTnDialog = true;
      $actionInformiereTnDialog = $this->request->eintraegeGeloescht ? 'sammelEMailDeletedKurstage' : 'sammelEMailChangedKurstage';
    }

    return $this->getResponse($kurs, $termine, $showInformiereTnDialog, $actionInformiereTnDialog);
  }

  
  protected function aktualisiereKurstage($pKurstage)
  {
    $pKurstage = parent::aktualisiereKurstage($pKurstage);

    if (\DBWorkTools::getDefaultInstance()->isToolAllowed($this->getUser()->getIdentifier(), \ToolsAPI::TOOL_ANWESENHEIT_DOZ)
        && $this->getRecht('273.0.3', \ToolsApi::TOOL_ANWESENHEIT_DOZ) == 2) {
      $settingsKlassenbuch = \ToolSettingsAPI::getToolSettings(\ToolsAPI::TOOL_ANWESENHEIT_DOZ);
      foreach ($pKurstage as $kurstag) {
        if (!\Kufer\Web\KuferTools\Dozent\Anwesenheiten\Utils\KurstageUtils::hasAccessToKurstag($kurstag->id, $settingsKlassenbuch)
          || !KurstageUtils::hasAccessToAnwesenheitenOfKurstag($kurstag->getKurs(), $kurstag, \ToolSettingsAPI::getToolSettings(\ToolsAPI::TOOL_ANWESENHEIT_DOZ))) {
          continue;
        }

        $kurstag->linkToOnlineKlassenbuch = '?tool_id=' . \ToolsApi::TOOL_ANWESENHEIT_DOZ
          . '&action=anwesenheitseingabe&ktid=' . $kurstag->id
          . '&hideBlaettern=true'
          . '&referer=' . $this->getRefererUrl();
      }
    }

    return $pKurstage;
  }

  protected function showTermineLoeschenButton(): bool
  {
    return $this->isRechtAllowed('4.0.3');
  }

  
  protected function getResponse(
    $kurs,
    $termine,
    $pShowInformiereTnDialog = false,
    $pActionInformiereTnDialog = ''
  ) {
    $response = parent::getResponse($kurs, $termine);
    $response->statusCode = $this->request->statusCode;
    $response->failedToUpdateKtAry = $this->request->failedToUpdateKtAry;
    $response->eintraegeGeloescht = $this->request->eintraegeGeloescht;
    $response->eintraegeBearbeitet = $this->request->eintraegeBearbeitet;
    $response->nichtPassendeKursdaten = array();
    $response->hasRecht4KursAnpassen = false;
    $response->showInformiereTnDialog = $pShowInformiereTnDialog;
    $response->actionInformiereTnDialog = $pActionInformiereTnDialog;
    $response->markierenButtons = $this->bieteMarkierenAn();

    if (\DBWorkBASysSettings::isOffenbachJuku() && !$kurs->isKursMitBerichtOffenbach()) {
      $response->columns = array_values(array_filter($response->columns, function(\Column $column) {
        return $column->fieldname != 'bericht_abgeben';
      }));
    }

    return $response;
  }

  protected function getKurstage($kurs)
  {
    if ((\DBWorkBASysSettings::isMVHS())) { 
      if (!\SessionOperations::isAdmin()) {
        $this->request->termineDozentRadio = 'eigene';
      }
    } elseif ($this->toolSettings->eigeneTermineDozent && !isset($this->request->termineDozentRadio)) {
      $this->request->termineDozentRadio = 'eigene';
    }
    $kurstage = parent::getKurstage($kurs);

    return \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\DozentenKurstage::erweitereKurstageUmRechnungsstatus(
      $kurstage,
      $this->getUser(),
      DozentenKurstage::determineIfShouldCheckAnwesenheiten($this->toolSettings, $kurs)
    );
  }

  public function zeigeTerminAbsagenButton()
  {
    return $this->isRechtAllowed('4.0.2');
  }

  public function zeigeTerminAbrechnenButton()
  {
    if (\DBWorkBASysSettings::isMVHS()) {
      static $vertragUtils = null;
      if (is_null($vertragUtils)) {
        $vertragUtils = \Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar\Vertrag\Utils\VertragUtilsDefaultDruckenAkzeptierenAblehnen::getVertragUtils($this->request->knr);
      }

      return $vertragUtils->isVertragBereitsAkzeptiert();
    }

    return false;
  }

  public function zeigeTerminAbrechnenButtonNeussVhs()
  {
    if (\DBWorkBASysSettings::isNeussVhs()) {
      return true;
    }

    return false;
  }

  public function zeigeTerminAbrechnenButtonMoenchengladBildungswerk(): bool
  {
    return \DBWorkBASysSettings::isMoenchengladBildungswerk();
  }

  public function zeigeTerminDirectAbrechnenButton()
  {
    try {
      if (\Kufer\Web\KuferTools\Utils\Dozent\TerminDirectAbrechnenUtils::hasAccessToTerminDirectAbrechnen() && $this->isRechtAllowed('4.0.8')) {
        if (VertragUtils::hasEinrichtungAccessToVertragFunktionen()) {
          static $vertragUtils = null;
          if (is_null($vertragUtils)) {
            $vertragUtils = call_user_func(
              \Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar\Vertrag\Utils\VertragUtils::getVertragUtilsFunction(),
              $this->request->knr
            );
          }

          return $vertragUtils->isVertragBereitsAkzeptiert();
        }

        return true;
      }
    } catch(\Exception $e) {
      \Logger::logg('Reiter Termine: Vertragsstatus konnte nicht ermittelt werden. Fehlermeldung: ' . $e->getMessage());
    }

    return false;
  }

  public function zeigeHonorarReiterButton()
  {
    return \DBWorkBASysSettings::isMVHS() && $this->isRechtAllowed('334.1.5');
  }

  public function bieteMarkierenAn()
  {
    return $this->zeigeTerminAbsagenButton()
      || $this->zeigeTerminAbrechnenButton()
      || $this->zeigeTerminDirectAbrechnenButton()
      || $this->zeigeTerminAbrechnenButtonNeussVhs()
      || $this->zeigeTerminAbrechnenButtonMoenchengladBildungswerk();
  }

  public function zeigeTermineLoeschenButton(): bool
  {
    return $this->isRechtAllowed('4.0.3');
  }

  public function zeigeTermineBearbeitenButton(): bool
  {
    return $this->isRechtAllowed('4.0.7');
  }

  public function zeigeTermineHinzufuegenButton(): bool
  {
    return $this->isRechtAllowed('4.0.6');
  }

  public function zeigeTermineKopierenButton(): bool
  {
    return $this->isRechtAllowed('4.0.5') && $this->zeigeTermineHinzufuegenButton();
  }

  private function getRefererUrl(): string
  {
    $url = \URL::loadCurrent();
    
    
    if ($url->hasParameter('action') && in_array($url->getParameterValue('action'), array('reiterTermine', 'resetFilterTermine', 'setFilterTermine'))) {
      $url->setParameterValue('action', 'kursdetails');
    }

    return urlencode($url->getUrlRelative());
  }
}