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


class AnwesenheitslisteK extends Anwesenheitsliste
{
  public function getListID()
  {
    return 2;
  }

  public function getListTyp()
  {
    return '3';
  }

  public function getTNDarstellungEnabled($optionName)
  {
    switch ($optionName) {
      case 'option2': 
      case 'option8': 
        return false;
    }

    return parent::getTNDarstellungEnabled($optionName);
  }

  public function getSpaltenanordnungEnabled($optionName)
  {
    switch ($optionName) {
      case 'option2': 
      case 'option5': 
        return false;
    }

    return parent::getSpaltenanordnungEnabled($optionName);
  }

  public function loadFactoryDefaults()
  {
    parent::loadFactoryDefaults();
    $this->settings->kopfbereich->mitDauerdetails = true;
  }

  public function _onTNComplete($belegung)
  {
    if ($belegung == null) {
      parent::_onTNComplete($belegung);

      return;
    }

    
    if ($belegung->id) {
      if (System::isKuferSql5()) {
        $dbwBelegung = DBWorkBelegung::getDefaultInstance(1, true, true);
        $kindBelegungen = $dbwBelegung->getKindBelgungenByTnrAndKnr($belegung->tnr, $belegung->knr);
        $kinder = array();
        if (count($kindBelegungen) > 0) {
          $kindBelegIds = array_map(function($kindBelegung) { return $kindBelegung->id; }, $kindBelegungen);
          $dbwTeilnehmer = DBWorkTeilnehmer::getDefaultInstance(1, true);
          $kinder = $dbwTeilnehmer->getTeilnehmerByBelegAry($kindBelegIds);
        }
      } else {
        $dbwKinder = DBWorkKinder::getDefaultInstance(1, true);
        $kinder = $dbwKinder->getKinderbyBelegung($belegung->id);
      }
    } else {
      $kinder = array();
    }

    foreach ($kinder as $kind) {
      $kindCellHeight = 5;
      
      
      if ($this->pdf->TriggersPageBreak($kindCellHeight)) {
        $this->pdf->AddPage();
      }

      $kindTextWidth = $this->_getTNCellWidth() + 15;
      if ($this->settings->spaltenanordnung->option6 && $this->isBisAlterFromAltersklasse1Allowed()) {
        $x = $this->pdf->GetX();
        $y = $this->pdf->GetY();

        
        $isOlderThan = isset($kind->alterskl) && $kind->alterskl > (int)1;
        $aelterAlsCell = $this->getAlterUeber15CellWidth();
        $this->pdf->CellAtX(
          $this->getAbstandZumLinkenRand() + $this->_getTNCellWidth() - $aelterAlsCell + (15 - $this->getHeaderKurstagBeginnEndeCellWidth()),
          $isOlderThan ? 'X' : '',
          'B',
          'C',
          8,
          $aelterAlsCell,
          true,
          $aelterAlsCell
        );

        $this->pdf->SetY($y);
        $this->pdf->SetX($x);

        $kindTextWidth = $this->_getTNCellWidth();
      }

      $spacer = str_repeat(' ', 4); 

      $text = (($kind->name != '') ? $kind->name . ', ' : '') . $kind->vorname;
      if ($kind->gebdat) {
        $text .= " (geb. $kind->gebdat)";
      }

      $textArray = \array_map(function($str) use ($spacer) {
        return $spacer . $str;
      }, $this->pdf->splitString($text, $kindTextWidth - $this->pdf->getStringWidthWithFontSize($spacer, 8), 8));
      $text = $textArray[0];
      $cnt = count($textArray);
      if ($cnt > 1) {
        for ($i = 1; $i < $cnt; $i++) {
          $text .= "\n" . $textArray[$i];
          $kindCellHeight += 5;
        }
      }

      
      $this->pdf->CellAtX('3%', $text, '', '', 8, $this->_getTNCellWidth() + 15, 1, $kindCellHeight);

      
      foreach ($this->kursetage as $kurstag) {
        $this->pdf->CellExt($this->_getKtWidth(), '', 1, $kindCellHeight);
      }

      
      $this->_printKindBemerkungsCell($kind, $kindCellHeight);

      $this->pdf->Ln($kindCellHeight);
    }

    parent::_onTNComplete($belegung);
  }

  
  public function _printKindBemerkungsCell($kind, $height)
  {
    $gebdat = $kind->gebdat;
    $bemerkung = $kind->info;
    $this->_printBemerkungCellHelper($height, $gebdat, $bemerkung);
  }

  
  public function _getWartelisteValue($kurs)
  {
    
    return $kurs->getVarValue('kinderanzahl');
  }

  
  public function _getWartelisteText()
  {
    
    return 'Kinder:';
  }

  
  public function stringLineBreak($str, $width, $eol = 0, $pTrennzeichen = ' ')
  {
    $str = str_replace("\r", "\n", $str);
    if ($eol == 0) {
      $str = str_replace("\n", $pTrennzeichen, $str);
    }
    $sw = $this->pdf->GetStringWidth($str);

    
    
    if ($sw <= $width) {
      if ($eol == 1) {
        $retour = explode("\n", $str);
      } else {
        $retour = array($str);
      }

      return $retour;
    } else {
      
      if (StringOperations::strstr($str, $pTrennzeichen) === false) {
        return array($str);
      }

      $wordsInArgument = array();
      $star = explode($pTrennzeichen, $str);
      
      while ($sw > $width) {
        if ($eol == 1 && \StringOperations::substr_count($star[0], '\\n') != 0) {
          $star[0] = str_replace("\n", $pTrennzeichen, $star[0]);
          array_unshift($wordsInArgument, array_pop($star));
          break;
        }
        array_unshift($wordsInArgument, array_pop($star));
        $sw = $this->pdf->GetStringWidth(implode($pTrennzeichen, $star));
      }

      
      $retour = array(implode($pTrennzeichen, $star));
      $wordsInArgstr = implode($pTrennzeichen, $wordsInArgument);

      foreach ($this->stringLineBreak($wordsInArgstr, $width) as $st) {
        $retour[] = $st;
      }

      return $retour;
    }
  }

  public function getListBezeichnungForHTML()
  {
    return 'AnwesenheitslisteMitKinder';
  }

  
  protected function getTextMinTn($pKurs)
  {
    if (!$this->showWartelisteAnzahlTnKinder($pKurs)) {
      return parent::getTextMinTn($pKurs);
    }

    return 'WL Erw.:';
  }

  
  protected function getTextMaxTn($pKurs)
  {
    if (!$this->showWartelisteAnzahlTnKinder($pKurs)) {
      return parent::getTextMaxTn($pKurs);
    }

    return 'WL Kind:';
  }

  
  protected function getValueMinTn($pKurs)
  {
    if (!$this->showWartelisteAnzahlTnKinder($pKurs)) {
      return parent::getValueMinTn($pKurs);
    }

    return $pKurs->getVarValue('teil_wart');
  }

  
  protected function getValueMaxTn($pKurs)
  {
    if (!$this->showWartelisteAnzahlTnKinder($pKurs)) {
      return parent::getValueMaxTn($pKurs);
    }

    return $pKurs->getVarValue('kinder_wart');
  }

  
  private function showWartelisteAnzahlTnKinder($pKurs)
  {
    return $pKurs->getVarValue('teil_wart') + $pKurs->getVarValue('kinder_wart') > 0;
  }
}