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

declare(strict_types = 1);

namespace Kufer\Web\Classes\Dbfilter\RegisteredCall;

use Kufer\Web\Classes\Dbfilter\AbstractSQLFilter;
use Kufer\Web\Classes\Dbfilter\SQLFilterUtils;

class RegisteredDBCallIdentifier extends RegisteredDBCall
{
  public function getType(): int
  {
    return \Kufer\Web\Classes\Dbfilter\AbstractSQLFilter::TYPE_IDENTIFIER;
  }

  public function getCapabilities(): int
  {
    return static::SUPPORTS_EQUALS
      | static::SUPPORTS_EQUALS_DEFAULT;
  }

  
  protected $guidColumn;

  public function __construct(string $name, string $table, string $idColumn, string $guidColumn)
  {
    parent::__construct($name, $table, $idColumn, null);
    $this->guidColumn = $guidColumn;
  }

  private function normalize($value)
  {
    return \Kufer\Web\Classes\Identifier\IdentifierFactory::createFromIdIfNecessary($value);
  }

  private function normalizeIterable(iterable $value): array
  {
    return (new \Kufer\Web\Classes\Stream\IterableStream($value))
      ->map(array($this, 'normalize'))
      ->toArray();
  }

  public function like(AbstractSQLFilter $filter, $value): callable
  {
    throw new CallNotSupportedException('Abfrage like hier nicht unterstützt.');
  }

  public function contains(AbstractSQLFilter $filter, $value): callable
  {
    throw new CallNotSupportedException('Abfrage contains hier nicht unterstützt.');
  }

  public function equals(AbstractSQLFilter $filter, $value): callable
  {
    return SQLFilterUtils::filterEqualsIdentifier($this->table, $this->normalize($value), $this->column, $this->guidColumn);
  }

  public function equalsDefault(AbstractSQLFilter $filter, $value, $default): callable
  {
    throw new CallNotSupportedException('Abfrage less hier nicht unterstützt.');
  }

  public function in(AbstractSQLFilter $filter, iterable $value): callable
  {
    return SQLFilterUtils::filterInIdentifier($this->table, $this->normalizeIterable($value), $this->column, $this->guidColumn);
  }

  public function inDefault(AbstractSQLFilter $filter, iterable $value, $default): callable
  {
    throw new CallNotSupportedException('Abfrage less hier nicht unterstützt.');
  }

  public function less(AbstractSQLFilter $filter, $value): callable
  {
    throw new CallNotSupportedException('Abfrage less hier nicht unterstützt.');
  }

  public function lessDefault(AbstractSQLFilter $filter, $value, $default): callable
  {
    throw new CallNotSupportedException('Abfrage lessDefault hier nicht unterstützt.');
  }

  public function greater(AbstractSQLFilter $filter, $value): callable
  {
    throw new CallNotSupportedException('Abfrage greater hier nicht unterstützt.');
  }

  public function greaterDefault(AbstractSQLFilter $filter, $value, $default): callable
  {
    throw new CallNotSupportedException('Abfrage greaterDefault hier nicht unterstützt.');
  }

  public function is(AbstractSQLFilter $filter): callable
  {
    throw new CallNotSupportedException('Abfrage is hier nicht unterstützt.');
  }

  public function isDefault(AbstractSQLFilter $filter, $default): callable
  {
    throw new CallNotSupportedException('Abfrage is hier nicht unterstützt.');
  }
}