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

namespace Kufer\Web\KuferTools\Utils\DatamodulHelper\Dozenten;

use Kufer\Web\Classes\Dbfilter\DozentenSQLFilter;
use Kufer\Web\Classes\Identifier\Identifier;
use Kufer\Web\Classes\Identifier\IdentifierFactory;
use Kufer\Web\KuferTools\Utils\FilterSettings\Dozenten\DozentenFilterSettingsHelper;
use Kufer\Web\KuferTools\Utils\FilterSettings\IFilterSettings;

abstract class DozentenHelper extends \DatamodulHelper
{
  protected $toolSettings;
  protected $user;

  
  protected $filterSettings;

  public function __construct($toolSettings, IFilterSettings $filterSettings, $user)
  {
    $this->toolSettings = $toolSettings;
    $this->filterSettings = $filterSettings;
    $this->user = $user;
  }

  
  protected function getDozentenNummern(\DBWorkDozenten $dbwDozenten, DozentenSQLFilter $filter): array
  {
    return $dbwDozenten->findIdsByFilter($filter);
  }

  public function getZugewieseneKennzeichenKennzQuery(): \SelectQueryBuilder
  {
    static $alleKennz = null;
    if (is_null($alleKennz)) {
      $filter = DozentenSQLFilter::create();
      $dbwDozenten = $this->getDBWork();
      $dbwDozenten = $this->setzeEinstellungen($dbwDozenten, $filter);
      $dbwDozenten = $this->setzeSortierung($dbwDozenten);

      $dbwKennzAd = new \DBWorkKennzAd();
      $alleKennz = $dbwKennzAd->getUniqueKennzForTypUndNrQuery('D', $dbwDozenten->findByFilterQuery($filter)->select('d.nr'));
    }

    return $alleKennz;
  }

  public function getIdsMitFilter($pToolId)
  {
    static $alleTnrs = null;
    if (is_null($alleTnrs)) {
      $dozFilter = DozentenSQLFilter::create();
      $dbwDozenten = $this->getDBWork();
      $dbwDozenten = $this->setzeEinstellungen($dbwDozenten, $dozFilter);
      $dbwDozenten = $this->setzeSortierung($dbwDozenten);
      $dbwDozenten = $this->setzeFilter($dbwDozenten, $dozFilter, $pToolId);

      $alleTnrs = $this->getDozentenNummern($dbwDozenten, $dozFilter);
    }

    return $alleTnrs;
  }

  public function getIdsOhneFilter()
  {
    static $alleTnrs = null;
    if (is_null($alleTnrs)) {
      $dozFilter = DozentenSQLFilter::create();
      $dbwDozenten = $this->getDBWork();
      $dbwDozenten = $this->setzeEinstellungen($dbwDozenten, $dozFilter);
      $dbwDozenten = $this->setzeSortierung($dbwDozenten);
      $alleTnrs = $this->getDozentenNummern($dbwDozenten, $dozFilter);
    }

    return $alleTnrs;
  }

  
  public function isAllowed($id): bool
  {
    $id = IdentifierFactory::createFromIdIfNecessary($id);
    $cacheKey = $id->getCacheKey();

    static $allowedIds = array();
    if (!array_key_exists($cacheKey, $allowedIds)) {
      $dozFilter = DozentenSQLFilter::create();
      $dbwDozenten = $this->getDBWork();
      $dbwDozenten = $this->setzeEinstellungen($dbwDozenten, $dozFilter);
      $dbwDozenten = $this->setzeSortierung($dbwDozenten);
      $dozFilter->equalsId($id);
      $allowedIds[$cacheKey] = $dbwDozenten->existsByFilter($dozFilter);
    }

    return $allowedIds[$cacheKey];
  }

  protected function createFilterSettings(): IFilterSettings
  {
    return $this->filterSettings;
  }

  protected function setzeEinstellungen(\DBWorkDozenten $dbwDozenten, DozentenSQLFilter $filter): \DBWorkDozenten
  {
    $this->createFilterSettings()->applySettings($filter);

    return $dbwDozenten;
  }

