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


abstract class DBWorkFreiWaehlbareEingabefelder extends DBWork
{
  
  protected $_feldnameBezeichnungInGrundsys;
  
  protected $_feldnameBezeichnungInHlGrundsys;
  
  protected $_feldnameTypInGrundsys;
  
  protected $_feldnameTypInHlGrundsys;
  
  protected $_hoechsteNrInGrundsys;

  
  protected $_hoechsteNrInHlGrundsys = 16;

  
  protected $_typ4freifeld;
  
  protected $_nameImDatamodul;
  
  protected $_dbwHlFreifeld;
  
  protected $_dbwHlGrundsys;

  public function __construct($pDBTyp = 1, $pNewInstance = false)
  {
    parent::__construct($pDBTyp, $pNewInstance);
    $this->_dbwHlFreifeld = new DBWorkHLFreifeld($pDBTyp, true);
    $this->_dbwHlGrundsys = new DBWorkHLGrundSys($pDBTyp, true);
  }

  
  protected function _createSelect(): string
  {
    $useNr0InsteadOf10 = $this->useNr0InsteadOf10ForFeldnameBezeichnung();
    $select = '';
    for ($i = 1; $i <= $this->_hoechsteNrInGrundsys; $i++) {
      $zahl = $i;
      if ($i === 10 && $useNr0InsteadOf10) {
        $zahl = 0;
      }
      $select .= $this->_feldnameBezeichnungInGrundsys . $zahl . ' AS bezeichnung' . $zahl . ', ';
      $select .= $this->_feldnameTypInGrundsys . $zahl . ' AS typ' . $zahl . ', ';
    }

    return rtrim($select, ' ,');
  }

  
  public function getNewObject()
  {
    return new \FreiWaehlbareEingabefelder();
  }

  public function getTableName(): string
  {
    return 'grundsys';
  }

  
  public function getCurrentRow($pRefreshCache = false)
  {
    
    
    

    $freifeldAry = $this->_dbwHlFreifeld->getFreifeldTextByTyp($this->_typ4freifeld);
    
    $felderAusHlGrundsys = $this->getFreiWaehlbareFelderFromHlGrundsys();

    $freifeldIndex = 0;
    $result = array();
    $useNr0InsteadOf10 = $this->useNr0InsteadOf10ForFeldnameBezeichnung();
    for ($i = 1; $i <= $this->_hoechsteNrInHlGrundsys; $i++) {
      $tmp = $this->getNewObject();

      
      if ($i <= $this->_hoechsteNrInGrundsys) {
        $zahl = $i;
        if ($i === 10 && $useNr0InsteadOf10) {
          $zahl = 0;
        }
        $bezeichnung = $this->getDatamodulValue('bezeichnung' . $zahl);
        $id = $i;
        $typ = $this->getDatamodulValue('typ' . $zahl);
      } else {
        
        if (isset($felderAusHlGrundsys[$this->_feldnameBezeichnungInHlGrundsys . $i]) && $felderAusHlGrundsys[$this->_feldnameBezeichnungInHlGrundsys . $i]) {
          $bezeichnung = $felderAusHlGrundsys[$this->_feldnameBezeichnungInHlGrundsys . $i]->wert;
          $id = $i;
          $typ = $felderAusHlGrundsys[$this->_feldnameTypInHlGrundsys . $i]->wert;
        } else {
          $bezeichnung = '';
        }
      }

      
      if (trim($bezeichnung) != '') {
        $tmp->bezeichnung = $bezeichnung;
        $tmp->id = $id;
        $tmp->typ = $typ;

        while (isset($freifeldAry[$freifeldIndex]) && $freifeldAry[$freifeldIndex]->nr == $i) {
          $tmp->hinterlegung[] = $freifeldAry[$freifeldIndex];
          $freifeldIndex += 1;
        }
      }
      $result[] = $tmp;
    }

    return $result;
  }

  
  private function getFreiWaehlbareFelderFromHlGrundsys(): array
  {
    if ($this->_hoechsteNrInHlGrundsys > $this->_hoechsteNrInGrundsys) {
      
      $felderAusHlGrundsys = array();
      for ($i = $this->_hoechsteNrInGrundsys + 1; $i <= $this->_hoechsteNrInHlGrundsys; $i++) {
        $felderAusHlGrundsys[] = $this->_feldnameBezeichnungInHlGrundsys . $i;
        $felderAusHlGrundsys[] = $this->_feldnameTypInHlGrundsys . $i;
      }

      return $this->_dbwHlGrundsys->getSettingsAry($felderAusHlGrundsys);
    }

    return array();
  }

  
  protected function useNr0InsteadOf10ForFeldnameBezeichnung(): bool
  {
    return false;
  }

  
  public function getFreiWaehlbareFelder(bool $pRefreshCache = false): array
  {
    static $cache = array();
    if (!array_key_exists(static::class, $cache) || $pRefreshCache) {
      $queryBuilder = $this->getSelectQueryBuilder()
        ->select($this->_createSelect())
        ->from($this->getTableName());
      $this->dboperation->clear();
      $this->dboperation->query($queryBuilder->getSQL());
      $cache[static::class] = $this->getFirstRow();
    }

    return $cache[static::class];
  }

  
  public function fillEingabefelderByDatamodul(array $pFreiWaehlbareEingabefelderAry, $pDatamodul): array
  {
    foreach ($pFreiWaehlbareEingabefelderAry as $key => $freiWaehlbaresEingabefeld) {
      $pFreiWaehlbareEingabefelderAry[$key] = $this->fillEingabefeldByDatamodul($freiWaehlbaresEingabefeld, $pDatamodul);
    }

    return $pFreiWaehlbareEingabefelderAry;
  }

  public function fillEingabefeldByDatamodul(\FreiWaehlbareEingabefelder $pFreiWaehlbareEingabefeld, $pDatamodul): \FreiWaehlbareEingabefelder
  {
    $nr = $pFreiWaehlbareEingabefeld->id;
    $datamodulName = $this->_nameImDatamodul . $nr;
    $pFreiWaehlbareEingabefeld->wert = $pDatamodul->getVarValue($datamodulName);

    return $pFreiWaehlbareEingabefeld;
  }

  public static function isCheckbox($pIndex): bool
  {
    $freiWaehlbareFelder = static::getDefaultInstance(1, true)->getFreiWaehlbareFelder();
    if (isset($freiWaehlbareFelder[$pIndex - 1])) {
      return $freiWaehlbareFelder[$pIndex - 1]->isCheckbox();
    } else {
      throw new OutOfBoundsException("Keine Hinterlegung für das frei Waehlbare Eingabefeld $pIndex gefunden.");
    }
  }

  public function getVarNameInDatamodul(int $id): string
  {
    return $this->_nameImDatamodul . $id;
  }
}