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

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

use Kufer\Web\Classes\Dbfilter\TeilnehmerSQLFilter;
use Kufer\Web\Classes\Identifier\Identifier;
use Kufer\Web\Classes\Identifier\IdentifierFactory;
use Kufer\Web\KuferTools\Utils\FilterSettings\IFilterSettings;
use Kufer\Web\KuferTools\Utils\FilterSettings\Teilnehmer\TeilnehmerFilterSettingsHelper;

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

  
  protected $filterSettings;

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

  
  protected function getTeilnehmer(\DBWorkTeilnehmer $dbwTeilnehmer, TeilnehmerSQLFilter $filter): array
  {
    return $dbwTeilnehmer->findByFilter($filter);
  }

  
  protected function getTeilnehmerIds(\DBWorkTeilnehmer $dbwTeilnehmer, TeilnehmerSQLFilter $filter): array
  {
    return $dbwTeilnehmer->findIdsByFilter($filter);
  }

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

      $alleTnrs = $this->getTeilnehmerIds($dbwTeilnehmer, $tnFilter);
    }

    return $alleTnrs;
  }

  public function getIdsOhneFilter()
  {
    static $alleTnrs = null;
    if (is_null($alleTnrs)) {
      $tnFilter = TeilnehmerSQLFilter::create();
      $dbwTeilnehmer = $this->getDBWork();
      $dbwTeilnehmer = $this->setzeEinstellungen($dbwTeilnehmer, $tnFilter);
      $dbwTeilnehmer = $this->setzeSortierung($dbwTeilnehmer);
      $alleTnrs = $this->getTeilnehmerIds($dbwTeilnehmer, $tnFilter);
    }

    return $alleTnrs;
  }

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

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

    return $allowedIds[$cacheKey];
  }

  protected function setzeEinstellungen(\DBWorkTeilnehmer $dbwTeilnehmer, TeilnehmerSQLFilter $filter): \DBWorkTeilnehmer
  {
    $this->createFilterSettings()->applySettings($filter);

    return $dbwTeilnehmer;
  }

  protected function setzeSortierung(\DBWorkTeilnehmer $dbwTeilnehmer): \DBWorkTeilnehmer
  {
    return $dbwTeilnehmer;
  }

  protected function setzeFilter(\DBWorkTeilnehmer $dbwTeilnehmer, TeilnehmerSQLFilter $filter, int $pToolId): \DBWorkTeilnehmer
  {
    return $dbwTeilnehmer;
  }

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

    return $dbwTeilnehmer;
  }

  public function getDatamoduleByIds($pIds)
  {
    $pIds = \Kufer\Web\Classes\Identifier\IdentifierFactory::createFromIdsIfNecessary($pIds);

    $dbwTeilnehmer = $this->getDBWork();

    return $dbwTeilnehmer->getTeilnehmByIdArray($pIds);
  }

  public function getDatamoduleOhneFilter()
  {
    $tnFilter = TeilnehmerSQLFilter::create();
    $dbwTeilnehmer = $this->getDBWork();
    $dbwTeilnehmer = $this->setzeEinstellungen($dbwTeilnehmer, $tnFilter);
    $dbwTeilnehmer = $this->setzeSortierung($dbwTeilnehmer);

    return $this->getTeilnehmer($dbwTeilnehmer, $tnFilter);
  }

  public function getDatamoduleMitFilter($pToolId)
  {
    $tnFilter = TeilnehmerSQLFilter::create();
    $dbwTeilnehmer = $this->getDBWork();
    $dbwTeilnehmer = $this->setzeEinstellungen($dbwTeilnehmer, $tnFilter);
    $dbwTeilnehmer = $this->setzeSortierung($dbwTeilnehmer);
    $dbwTeilnehmer = $this->setzeFilter($dbwTeilnehmer, $tnFilter, $pToolId);

    return $this->getTeilnehmer($dbwTeilnehmer, $tnFilter);
  }

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

  public static function createMitarbeiterTeilnehmerUebersicht(\ToolSettings $toolSettings, \Benutzer $user): TeilnehmerHelper
  {
    return new MitarbeiterTeilnehmerUebersicht(
      $toolSettings,
      TeilnehmerFilterSettingsHelper::createMitarbeiterTeilnehmerUebersichtFilterSettings($toolSettings, $user),
      $user
    );
  }

  public static function createMitarbeiterAnmeldungTeilnehmerUebersicht(\ToolSettings $toolSettings, \Benutzer $user): TeilnehmerHelper
  {
    return new MitarbeiterAnmeldungTeilnehmer(
      $toolSettings,
      TeilnehmerFilterSettingsHelper::createMitarbeiterTeilnehmerAnmeldungUebersichtFilterSettings($toolSettings, $user),
      $user
    );
  }

  public static function createMitarbeiterAnmeldungTeilnehmerVonFirmaUebersicht(\ToolSettings $toolSettings, \Benutzer $user, $firmenTnr): TeilnehmerHelper
  {
    return new MitarbeiterAnmeldungTeilnehmer(
      $toolSettings,
      TeilnehmerFilterSettingsHelper::createMitarbeiterTeilnehmerAnmeldungUebersichtVonFirmenanmeldungFilterSettings($toolSettings, $user, $firmenTnr),
      $user
    );
  }

  public static function createMitarbeiterAnmeldungTeilnehmerVonKinderUebersicht(\ToolSettings $toolSettings, \Benutzer $user, $firmenTnr): TeilnehmerHelper
  {
    return new MitarbeiterAnmeldungTeilnehmer(
      $toolSettings,
      TeilnehmerFilterSettingsHelper::createMitarbeiterTeilnehmerAnmeldungUebersichtVonKindernFilterSettings($toolSettings, $user, $firmenTnr),
      $user
    );
  }

  public static function createVeranstalterTeilnehmerUebersicht(\ToolSettings $toolSettings, \Benutzer $user): TeilnehmerHelper
  {
    return new VeranstalterTeilnehmerUebersicht(
      $toolSettings,
      TeilnehmerFilterSettingsHelper::createVeranstalterTeilnehmerUebersichtFilterSettings($toolSettings, $user),
      $user
    );
  }

  public static function createVeranstalterAnmeldungTeilnehmerUebersicht(\ToolSettings $toolSettings, \Benutzer $user): TeilnehmerHelper
  {
    return new VeranstalterTeilnehmer(
      $toolSettings,
      TeilnehmerFilterSettingsHelper::createVeranstalterTeilnehmerAnmeldungUebersichtFilterSettings($toolSettings, $user),
      $user
    );
  }

  public static function createVeranstalterAnmeldungTeilnehmerVonFirmaUebersicht(\ToolSettings $toolSettings, \Benutzer $user, $firmenTnr): TeilnehmerHelper
  {
    return new VeranstalterTeilnehmer(
      $toolSettings,
      TeilnehmerFilterSettingsHelper::createVeranstalterTeilnehmerAnmeldungUebersichtVonFirmenanmeldungFilterSettings($toolSettings, $user, $firmenTnr),
      $user
    );
  }
}