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

class AnwesenheitslisteElternKind extends Teilnehmerliste
{
  public const CELL_HEIGHT = 5;
  public const FOOTER_CELL_HEIGHT = FUSSZEILE_STANDARD_GROESSE;
  public const FONTSIZE1 = 9;
  public const FONTSIZE2 = 9;

  public const SPALTE1_WIDTH = '3%';
  public const SPALTE2_WIDTH = '20%';
  public const SPALTE3_WIDTH = '22%';
  public const SPALTE4_WIDTH = '19%';

  public const COUNT_MIT_BEGLEITPERSON = false;

  public const CHECKBOX_SIZE = 3;

  
  protected $tnrBegleitperson;

  public function __construct($pKnr, $pToolId)
  {
    parent::__construct($pKnr, $pToolId);
    
    
    $this->firmenstatusErlauben = true;
  }

  public function getListID()
  {
    return 43;
  }

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

  public function _prepare($pKnr = '')
  {
    parent::_prepare($pKnr);

    $this->tnrBegleitperson = \ToolSettingsAPI::getToolSettings(4)->tnrBegleitperson;
  }

  public function getTNDarstellungEnabled($optionName)
  {
    switch ($optionName) {
      case 'option1': 
      case 'option8': 
      case 'option4': 
        return false;
      case 'option3': 
      case 'option6': 
        return true;
    }

    return parent::getTNDarstellungEnabled($optionName);
  }

  public function getSpaltenanordnungText($optionName)
  {
    switch ($optionName) {
      case 'option1':
        return 'mit Bemerkung';
      case 'option2':
        return 'breite Bemerkung';
      case 'option3':
        return 'mit Geburtstagen';
    }

    return parent::getSpaltenanordnungText($optionName);
  }

  public function getSpaltenanordnungEnabled($optionName)
  {
    switch ($optionName) {
      case 'option3': 
        return true;
    }

    return false;
  }

  public function getDruckbereichEnabled($optionName)
  {
    
    switch ($optionName) {
      case 'hochformat':
        return true;
    }

    return false;
  }

  public function getBemerkungEnabled($optionValue)
  {
    return false; 
  }

  
  public function isHochformat()
  {
    return true;
  }

  public function loadFactoryDefaults()
  {
    Teilnehmerliste::loadFactoryDefaults();

    $this->settings->druckbereich->hochformat = true;

    $this->settings->tnDarstellung->option1 = true; 

    $this->settings->spaltenanordnung->option1 = true; 
    $this->settings->spaltenanordnung->option3 = true; 

    $this->settings->fusszeile = LISTEN_FUSSZEILE_LETZTE; 

    $this->settings->druckbereich->auffuellArt = ''; 

    $this->settings->caption = 'Eltern-Kind Liste';
  }

  
  private function _sortBelegungHelperTeilnehmer($a, $b)
  {
    if ($this->settings->sortierung == 'A') { 
      $aName = $a->teilnehmer->namevorname;
      $bName = $b->teilnehmer->namevorname;
      $namenCmpResult = strcmp($aName, $bName);
      if ($namenCmpResult != 0) {
        return $namenCmpResult;
      }
    } elseif ($this->settings->sortierung == 'N') { 
      $aAnm = $a->anm_datum;
      $bAnm = $b->anm_datum;
      $anmCmpResult = strcmp($aAnm, $bAnm);
      if ($anmCmpResult != 0) {
        return $anmCmpResult;
      }
    }

    return 0;
  }

