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

namespace Kufer\Web\Classes\Dbfilter;


class TnAusbildungVonSchabloneSQLFilter extends AbstractSQLFilter
{
  private const FILTER_OPTION_TN_SCHABL = 'tnschabl';

  protected function __construct()
  {
    parent::__construct();

    $this->registerDb('Id', 'id', static::TYPE_INTEGER);
    $this->registerDb('TeilnehmerId', 'tnr', static::TYPE_IDENTIFIER_NO_GUID);
    $this->registerDb('HlId', 'hlid', static::TYPE_INTEGER);
    $this->registerDb('FachId', 'fach', static::TYPE_INTEGER);
    $this->registerDb('Von', 'von', static::TYPE_DATETIME);
    $this->registerDb('Bis', 'bis', static::TYPE_DATETIME);
  }

  public function getTablePraeffix(): string
  {
    return 'tn_ausbildung';
  }

  
  public function isBetweenVonBis(string $datetime): self
  {
    return $this->all(static function(TnAusbildungVonSchabloneSQLFilter $filter) use ($datetime): TnAusbildungVonSchabloneSQLFilter {
      $filter->any(static function(TnAusbildungVonSchabloneSQLFilter $filter) use ($datetime): TnAusbildungVonSchabloneSQLFilter {
        $filter->equalsVon(DEFAULTDATE . ' ' . DEFAULTTIME);
        $filter->lessVon($datetime);

        return $filter;
      });

      $filter->any(static function(TnAusbildungVonSchabloneSQLFilter $filter) use ($datetime): TnAusbildungVonSchabloneSQLFilter {
        $filter->equalsBis(DEFAULTDATE . ' ' . DEFAULTTIME);
        $filter->greaterBis($datetime);

        return $filter;
      });

      return $filter;
    });
  }

  
  public function equalsTeilnehmerSchablonen(\Teilnehmer $tn): self
  {
    $hasAusbildung = !empty($tn->ausbildungsschablone);
    if (!$hasAusbildung && !\DateTimeOperations::isDateTimeEmptyOrDefault($tn->ausbildungvon)) {
      $tomorrow = \DateTimeOperations::getValidDateTimeString(\DateTimeOperations::addDays(\DateTimeOperations::getDateNow(), 1));
      $hasAusbildung = \DateTimeOperations::isDateTimeAfter($tomorrow, $tn->ausbildungvon);
    }
    if (!$hasAusbildung && !\DateTimeOperations::isDateTimeEmptyOrDefault($tn->ausbildungbis)) {
      $yesterday = \DateTimeOperations::getValidDateTimeString(\DateTimeOperations::addDays(\DateTimeOperations::getDateNow(), -1));
      $hasAusbildung = \DateTimeOperations::isDateTimeBefore($yesterday, $tn->ausbildungbis);
    }

    if (!$hasAusbildung) {
      $this->applyFilterCurrent(static::FILTER_OPTION_TN_SCHABL, SQLFilterUtils::filterFalse());
    } else {
      $this->all(static function($filter) use ($tn) {
        $filter->equalsTeilnehmerId($tn->getIdentifier());
        $filter->equalsHlId($tn->ausbildungsschablone);

        return $filter;
      });
    }

    return $this;
  }

  
  public function equalsTeilnehmerSchablonenNoTimeRestriction(\Teilnehmer $tn): self
  {
    $hasAusbildung = !empty($tn->ausbildungsschablone);
    if (!$hasAusbildung) {
      $this->applyFilterCurrent(static::FILTER_OPTION_TN_SCHABL, SQLFilterUtils::filterFalse());
    } else {
      $this->all(static function($filter) use ($tn) {
        $filter->equalsTeilnehmerId($tn->getIdentifier());
        $filter->equalsHlId($tn->ausbildungsschablone);

        return $filter;
      });
    }

    return $this;
  }
}