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


class Weitermeldeliste extends Teilnehmerliste
{
  private $_fontSize;
  
  private $_zeigeMeldungKeinFolgekurs;
  
  protected $spaltenbeginnary;
  protected $spaltenbreiteary;

  public function getListID()
  {
    return 4;
  }

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

  protected function getOutputName(): string
  {
    return 'Weitermeldeliste.pdf';
  }

  public function getAnzahlAntwortboxen()
  {
    return 3;
  }

  public function loadSettings()
  {
    parent::loadSettings();
    $this->settings->druckbereich->auffuellArt = '';
    $this->settings->druckbereich->auffuellen = false;
  }

  public function loadSettingsFromReqObj($pPostSettings)
  {
    parent::loadSettingsFromReqObj($pPostSettings);
    $this->settings->druckbereich->auffuellArt = '';
    $this->settings->druckbereich->auffuellen = false;
  }

  public function getSpaltenanordnungText($optionName)
  {
    switch ($optionName) {
      case 'option1':
        return 'mit Bank';
      case 'option2':
        return 'breite Bemerkung';
      case 'option3':
        return 'mit konkreter Bankverb.';
      case 'option4':
        return 'mit Antwortboxen (nur Querformat)';
      case 'option5':
        return 'mit Gitternetz';
      case 'option6':
        return 'SEPA-Bankdaten bei kon. Bankverb.';
    }

    return parent::getSpaltenanordnungText($optionName);
  }

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