  private function _sortBelegungHelperFirma($a, $b)
  {
    $aBelegung = $a->datamodul;
    $bBelegung = $b->datamodul;

    if ($this->settings->sortierung == 'A') { 
      $aFirmaName = $aBelegung->status == 'F' ? $aBelegung->teilnehmer->namevorname : $a->firma->teilnehmer->namevorname;
      $bFirmaName = $bBelegung->status == 'F' ? $bBelegung->teilnehmer->namevorname : $b->firma->teilnehmer->namevorname;
      $firmenNamenCmpResult = strcmp($aFirmaName, $bFirmaName);
      if ($firmenNamenCmpResult != 0) {
        return $firmenNamenCmpResult;
      }
    } elseif ($this->settings->sortierung == 'N') { 
      $aFirmaAnm = $aBelegung->status == 'F' ? $aBelegung->anm_datum : $a->firma->anm_datum;
      $bFirmaAnm = $bBelegung->status == 'F' ? $bBelegung->anm_datum : $b->firma->anm_datum;
      $firmenAnmCmpResult = strcmp($aFirmaAnm, $bFirmaAnm);
      if ($firmenAnmCmpResult != 0) {
        return $firmenAnmCmpResult;
      }
    }

    return 0;
  }

  
  private function _hatBelegungKeineFirma($belegung)
  {
    return (is_null($belegung->firma) || $belegung->firma == 0) && $belegung->status != 'F';
  }

  
  public function _sortBelegungen($a, $b)
  {
    
    
    if (is_null($b)) {
      return is_null($a) ? 0 : -1;
    }

    if (is_null($a)) {
      return 1;
    }

    $aBelegung = $a->datamodul;
    $bBelegung = $b->datamodul;
    $aNoFirma = $this->_hatBelegungKeineFirma($aBelegung);
    $bNoFirma = $this->_hatBelegungKeineFirma($bBelegung);

    if ($bNoFirma) {
      return $aNoFirma ? $this->_sortBelegungHelperTeilnehmer($aBelegung, $bBelegung) : 1;
    }

    if ($aNoFirma) {
      return -1;
    }

    
    $firmenCmpResult = $this->_sortBelegungHelperFirma($a, $b);
    if ($firmenCmpResult != 0) {
      return $firmenCmpResult;
    }

    if ($aBelegung->status == 'F') {
      return $bBelegung->status == 'F' ? 0 : -1; 
    }

    if ($bBelegung->status == 'F') {
      return 1; 
    }

    
    $teilnehmCmpResult = $this->_sortBelegungHelperTeilnehmer($aBelegung, $bBelegung);
    if ($teilnehmCmpResult != 0) {
      return $teilnehmCmpResult;
    }

    return 0;
  }

  private function _getBelegungenHelperNummern($resultAry)
  {
    $id = 1;
    foreach ($resultAry as $belegung) {
      if (!is_null($belegung)) {
        if ($belegung->datamodul->status == 'F') {
          if (self::COUNT_MIT_BEGLEITPERSON) {
            $id += $belegung->countBegleitpersonen;
          }
        } elseif ($belegung->datamodul->tnr != $this->tnrBegleitperson) {
          $belegung->id = $id;
          $id += 1;
        }
      }
    }
  }

  
  private function _getBelegungenHelperExtraDaten($belegungen)
  {
    $tmpFirmaZuBegleiterCount = array();
    $tmpFirmaZuKinderCount = array();
    $tmpBelegungZuFirma = array();

    return array_map(function($belegung) use ($belegungen, $tmpFirmaZuBegleiterCount, $tmpFirmaZuKinderCount, $tmpBelegungZuFirma) {
      if (is_null($belegung)) {
        return null;
      }

      $obj = new stdClass();
      $obj->datamodul = $belegung;
      if ((!is_null($belegung->firma) && $belegung->firma != 0) || $belegung->status == 'F') {
        $belegungsFirma = $belegung->status == 'F' ? $belegung->tnr : $belegung->firma;
        if (isset($tmpFirmaZuBegleiterCount[$belegungsFirma])) {
          $obj->countBegleitpersonen = $tmpFirmaZuBegleiterCount[$belegungsFirma];
        } else {
          $obj->countBegleitpersonen = count(array_filter(
            $belegungen,
            function($e) use ($belegungsFirma) {
              if (is_null($e)) {
                return false;
              }

              return $e->firma === $belegungsFirma && $e->tnr == $this->tnrBegleitperson;
            }
          ));

          $tmpFirmaZuBegleiterCount[$belegungsFirma] = $obj->countBegleitpersonen;
        }

        if (isset($tmpFirmaZuKinderCount[$belegungsFirma])) {
          $obj->countKinder = $tmpFirmaZuKinderCount[$belegungsFirma];
        } else {
          $obj->countKinder = count(array_filter(
            $belegungen,
            function($e) use ($belegungsFirma) {
              if (is_null($e)) {
                return false;
              }

              return $e->firma === $belegungsFirma && $e->status !== 'F' && $e->tnr != $this->tnrBegleitperson;
            }
          ));

          $tmpFirmaZuKinderCount[$belegungsFirma] = $obj->countKinder;
        }

        if ($belegung->status != 'F') {
          if (isset($tmpBelegungZuFirma[$belegungsFirma])) {
            $obj->firma = $tmpBelegungZuFirma[$belegungsFirma];
          } else {
            $dbwbelegung = new DBWorkBelegung(1, true);
            $firmen = $dbwbelegung->getFirmaBelegungenByTeilnehmerBelegung($belegung);
            if (count($firmen) > 0) {
              $obj->firma = $firmen[0];
              $tmpBelegungZuFirma[$belegung->firma] = $obj->firma;
            }
          }
        }
      }

      return $obj;
    }, $belegungen);
  }