  protected function setzeSortierung(\DBWorkDozenten $dbwDozenten): \DBWorkDozenten
  {
    return $dbwDozenten;
  }

  protected function setzeFilter(\DBWorkDozenten $dbwDozenten, DozentenSQLFilter $filter, int $pToolId): \DBWorkDozenten
  {
    return $dbwDozenten;
  }

  
  public function getDBWork()
  {
    $dbwDozenten = new \DBWorkDozenten(1, true);
    $dbwDozenten->newSearch();

    return $dbwDozenten;
  }

  
  public function getDatamoduleByIds($pIds)
  {
    $dbwDozenten = $this->getDBWork();
    $dozenten = $dbwDozenten->getDozentenByIDArray($pIds);

    $pIds = array_map(static function($id) {
      return $id instanceof \Kufer\Web\Classes\Identifier\Identifier ? $id->getId() : $id;
    }, $pIds);
    $pIds = array_intersect($pIds, \ArrayOperations::mapAttribut($dozenten, 'id'));

    return \ArrayOperations::sortObjectsByValueArray($dozenten, $pIds, 'id');
  }

  public function getDatamoduleMitFilter($pToolId)
  {
    $ids = $this->getIdsMitFilter($pToolId);

    return $this->getDatamoduleByIds($ids);
  }

  
  final public static function createMitarbeiterDozentenUebersicht(\ToolSettings $toolSettings, \Benutzer $user): DozentenHelper
  {
    return new DozentenUebersichtHelper(
      $toolSettings,
      DozentenFilterSettingsHelper::createMitarbeiterUebersichtFilterSettings($toolSettings, $user),
      $user
    );
  }

  public static function createVeranstalterDozentenUebersicht(\ToolSettings $toolSettings, \Benutzer $user): DozentenHelper
  {
    return new DozentenUebersichtHelper(
      $toolSettings,
      DozentenFilterSettingsHelper::createVeranstalterUebersichtFilterSettings($toolSettings),
      $user
    );
  }

  public static function createVeranstalterLeiterUndMitarbeiterUebersicht(\ToolSettings $toolSettings, \Benutzer $user): DozentenHelper
  {
    return new DozentenUebersichtHelper(
      $toolSettings,
      DozentenFilterSettingsHelper::createVeranstalterLeiterUndMitarbeiterUebersichtFilterSettings($toolSettings),
      $user
    );
  }

  public static function createVeranstalterKooperationspartnerKursvorschlag(\ToolSettings $toolSettings, \Benutzer $user): DozentenHelper
  {
    return new DozentenUebersichtHelper(
      $toolSettings,
      DozentenFilterSettingsHelper::createVeranstalterKooperationspartnerKursvorschlagFilterSettings($toolSettings),
      $user
    );
  }

  public static function createVeranstalterDozentenKursvorschlag(\ToolSettings $toolSettings, \Benutzer $user): DozentenHelper
  {
    return new DozentenUebersichtHelper(
      $toolSettings,
      DozentenFilterSettingsHelper::createVeranstalterKursvorschlagFilterSettings($toolSettings),
      $user
    );
  }

  public static function createFirmaAusbilderAuswahlForTeilnehmer(\ToolSettings $toolSettings, \Benutzer $user): DozentenHelper
  {
    return new DozentenUebersichtHelper(
      $toolSettings,
      DozentenFilterSettingsHelper::createFirmaAusbilderDozentenauswahlFilterSettings($toolSettings, $user),
      $user
    );
  }

  public static function createDozentenDozentenBerichtTermine(\ToolSettings $toolSettings, \Benutzer $user, string $knr): DozentenHelper
  {
    return new DozentenUebersichtHelper(
      $toolSettings,
      DozentenFilterSettingsHelper::createDozentBerichtTermineFilterSettings($toolSettings, $user->getDnrIdentifier(), $knr),
      $user
    );
  }
}