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

namespace Kufer\Web\KuferTools\Basis\Kursdetails\TnBestaetigung;

use Kufer\Utils\Pdf\Helper\Container;
use Kufer\Utils\Pdf\Helper\Line;
use Kufer\Utils\Pdf\Helper\RenderObject;
use Kufer\Utils\Pdf\Helper\Table;
use Kufer\Utils\Pdf\Helper\TextArea;
use Kufer\Utils\Pdf\Helper\TextField;

class TNBestaetigungPresenter extends \Kufer\KuferTools\Basis\Presenter\Presenter
{
  protected function getViewModel()
  {
    return null;
  }

  protected function getView()
  {
    return null;
  }

  public function setRequestHeader()
  {
  }

  public function present()
  {
    $top = 67;
    $left = 24;
    $pdf = $this->createPdf($top, $left);

    foreach ($this->useCaseResponse->belegungen as $belegung) {
      $pdf->AddPage();
      $this->createBelgungPage($pdf, $this->useCaseResponse->kurs, $belegung, $top, $left);
    }

    return $pdf->Output('', 'tnbestaetigung.pdf');
  }

  public function getEncoding()
  {
    return UTF_8;
  }

  public function getExternalEncoding()
  {
    return UTF_8;
  }

  protected function createPdf($top, $left): \ExtPDF
  {
    $result = new \ExtPDF(5, true, 'P');
    $result->SetAuthor($this->useCaseResponse->author);
    $result->SetTitle('Teilnahmebestätigung', true);
    $result->SetSubject('Erstellt mit KuferTools');
    $result->SetAutoPageBreak(false);
    $result->SetFont('OpenSans', '', 10);

    $result->SetLeftMargin($left);
    $result->SetRightMargin(20);
    $result->SetTopMargin($top);

    return $result;
  }

  protected function createBelgungPage(\ExtPDF $pdf, \Kurs $kurs, \Belegung $belegung, float $top, float $left): void
  {
    $container = new Container($pdf);
    $container->SetFont('OpenSans', '', 10);

    $anschrift = new TextArea($pdf);
    $anschrift->setTexts(array(
      $belegung->getTeilnehmer()->getVarValue('anrede'),
      $belegung->getTeilnehmer()->getVarValue('vorname') . ' ' . $belegung->getTeilnehmer()->getVarValue('name'),
      $belegung->getTeilnehmer()->getVarValue('strasse'),
      $belegung->getTeilnehmer()->getVarValue('ort'),
    ));
    $anschrift->setWidth(80);
    $anschrift->setHeight(27.3);

    $container->addChild($anschrift);

    $foldLineOne = $this->createFoldLine($pdf, 109);
    $container->addChild($foldLineOne);

    $textStart = $top + 45;

    $textContainer = new Container($pdf);

    $textVhs = $this->createSmallBodyText($pdf, null, $textStart, 'Die ' . $this->useCaseResponse->vhsname . ' bescheinigt');
    $textContainer->addChild($textVhs);

    $textName = $this->createBigBodyText(
      $pdf,
      $left + 10,
      $textStart + 10,
      trim($belegung->getTeilnehmer()->getVarValue('anrede') . ' ' . $belegung->getTeilnehmer()->getVarValue('vorname') . ' ' . $belegung->getTeilnehmer()->getVarValue('name'))
    );
    $textContainer->addChild($textName);

    $textKursnummer = $this->createSmallBodyText(
      $pdf,
      null,
      $textStart + 23,
      'die regelmäßige Teilnahme am Seminar / Kurs Nr. ' . \StringOperations::lpad($belegung->kurs->getVarValue('nr_anzeige'), 20, ' ')
    );
    $textContainer->addChild($textKursnummer);

    $textKurstitel = $this->createBigBodyText(
      $pdf,
      $left + 10,
      $textStart + 33,
      trim($belegung->kurs->getVarValue('kurzbez'))
    );
    $textContainer->addChild($textKurstitel);
    $container->addChild($textContainer);

    $kursInfoContainer = new Container($pdf);
    $kursInfoTitle = $this->createSmallBodyText(
      $pdf,
      null,
      $textStart + 64,
      'Informationen zum Kurs:'
    );
    $kursInfoTitle->setFontStyle(RenderObject::FONT_STYLE_BOLD);
    $kursInfoContainer->addChild($kursInfoTitle);
    $kursInfoArea = new TextArea(
      $pdf,
      array($kurs->getVarValue('info'))
    );
    $kursInfoArea->setLimit(9);
    $kursInfoArea->setWidth('80%');
    $kursInfoArea->setY($textStart + 70);
    $kursInfoContainer->addChild($kursInfoArea);
    $container->addChild($kursInfoContainer);

    $foldLineTwo = $this->createFoldLine($pdf, 213);
    $container->addChild($foldLineTwo);

    $tableStart = $textStart + 110;
    $textDatenZumKurs = $this->createSmallBodyText(
      $pdf,
      null,
      $tableStart,
      'Daten zum Kurs:'
    );
    $container->addChild($textDatenZumKurs);

    $table = new Table($pdf, array(), array());
    $table->setWidths(array(40, 30, 20));
    $table->setX($left);
    $table->setY($tableStart + 5);
    $rowKursnummer = $table->createRow();
    $rowKursnummer->addColumns(array('Kursnummer:', $belegung->getKurs()->getVarValue('nr_anzeige'), ''));
    $rowKursbeginn = $table->createRow();
    $rowKursbeginn->addColumns(array('Kursbeginn:', $belegung->getKurs()->getVarValue('begdat'), ''));
    $rowKursdauer = $table->createRow();
    $rowKursdauer->addColumns(array('Kursdauer:', (string)$belegung->getKurs()->getVarValue('dauer_int'), 'UE: ' . (string)$belegung->getKurs()->getVarValue('ue')));
    $rowKursgebuehr = $table->createRow();
    $rowKursgebuehr->addColumns(array('Kursgebühr:', (string)$belegung->entgelt));
    $rowDozentIn = $table->createRow();
    $rowDozentIn->addColumns(array($this->useCaseResponse->sprachSettings->Dozent['Singular']['Nominativ'] . ':', $belegung->getKurs()->hauptdozent->getVarValue('name_ggf_vorname'), ''));
    $container->addChild($table);

    $textSignature = $this->createSmallBodyText(
      $pdf,
      null,
      $tableStart + 45,
      $this->useCaseResponse->vhsort . ', den ' . $this->useCaseResponse->today . ' ' . \str_repeat('.', 40)
    );
    $container->addChild($textSignature);

    $container->render();
  }

  protected function createBigBodyText(\ExtPDF $pdf, $x, $y, string $text): TextField
  {
    $result = new TextField($pdf, $text);
    $result->setFontSize(16);
    $result->setXY($x, $y);

    return $result;
  }

  protected function createSmallBodyText(\ExtPDF $pdf, $x, $y, string $text): TextField
  {
    $result = new TextField($pdf, $text);
    $result->setXY($x, $y);

    return $result;
  }

  protected function createFoldLine(\ExtPDF $pdf, $y): Line
  {
    $line = new Line($pdf, 3, $y, 7, $y);
    $line->setLineWidth(0.5);

    return $line;
  }
}