  public function _getBelegungInitDbWork()
  {
    $dbwbelegung = parent::_getBelegungInitDbWork();
    if ($this->settings->umfang->filter == 'A') {
      $dbwbelegung->fromobject->status .= 'F';
    }

    return $dbwbelegung;
  }

  public function _getBelegungen($knr)
  {
    if (!isset($this->belegungenCache)) {
      $this->belegungenCache = array();
    }

    if (!array_key_exists($knr, $this->belegungenCache)) {
      $belegungen = parent::_getBelegungen($knr);

      $resultAry = $this->_getBelegungenHelperExtraDaten($belegungen);

      
      $resultAry = array_filter($resultAry, function($e) {
        return (!isset($e->countKinder) || ($e->countKinder != 0));
      });

      
      uasort($resultAry, array($this, '_sortBelegungen'));

      
      $this->_getBelegungenHelperNummern($resultAry);

      $this->belegungenCache[$knr] = $resultAry;
    }

    return $this->belegungenCache[$knr];
  }

  protected function getElternBemerkung($belegung, $width, $fontsize, $fontstyle, $zeilenCount)
  {
    $str = $belegung->info;

    return $this->pdf->splitString($str, $width, $fontsize, $fontstyle, $zeilenCount, $zeilenCount);
  }

  protected function getTeilnehmerBemerkung($belegung, $width, $fontsize, $fontstyle, $zeilenCount)
  {
    $str = $belegung->teilnehmer->info_intern;

    return $this->pdf->splitString($str, $width, $fontsize, $fontstyle, $zeilenCount, $zeilenCount);
  }

  protected function getTeilnehmerEigeneBemerkung($belegung, $width, $fontsize, $fontstyle, $zeilenCount)
  {
    $str = $belegung->teilnehmer->info;

    return $this->pdf->splitString($str, $width, $fontsize, $fontstyle, $zeilenCount, $zeilenCount);
  }

