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

namespace Kufer\Web\KuferTools\Utils\FilterSearch;

use Kufer\Web\Classes\Dbfilter\KurseSQLFilter;
use Kufer\Web\KuferTools\Utils\FilterSearch\Method\CaseMethod;
use Kufer\Web\KuferTools\Utils\FilterSearch\Method\ContainsStringMethod;
use Kufer\Web\KuferTools\Utils\FilterSearch\Method\EqualsBoolMethod;
use Kufer\Web\KuferTools\Utils\FilterSearch\Method\HasMethod;
use Kufer\Web\KuferTools\Utils\FilterSearch\Method\SearchStringMethod;
use Kufer\Web\KuferTools\Utils\FilterSearch\Method\TranslateValueMethod;

class KurseSearchFilter extends ToolSearchFilter
{
  public function __construct(bool $recursive = false)
  {
    parent::__construct();

    $this->addSearch(
      'kurstitel',
      new ContainsStringMethod('Kurzbezeichnung')
    );

    $this->addSearch(
      'ort',
      new ContainsStringMethod('Ort')
    );

    $freidefFelder = \DBWorkFreiWaehlbareEingabefelder4Kurs::getDefaultInstance()->getFreiWaehlbareFelder();
    foreach ($freidefFelder as $freidef) {
      $method = null;
      switch (\StringOperations::substr($freidef->typ ?? 'T', 0, 1)) {
        default:
        case 'T':
          $method = new SearchStringMethod('Freidef' . $freidef->id);
      }

      if (!is_null($method)) {
        $this->addSearch(
          'kursauswahl' . $freidef->id,
          $method
        );
      }
    }

    $this->addAliasFor('kursort', 'ort');
    $this->addAliasFor('mktext', 'ort');
    $this->addAliasFor('gebaeude', 'ort');

    $this->addSearch(
      'stichwort',
      new SearchStringMethod('Important')
    );

    $this->addSearch(
      'kategorie',
      new HasMethod('Kategorie')
    );

    $this->addSearch(
      'aussenstelle',
      new ContainsStringMethod('Aussenstelle')
    );

    $this->addAliasFor('bezeichn', 'aussenstelle');

    $this->addSearch(
      'fachbereich',
      new ContainsStringMethod('FachbereichKennzeichen')
    );

    $this->addSearch(
      'ausfall',
      new TranslateValueMethod(
        new EqualsBoolMethod('Ausfall'),
        array(
          \DBWorkKurseBase::FILTER_KURSAUSFALL_OHNE_AUSGEFALLENE => false,
          \DBWorkKurseBase::FILTER_KURSAUSFALL_NUR_AUSGEFALLENE => true
        ),
        null
      )
    );

    $this->addAliasFor('kursausfall', 'ausfall');

    $this->addSearch(
      'abschluss',
      new TranslateValueMethod(
        new EqualsBoolMethod('Abschluss'),
        array(
          \DBWorkKurseBase::FILTER_KURSABSCHLUSS_OHNE_ABGESCHLOSSENE => false,
          \DBWorkKurseBase::FILTER_KURSABSCHLUSS_NUR_ABGESCHLOSSENE => true
        ),
        null
      )
    );

    $this->addAliasFor('kursabschluss', 'abschluss');

    $this->addSearch(
      'status',
      new CaseMethod(array(
        \DBWorkKurseBase::FILTER_KURSSTATUS_NICHT_BEGONNENE => static function(KurseSQLFilter $filter): KurseSQLFilter {
          return $filter->greaterBeginnDatum(\DateTimeOperations::getDateNow());
        },
        \DBWorkKurseBase::FILTER_KURSSTATUS_LAUFENDE_BY_DATUM => static function(KurseSQLFilter $filter): KurseSQLFilter {
          return $filter->all(static function(KurseSQLFilter $filter): KurseSQLFilter {
            $dateNow = \DateTimeOperations::getDateNow();

            return $filter->lessEqualsBeginnDatum($dateNow)->greaterEqualsEndeDatum($dateNow);
          });
        },
        \DBWorkKurseBase::FILTER_KURSSTATUS_BEENDETE => static function(KurseSQLFilter $filter): KurseSQLFilter {
          return $filter->any(static function(KurseSQLFilter $filter): KurseSQLFilter {
            $dateNow = \DateTimeOperations::getDateNow();

            return $filter->greaterEndeDatum($dateNow)->equalsEndeDatum(null);
          });
        }
      ))
    );

    $this->addAliasFor('kursstatus', 'status');
  }
}