    return parent::getSpaltenanordnungEnabled($optionName);
  }

  public function getTNDarstellungEnabled($optionName)
  {
    switch ($optionName) {
    default:
      return parent::getTNDarstellungEnabled($optionName);
    case 'option6':
      return true;
    }
  }

  protected function isTnEmailEnabled(): bool
  {
    return $this->settings->tnDarstellung->option6 ?? false;
  }

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

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

    return false;
  }

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

    if (!isset($this->settings->tnDarstellung)) {
      $this->settings->tnDarstellung = new \webtools\lists\TNDarstellung();
    }
    $this->settings->tnDarstellung->option1 = true; 
    $this->settings->tnDarstellung->option3 = true; 
    $this->settings->tnDarstellung->option5 = true; 

    if (!isset($this->settings->kopfbereich)) {
      $this->settings->kopfbereich = new \webtools\lists\Kopfbereich();
    }
    $this->settings->kopfbereich->mitKursgebuehren = true;
    $this->settings->kopfbereich->mitDozentenTelNr = true;
    $this->settings->kopfbereich->mitDauerdetails = true;

    if (!isset($this->settings->spaltenanordnung)) {
      $this->settings->spaltenanordnung = new \webtools\lists\Spaltenanordnung();
    }
    $this->settings->spaltenanordnung->option1 = true; 

    $this->settings->fusszeile = true; 

    
    if (!isset($this->fusszeilen)) {
      $this->settings->fusszeilen = array(new \webtools\lists\Fusszeile(), new \webtools\lists\Fusszeile());
    }
    $this->settings->fusszeilen[0]->text = 'An alle ' . $this->sprachSettings->Teilnehmer['Plural']['Nominativ'] . ':';
    $this->settings->fusszeilen[0]->bold = true;
    $this->settings->fusszeilen[1]->text = 'Bitte unterschreiben, wenn Sie auch nächstes Semester wieder teilnehmen wollen.';

    $this->settings->caption = 'Weitermelde-Liste';
  }

  public function _getHeaderKursText($pKurs)
  {
    
    
    if ($this->kurs->folgekurs !== '') {
      $folgekurs = $this->getFolgekurs($this->kurs->folgekurs);
      $text = parent::_getHeaderKursText($folgekurs);
      if ($this->isHochformat()) {
        $maxLength = 105;
      } else {
        $maxLength = 110;
      }
      $font = 'OpenSans';
      $fontSize = 10;
      $fontStyle = 'B';
      
      
      if (ExtPDF::isPdfTextLonger($text, $maxLength, $font, $fontSize, $fontStyle)) {
        
        return $text;
      }
      
      return $text . ' von Kurs: ' . $this->kurs->id;
    }
    
    return parent::_getHeaderKursText($pKurs);
  }

  public function header()
  {
    if ((\DBWorkBASysSettings::isMendenVhs() || DBWorkBASysSettings::isGummersbachKvhs()) && empty($this->kurs->folgekurs)) {
      $this->_zeigeMeldungKeinFolgekurs = true;
      $this->showHinweisKeinFolgeKurs();

      return;
    }
    
    
    $folgekurs = $this->getFolgekurs($this->kurs->folgekurs);
    if (!empty($folgekurs->id)) {
      $kurs = $folgekurs;
      $this->_zeigeMeldungKeinFolgekurs = false;
    } else {
      $kurs = $this->kurs;
      $this->_zeigeMeldungKeinFolgekurs = true;
    }

    $this->_createHeader($kurs);
    $this->_createSpalten();
  }

  public function footer()
  {
    if (!$this->isFooterWeitermeldelisteAllowed()) {
      return;
    }
    parent::footer();
  }

  protected function _createFusszeilen4LetzteSeite()
  {
    if (!$this->isFooterWeitermeldelisteAllowed()) {
      return;
    }
    parent::_createFusszeilen4LetzteSeite();
  }

  protected function isFooterWeitermeldelisteAllowed(): bool
  {
    return !((\DBWorkBASysSettings::isMendenVhs() || DBWorkBASysSettings::isGummersbachKvhs()) && empty($this->kurs->folgekurs));
  }

  
  protected function showHinweisKeinFolgeKurs()
  {
    if ($this->_zeigeMeldungKeinFolgekurs) {
      $fontsize4hint = '';
      if ($this->isHochformat()) {
        $fontsize4hint = 9.5;
      }
      $this->pdf->setFillColor(0, 0, 0);
      $this->pdf->SetTextColor(255, 255, 0);
      $this->pdf->ln(3);
      if ((\DBWorkBASysSettings::isMendenVhs() || DBWorkBASysSettings::isGummersbachKvhs())) {
        $hinweistext = 'ACHTUNG: Zu Kurs ' . $this->kurs->id . ': ' . $this->kurs->kurzbez . ' wurde kein Folgekurs in der Datenbank gefunden.';
      } else {
        $hinweistext = 'ACHTUNG: Zu diesem Kurs wurde kein Folgekurs in der Datenbank gefunden. Es wird der Originalkurs angezeigt!';
      }
      $this->pdf->cellAtX(
        '3.5%',
        $hinweistext,
        'B',
        'C',
        $fontsize4hint,
        '92%',
        '',
        5,
        1
      );
      $this->pdf->ln(8);
      $this->pdf->setFillColor(255, 255, 255);
      $this->pdf->SetTextColor(0, 0, 0);
    }
  }

  
  public function _isAntwortBoxEnabled()
  {
    return $this->settings->spaltenanordnung->option4 && !$this->isHochformat();
  }

  public function _createSpalten()
  {
    
    $mitAntwortBoxen = $this->_isAntwortBoxEnabled();
    $maxAnzahlZeilen = 1;
    if ($mitAntwortBoxen) {
      $SpaltenUeb = 'SpaltenUeb';
      for ($i = 1; $i < 6; $i++) {
        $temp = $SpaltenUeb . $i;
        if ($this->settings->antwortboxen->{$temp}) {
          $strarray = $this->stringLineBreak($this->settings->antwortboxen->{$temp}, 19);
          $maxAnzahlZeilen = count($strarray) > $maxAnzahlZeilen ? count($strarray) : $maxAnzahlZeilen;
        }
      }
    }

    
    for ($j = 1; $j < $maxAnzahlZeilen; ++$j) {
      $this->pdf->Ln();
    }
    
    if ($this->settings->spaltenanordnung->option5) {
      $border = 'BR';
      $borderFirst = 'BR';
      $borderLast = 'BL';
    } else {
      $border = $borderFirst = $borderLast = 'B';
    }
    $height = 7;
    
      $this->pdf->CellAtX($this->spaltenbeginnary['nr'] . '%', 'Nr', 'B', 'R', $this->_fontSize, $this->spaltenbreiteary['nr'] . '%', $borderFirst, $height);  
      
      $this->pdf->CellAtX($this->spaltenbeginnary['unr'] . '%', '', 'B', '', $this->_fontSize, $this->spaltenbreiteary['unr'] . '%', 'B', $height); 
 
      $this->pdf->CellAtX($this->spaltenbeginnary['tnr'] . '%', 'T-Nr.', 'B', 'R', $this->_fontSize, $this->spaltenbreiteary['tnr'] . '%', $border, $height); 
      
      $this->pdf->CellAtX($this->spaltenbeginnary['utnr'] . '%', '', 'B', '', $this->_fontSize, $this->spaltenbreiteary['utnr'] . '%', 'B', $height); 

    $nameCaption = 'Name';
    
    if ($this->settings->tnDarstellung->option5) {
      $nameCaption .= $this->isHochformat() ? ' / Tel.' : ' / Telefon';
    }
    $this->pdf->CellAtX($this->spaltenbeginnary['name'] . '%', $nameCaption, 'B', '', $this->_fontSize, $this->spaltenbreiteary['name'] . '%', $border, $height); 

    
    if ($this->settings->tnDarstellung->option3) {
      $this->pdf->CellAtX($this->spaltenbeginnary['adr'] . '%', 'Adresse', 'B', '', $this->_fontSize, $this->spaltenbreiteary['adr'] . '%', $border, $height);
    }

    
    
    if ($this->settings->spaltenanordnung->option1) {
      
      $this->pdf->CellExt($this->spaltenbreiteary['bank'] . '%', 'Bankverbindung', $border, $height, 'B', $this->_fontSize);
    }
    if ($mitAntwortBoxen) {
      $fontSize4Box = 9.5;
      $x1 = 0;
      $ersteZeile = true;
      for ($i = 1; $i < 6; $i++) {
        $temp = $SpaltenUeb . $i;
        if ($this->settings->antwortboxen->{$temp}) {

          
          
          
          $strarray = $this->stringLineBreak($this->settings->antwortboxen->{$temp}, 19);
          $strarray = array_reverse($strarray);
          foreach ($strarray as $value) {
            $x = $this->pdf->GetX();
            if ($ersteZeile == true) {
              $this->pdf->CellExt(22, $value, $border, $height, 'B', $fontSize4Box);
              $ersteZeile = false;
            } else {
              $this->pdf->CellExt(22, $value, '', $height, 'B', $fontSize4Box);
            }

            $x1 = $this->pdf->GetX();
            $this->pdf->Ln(-($this->pdf->_lnHeight));
            $this->pdf->SetX($x);
          }
          $ersteZeile = true;
          for ($c = 0; $c < count($strarray); $c++) {
            $this->pdf->Ln();
            $this->pdf->SetX($x1);
          }
        }
      }
    }

    $unterschriftCellWidth = $this->_getPixelToRightBorder($this->pdf->GetX());
    
    $this->pdf->CellExt($unterschriftCellWidth, 'Datum / Unterschrift', $borderLast, $height, 'B', $this->_fontSize);
    $this->pdf->Ln($height);
  }

  public function _prepare($pKnr = '')
  {
    $this->_fontSize = 10; 
    
    
    
    
    
    $this->spaltenbeginnary = array('nr' => 6.4, 'unr' => 9.3, 'tnr' => 9.8, 'utnr' => 16.5, 'name' => 17.7, 'adr' => 35.8);
    $this->spaltenbreiteary = array('nr' => 2.9, 'unr' => 0.9, 'tnr' => 7.5, 'utnr' => 1.2, 'name' => 18.1, 'adr' => 21.2, 'bank' => 21);
    
    if (!$this->isHochformat()) {
      $this->spaltenbeginnary = array('nr' => 4.4,  'unr' => 6.4, 'tnr' => 6.8, 'utnr' => 11.8, 'name' => 12.2, 'adr' => 31.5);
      $this->spaltenbreiteary = array('nr' => 3,  'unr' => 0.9, 'tnr' => 5.3, 'utnr' => 0.4, 'name' => 19.3, 'adr' => 14.5, 'bank' => 23);
      if ($this->_isAntwortBoxEnabled()) {
        $this->spaltenbreiteary['bank'] = 22;
      }
    }
  }

  public function _createContent($pKurs = '')
  {
    $this->_printTNListe();
  }

  
  public function _printTNListe()
  {
    if ((\DBWorkBASysSettings::isMendenVhs() || DBWorkBASysSettings::isGummersbachKvhs()) && empty($this->kurs->folgekurs)) {
      return;
    }

    $belegungen = $this->_getBelegungen($this->knr);

    $rowHeight = 4.5;
    $border = $this->settings->spaltenanordnung->option5 ? 1 : 0; 

    $spacer = str_repeat(' ', 4); 
    
    if ($border) {
      $line = '';
    } else {
      $line = str_repeat('_ ', ($this->isHochformat()) ? 13 : 19);
    }

    $hasSepaMandatAry = $this->checkSepaMandate($belegungen);

    $i = 1;
    foreach ($belegungen as $belegung) {
      if (\DBWorkBASysSettings::isMendenVhs() && (!$hasSepaMandatAry[$belegung->id] || trim($belegung->teilnehmer->iban) === '')) {
        continue;
      }

      $this->_printTableRow(
        $i,
        $belegung->tnr,
        $belegung->teilnehmer->namevorname,
        $belegung->teilnehmer->getTelNrs(),
        $belegung->teilnehmer->email_anzeige ?? '',
        $belegung->teilnehmer->strasse,
        $belegung->teilnehmer->ort,
        $this->_getBankverbindung($belegung->teilnehmer),
        $rowHeight,
        $border,
        $line
      );

      
      $kinder = array();
      if ($belegung->id) {
        if (System::isKuferSql5()) {
          $dbwBelegung = DBWorkBelegung::getDefaultInstance(1, true, true);
          $kindBelegungen = $dbwBelegung->getKindBelgungenByTnrAndKnr($belegung->tnr, $belegung->knr);
          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);
        }
      }

      foreach ($kinder as $kind) {
        $kindName = $spacer . (($kind->name != '') ? $kind->name . ', ' : '') . $kind->vorname;
        if ($kind->gebdat) {
          $kindName .= "\n" . $spacer . "geb. $kind->gebdat";
        }

        $this->_printTableRow(
          '',
          '',
          $kindName,
          '',
          '',
          '',
          '',
          '',
          $rowHeight,
          $border,
          $line
        );
      }
      $i++;
    }
  }

  private function _istDreizeilig()
  {
    
    return ($this->settings->spaltenanordnung->option1 
             && $this->settings->spaltenanordnung->option3 
             && $this->settings->spaltenanordnung->option6); 
  }

  
  private function _printTableRow($pNr, $pTnr, $pNameVorname, $pTelNrs, $pEmail, $pStrasse, $pOrt, $pBankVerbindung, $pRowHeight, $pBorder, $pLine)
  {
    $cellHeightSmall = 2 * $pRowHeight;
    $paddingTop = 1.5;
    $paddingBottom = 1.5;
    $paddingBottomSmallCell = $paddingBottom;

    
    
    

    
    if ($this->_istDreizeilig()) {
      $cellHeightBig = 3 * $pRowHeight;
      $lineBr = "\n\n";
      $paddingBottomSmallCell += $pRowHeight;
    } else {
      $cellHeightBig = $cellHeightSmall;
      $lineBr = "\n";
    }

    
    if ($this->pdf->TriggersPageBreak($cellHeightBig + $paddingTop + $paddingBottom)) {
      $this->pdf->AddPage();
    }
    
    

    $this->pdf->CellAtXMitPadding($paddingTop, $paddingBottomSmallCell, $this->spaltenbeginnary['nr'] . '%', $pNr, '', 'R', $this->_fontSize, $this->spaltenbreiteary['nr'] . '%', ($pBorder) ? 'TBR' : '', $cellHeightSmall);

    
    $this->pdf->CellAtXMitPadding($paddingTop, $paddingBottomSmallCell, $this->spaltenbeginnary['unr'] . '%', '', '', '', '', $this->spaltenbreiteary['unr'] . '%', ($pBorder) ? 'TB' : '', $cellHeightSmall);

    
    $this->pdf->CellAtXMitPadding($paddingTop, $paddingBottomSmallCell, $this->spaltenbeginnary['tnr'] . '%', $pTnr, '', 'R', $this->_fontSize, $this->spaltenbreiteary['tnr'] . '%', ($pBorder) ? 'TBR' : '', $cellHeightSmall);

    
    $this->pdf->CellAtXMitPadding($paddingTop, $paddingBottomSmallCell, $this->spaltenbeginnary['utnr'] . '%', '', '', '', '', $this->spaltenbreiteary['utnr'] . '%', ($pBorder) ? 'TB' : '', $cellHeightSmall);

    
    $name = $pNameVorname;
    if ($this->settings->tnDarstellung->option5 && trim($pTelNrs) != '') { 
      $name .= "\n" . $pTelNrs;
    }
    if ($this->isTnEmailEnabled() && trim($pEmail) !== '') {
      $name .= "\n" . $pEmail;
    }
    $this->pdf->CellAtXMitPadding($paddingTop, $paddingBottomSmallCell, $this->spaltenbeginnary['name'] . '%', $name, '', '', $this->_fontSize, $this->spaltenbreiteary['name'] . '%', ($pBorder) ? 'TBR' : '', $cellHeightSmall);

    
    if ($this->settings->tnDarstellung->option3) {
      $this->pdf->CellAtXMitPadding($paddingTop, $paddingBottomSmallCell, $this->spaltenbeginnary['adr'] . '%', $pStrasse . "\n" . $pOrt, '', '', $this->_fontSize, $this->spaltenbreiteary['adr'] . '%', $pBorder, $cellHeightSmall);
    }
    
    
    if ($this->settings->spaltenanordnung->option1) {
      $this->pdf->CellExtMitPadding($paddingTop, $paddingBottom, $this->spaltenbreiteary['bank'] . '%', $pBankVerbindung, $pBorder, $cellHeightBig, '', $this->_fontSize);
    }
    
    $mitAntwortBoxen = $this->_isAntwortBoxEnabled();
    if ($mitAntwortBoxen) {
      for ($uebNr = 1; $uebNr < 6; $uebNr++) {
        $temp = 'SpaltenUeb' . $uebNr;
        if ($this->settings->antwortboxen->{$temp}) {
          $this->checkBox(22, $cellHeightBig + $paddingTop + $paddingBottom, $pBorder, 4);
        }
      }
    }

    $unterschriftCellWidth = $this->_getPixelToRightBorder($this->pdf->GetX());

    
    $this->pdf->CellExtMitPadding($paddingTop, 1.5, $unterschriftCellWidth, $lineBr . $pLine, ($pBorder ? 'LTB' : ''), $cellHeightBig, 'B', $this->_fontSize);
    
    $this->pdf->Ln($cellHeightBig + 3);
    
  }

  

  
  public function _getPixelToRightBorder($pX)
  {
    $pageWidth = $this->pdf->GetPageWidth();

    return $pageWidth - $pX - 10;
  }

  
  public function _getBankverbindung($teilnehmer)
  {
    if ($this->settings->spaltenanordnung->option3) { 
      if ($this->settings->spaltenanordnung->option6) {
        if ($teilnehmer->iban == '') {
          return '';
        } else {
          return $teilnehmer->bankbez . "\nBIC: $teilnehmer->bic\nIBAN: $teilnehmer->iban";
        }
      } else {
        if ($teilnehmer->konto == '') {
          return '';
        } else {
          return $teilnehmer->bankbez . "\nBLZ: $teilnehmer->blz   Konto: $teilnehmer->konto";
        }
      }
    } else {
      if ($teilnehmer->konto == '' && $teilnehmer->iban == '') {
        return 'Bankverbindung fehlt!';
      } else {
        return "Bankverb. vorhanden\nGebühr wird eingezogen";
      }
    }
  }

  private function getFolgekurs($pKnrFolgekurs)
  {
    static $dbwKurse = null;
    static $cache = array();

    if (!isset($cache[$pKnrFolgekurs])) {
      if (is_null($dbwKurse)) {
        $dbwKurse = new DBWorkKurse(1, true);
      }

      $cache[$pKnrFolgekurs] = $dbwKurse->getKurs($pKnrFolgekurs);
    }

    return $cache[$pKnrFolgekurs];
  }

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

  
  private function checkSepaMandate($pBelegungen)
  {
    $stammBvAry = array();
    foreach ($pBelegungen as $belegung) {
      if ($belegung->teilnehmer->id > 0) {
        $dbwStammBv = DBWorkStammBv::getDefaultInstance(1, true);
        $stammBv = $dbwStammBv->getStammBvByTnrAndIban($belegung->teilnehmer->id, $belegung->teilnehmer->iban);
        $stammBvAry[$belegung->id] = $stammBv;
      }
    }

    $resultTmpAry = \StammBvAPI::checkSepaMandatFromTns($stammBvAry);

    $resultAry = array();
    foreach ($stammBvAry as $belegId => $stammBv) {
      if (isset($resultTmpAry[$stammBv->id])) {
        $resultAry[$belegId] = $resultTmpAry[$stammBv->id];
      } else {
        $resultAry[$belegId] = false;
      }
    }

    return $resultAry;
  }
}