  protected function _printRowElternteil($belegung, $cellHeight, $rowNum, $border)
  {
    $teilnehmer = $belegung->datamodul->teilnehmer;

    $firstCellContent = array($teilnehmer->namevorname);
    if ($this->settings->tnDarstellung->option5) { 
      $firstCellContent[] = $teilnehmer->tel_anzeige;
    }

    while (count($firstCellContent) < 2) {
      $firstCellContent[] = '';
    }

    $this->pdf->SetFillColor(200);
    $this->pdf->CellAtX('6%', '', '', '', 8, self::SPALTE1_WIDTH, $border, $cellHeight, true); 
    $this->pdf->CellExtMehrzeilig(self::SPALTE2_WIDTH, $firstCellContent, $border, $cellHeight, '', self::FONTSIZE1, '', true, '', self::CELL_HEIGHT, array(0 => array('style' => 'B')));
    $bemerkungAry = $this->getElternBemerkung($belegung->datamodul, self::SPALTE3_WIDTH, self::FONTSIZE2, '', 2);
    $this->pdf->CellExtMehrzeilig(self::SPALTE3_WIDTH, $bemerkungAry, $border, $cellHeight, '', self::FONTSIZE2, '', true, '', self::CELL_HEIGHT);
    $this->pdf->CellExt(self::SPALTE4_WIDTH, 'Kinder: ' . $belegung->countKinder, $border, $cellHeight, 'B', self::FONTSIZE1, '', true, '');
    $this->pdf->CellExt('11.5%', 'Begleitung: ' . $belegung->countBegleitpersonen, $border, $cellHeight, 'B', self::FONTSIZE1, '', true, '');
    $this->pdf->CellExt('12.5%', "Anwesende\nBegleitung: _____", $border, $cellHeight, '', self::FONTSIZE1, '', true, '');

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

  private function hatBezahlt($belegung)
  {
    return $belegung->datamodul->bet_offen == 0.0
            && (!isset($belegung->firma)
              || $belegung->firma->bet_offen == 0.0);
  }

  
  protected function _printEmptyRowKind($cellHeight, $rowNum, $border)
  {
    $this->pdf->CellAtX('6%', '', '', '', 8, self::SPALTE1_WIDTH, $border, $cellHeight); 
    $emptyAry = array_fill(0, $this->getKindRowCount(), '');
    $this->pdf->CellExtMehrzeilig(self::SPALTE2_WIDTH, $emptyAry, $border, $cellHeight, '', self::FONTSIZE1, '', false, '', self::CELL_HEIGHT, array(0 => array('style' => 'B')));
    $this->pdf->CellExtMehrzeilig(self::SPALTE3_WIDTH, $emptyAry, $border, $cellHeight, '', self::FONTSIZE2, '', false, '', self::CELL_HEIGHT);
    $this->pdf->CellExtMehrzeilig(self::SPALTE4_WIDTH, $emptyAry, $border, $cellHeight, '', self::FONTSIZE2, '', false, '', self::CELL_HEIGHT);
    $this->pdf->CellExt('8%', 'Bezahlt: ', $border, $cellHeight, '', self::FONTSIZE1, 'C', false);
    $this->checkBox('3.5%', self::CELL_HEIGHT, $border, self::CHECKBOX_SIZE);
    $this->pdf->CellExt('9.5%', 'Anwesend: ', $border, $cellHeight, '', self::FONTSIZE1, 'C', false);
    $this->checkBox('3%', self::CELL_HEIGHT, $border, self::CHECKBOX_SIZE);

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

  protected function _printRowKind($belegung, $cellHeight, $rowNum, $border)
  {
    $teilnehmer = $belegung->datamodul->teilnehmer;

    $firstCellContent = array($teilnehmer->namevorname);
    if ($this->settings->spaltenanordnung->option3) { 
      $firstCellContent[] = $teilnehmer->gebdat;
    }
    if ($this->settings->tnDarstellung->option6) { 
      $firstCellContent[] = $teilnehmer->email;
    }
    if ($this->settings->tnDarstellung->option5 && trim($teilnehmer->tel_anzeige) != '') { 
      $firstCellContent[] = $teilnehmer->tel_anzeige;
    }
    if ($this->settings->tnDarstellung->option3) { 
      $firstCellContent[] = $teilnehmer->strasse;
      $firstCellContent[] = $teilnehmer->ort;
    }

    $this->pdf->CellAtX('6%', (int)$belegung->id, '', '', 8, self::SPALTE1_WIDTH, $border, $cellHeight); 
    $this->pdf->CellExtMehrzeilig(
      self::SPALTE2_WIDTH,
      $firstCellContent,
      false,
      $cellHeight,
      '',
      self::FONTSIZE1,
      '',
      false,
      '',
      self::CELL_HEIGHT,
      array(0 => array('style' => 'B', 'border' => $border ? 'T' : false))
    );
    $bemerkungAry = $this->getTeilnehmerBemerkung($belegung->datamodul, self::SPALTE3_WIDTH, self::FONTSIZE2, '', $this->getKindRowCount());
    $this->pdf->CellExtMehrzeilig(
      self::SPALTE3_WIDTH,
      $bemerkungAry,
      false,
      $cellHeight,
      '',
      self::FONTSIZE2,
      '',
      false,
      '',
      self::CELL_HEIGHT,
      array(0 => array('border' => $border ? 'T' : false))
    );
    $teilnehmerBemerkungAry = $this->getTeilnehmerEigeneBemerkung($belegung->datamodul, '18%', self::FONTSIZE2, '', $this->getKindRowCount());
    $this->pdf->CellExtMehrzeilig(
      self::SPALTE4_WIDTH,
      $teilnehmerBemerkungAry,
      false,
      $cellHeight,
      '',
      self::FONTSIZE2,
      '',
      false,
      '',
      self::CELL_HEIGHT,
      array(0 => array('border' => $border ? 'T' : false))
    );
    $this->pdf->CellExt('8%', 'Bezahlt: ', $border, $cellHeight, '', self::FONTSIZE1, 'C', false);
    $this->checkBox('3.5%', self::CELL_HEIGHT, $border ? 'T' : false, self::CHECKBOX_SIZE, $this->hatBezahlt($belegung));
    $this->pdf->CellExt('9.5%', 'Anwesend: ', $border, $cellHeight, '', self::FONTSIZE1, 'C', false);
    $this->checkBox('3%', self::CELL_HEIGHT, $border ? 'T' : false, self::CHECKBOX_SIZE);

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

  
  public function _printRow($belegung, $cellHeight, $rowNum, $border)
  {
    if ($belegung == null) {
      $this->_printEmptyRowKind(self::CELL_HEIGHT * $this->getKindRowCount(), $rowNum, $border);
    } else {
      if ($belegung->datamodul->tnr == $this->tnrBegleitperson) {
        
        return;
      }

      switch ($belegung->datamodul->status) {
      case 'F':
        $this->_printRowElternteil($belegung, self::CELL_HEIGHT * 2, $rowNum, $border);
        break;
      default:
        $this->_printRowKind($belegung, self::CELL_HEIGHT * $this->getKindRowCount(), $rowNum, $border);
        break;
      }
    }
  }

  protected function getBegleitpersonInsgesamntAnzahl()
  {
    return count(array_filter($this->_getBelegungen($this->knr), function($e) {
      return !is_null($e) && $e->datamodul->tnr == $this->tnrBegleitperson;
    }));
  }

  protected function getKinderInsgesamtAnzahl()
  {
    return count(array_filter($this->_getBelegungen($this->knr), function($e) {
      return !is_null($e) && $e->datamodul->status != 'F' && $e->datamodul->tnr != $this->tnrBegleitperson;
    }));
  }

  public function _createTNHeader()
  {
    
  }

  public function _createContent($pKurs = '')
  {
    parent::_createContent($pKurs);

    $border = 'T';
    $cellHeight = self::CELL_HEIGHT;
    $this->pdf->CellAtX('6%', '', '', '', 8, self::SPALTE1_WIDTH, $border, $cellHeight); 
    $this->pdf->CellExt(self::SPALTE2_WIDTH, 'Insgesamt', $border, $cellHeight, 'B', self::FONTSIZE1, '');
    $this->pdf->CellExt(self::SPALTE3_WIDTH, '', $border, $cellHeight, '', self::FONTSIZE2, '');
    $this->pdf->CellExt(self::SPALTE4_WIDTH, 'Kinder: ' . $this->getKinderInsgesamtAnzahl(), $border, $cellHeight, 'B', self::FONTSIZE1, '');
    $this->pdf->CellExt('11.5%', 'Begleitung: ' . $this->getBegleitpersonInsgesamntAnzahl(), $border, $cellHeight, 'B', self::FONTSIZE1, '');
    $this->pdf->CellExt('12.5%', '', $border, $cellHeight, '', self::FONTSIZE1, '');
  }

  private function getKindRowCount()
  {
    $result = 1;
    if ($this->settings->tnDarstellung->option6) { 
      $result += 1;
    }
    if ($this->settings->tnDarstellung->option5) { 
      $result += 1;
    }

    if ($this->settings->spaltenanordnung->option3) { 
      $result += 1;
    }

    if ($this->settings->tnDarstellung->option3) { 
      $result += 2;
    }

    if ($result < 3) {
      $result = 3;
    }

    return $result;
  }

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