<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, 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;
  }

  protected function getBelegungenFromDBWork(\Kurs $kurs)
  {
    $knr = $kurs->id;

    $status = '';
    switch ($this->settings->umfang->filter) {
      case 'C': 
        $status = $this->settings->umfang->customStatus;
        break;
      case 'A': 
        
        $status = 'AT-';
        break;
    }

    $belegungen = parent::getBelegungenFromDBWork($kurs);
    if (!\System::isKuferSql5()) {
      return $belegungen;
    }

    $kinderOhneEltern = \DBWorkBelegung::getDefaultInstance()->getKindBelegungenByKnrAndParentNotInKurs(
      $knr,
      $status !== '' ? \StringOperations::str_split($status) : null
    );
    if (empty($kinderOhneEltern)) {
      return $belegungen;
    }

    
    $kinderByFirmenId = \ArrayOperations::setAttributAsKeyArray($kinderOhneEltern, 'firma');

    $dbwTeilnehmer = \DBWorkTeilnehmer::getDefaultInstance();
    foreach ($kinderByFirmenId as $elternId => $kinder) {
      $tn = $dbwTeilnehmer->getTeilnehm($elternId);
      if (!empty($tn->id)) {
        $belegung = new \Belegung();
        $belegung->teilnehmer = $tn;
        $belegung->bemerkung = 'Elternteil. Nur Kindern sind im Kurs angemeldet.';
        $belegung->anwesenheitslistek_kinder = array_map(static function(\Belegung $belegung): \Teilnehmer {
          return $belegung->getTeilnehmer();
        }, $kinder);
        $belegung->anm_datum = \ArrayOperations::firstValue($kinder)->anm_datum;
        $belegungen[] = $belegung;
      }
    }

    
    if ($this->settings->sortierung === \webtools\lists\TNSettings::SORT_NAME
        || $this->settings->sortierung === \webtools\lists\TNSettings::SORT_FIRMENNAME) { 
      usort($belegungen, static function(\Belegung $a, \Belegung $b) {
        $nameCmp = strcasecmp($a->getTeilnehmer()->name, $b->getTeilnehmer()->name);
        if ($nameCmp === 0) {
          return strcasecmp($a->getTeilnehmer()->vorname, $b->getTeilnehmer()->vorname);
        } else {
          return $nameCmp;
        }
      });
    } elseif ($this->settings->sortierung === \webtools\lists\TNSettings::SORT_VORNAME) { 
      usort($belegungen, static function(\Belegung $a, \Belegung $b) {
        $nameCmp = strcasecmp($a->getTeilnehmer()->vorname, $b->getTeilnehmer()->vorname);
        if ($nameCmp === 0) {
          return strcasecmp($a->getTeilnehmer()->name, $b->getTeilnehmer()->name);
        } else {
          return $nameCmp;
        }
      });
    } elseif ($this->settings->sortierung === \webtools\lists\TNSettings::SORT_ANMELDEDATUM) { 
      usort($belegungen, static function(\Belegung $a, \Belegung $b) {
        return \DateTimeOperations::compareDate($a->anm_datum, $b->anm_datum);
      });
    }

    return $belegungen;
  }

  protected function _printBemerkungCellHelper($pHeight, $pGebdat, $pBemerkung)
  {
    $oldValue = $this->settings->spaltenanordnung->option1;
    if ($pBemerkung == 'Elternteil. Nur Kindern sind im Kurs angemeldet.') {
      $this->settings->spaltenanordnung->option1 = true;
    }

    parent::_printBemerkungCellHelper($pHeight, $pGebdat, $pBemerkung);

    $this->settings->spaltenanordnung->option1 = $oldValue;
  }

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

      return;
    }

    
    if (isset($belegung->anwesenheitslistek_kinder)) {
      $kinder = $belegung->anwesenheitslistek_kinder;
    } elseif ($belegung->id) {
      if (System::isKuferSql5()) {
        $dbwBelegung = DBWorkBelegung::getDefaultInstance(1, true, true);
        $kindBelegungen = $dbwBelegung->getKindBelgungenByTnrAndKnr($belegung->tnr, $belegung->knr);
        $kinder = array();
        if (count($kindBelegungen) > 0) {
          $kinder = array();
          foreach ($kindBelegungen as $kindBelegung) {
            $kind = $kindBelegung->teilnehmer;
            
            
            $kind->info = $this->_getBemerkung($kindBelegung);
            $kinder[] = $kind;
          }
        }
      } 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;
  }
}