<?php
/**
 * @copyright (c) Kufer Software GmbH, Oderstraße 7, D-84453 Mühldorf
 */

namespace Kufer\Web\KuferTools\Basis\Anmeldung\HandleTnDataTable;

use Kufer\Web\KuferTools\Utils\DatamodulHelper\Teilnehmer\TeilnehmerHelper;

abstract class HandleTnDataTableUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, new HandleTnDataTableResponse());
    $searchFilter = new \Kufer\Web\KuferTools\Utils\FilterSearch\TeilnehmerSearchFilter();
    $searchMap = $searchFilter->getSearchMapFromRequest();
    $searchFilter->setSearchMapToSession($searchMap, 'tool' . $this->getToolId());
  }

  public function action()
  {
    if ($this->request->getTn) {
      $json = $this->handleGetTn($this->request->tnr);
    } else {
      $json = $this->getJSON4TnDataTable(
        !$this->request->mehrfachAnm && !$this->request->firmenAnm && !$this->request->firmenAnmRestricted
          && !$this->request->kinderAnmRestricted && !$this->request->kinderAnm,
        $this->request->firmenAnmRestricted ?? false,
        $this->request->kinderAnmRestricted ?? false
      );
    }

    return $this->getResponse($json);
  }

  
  private function handleGetTn($pTnr)
  {
    $dbwTeilnehmer = new \DBWorkTeilnehmer();
    $teilnehmer = $dbwTeilnehmer->getTeilnehm($pTnr);
    $result = (object)array(
      'tnr' => $pTnr,
      'name' => $teilnehmer->name,
      'vorname' => $teilnehmer->vorname,
      'geschlecht' => $teilnehmer->geschlecht,
      'strasse' => $teilnehmer->strasse,
      'ort' => $teilnehmer->ort,
      'telefon' => $teilnehmer->tel_anzeige,
      'email' => $teilnehmer->email_anzeige,
      'gebdat' => $teilnehmer->gebdat
    );

    return \JsonOperations::encode4Ajax($result);
  }

  private function getExtraColumn()
  {
    $columns = $this->getColumns($this->toolSettings);
    $extraColumn = new \Column();
    $extraColumn->fieldname = 'id';
    $extraColumn->datamodul = 'teilnehmer';
    $extraColumn->title = '';
    $extraColumn->width = '20';
    array_unshift($columns, $extraColumn);

    return $columns;
  }

  abstract protected function getTeilnehmerHelper(): \Kufer\Web\KuferTools\Utils\DatamodulHelper\Teilnehmer\TeilnehmerHelper;

  abstract protected function getTeilnehmerFirmenHelper($firmenTnr): \Kufer\Web\KuferTools\Utils\DatamodulHelper\Teilnehmer\TeilnehmerHelper;

  
  private function getJSON4TnDataTable(bool $pBuchenLink = true, bool $pOnlyFirmenTn = false, bool $onlyKinder = false)
  {
    
    $teilnehmerProSeite = ($this->toolSettings->teilnehmerproseite > 0) ? $this->toolSettings->teilnehmerproseite : 20;
    $iDisplayStart = \RequestOperations::getVarValue('iDisplayStart', 0);
    $currentPage = $iDisplayStart / $teilnehmerProSeite + 1;

    $dbwStammBv = new \DBWorkStammBv();

    if ($pOnlyFirmenTn) {
      
      $firmaTnr = \GetOperations::getVarValue('tnr', \SessionOperations::getVarValueWTIntern('anmeldung_tnr', -1));
      $tnhelperfirma = TeilnehmerHelper::createMitarbeiterAnmeldungTeilnehmerVonFirmaUebersicht(
        $this->toolSettings,
        $this->getUser(),
        $firmaTnr
      );
      $dataIds = $tnhelperfirma->getIdsMitFilter($this->getToolId());
      $tnAnzahl = count($dataIds);
      $dataIds = array_slice($dataIds, $iDisplayStart, $teilnehmerProSeite);
      $data = $tnhelperfirma->getDatamoduleByIds($dataIds);
    } elseif ($onlyKinder) {
      $parentTnr = \GetOperations::getVarValue('tnr', \SessionOperations::getVarValueWTIntern('anmeldung_tnr', -1));
      $tnHelperKinder = TeilnehmerHelper::createMitarbeiterAnmeldungTeilnehmerVonKinderUebersicht(
        $this->toolSettings,
        $this->getUser(),
        $parentTnr
      );

      $dataIds = $tnHelperKinder->getIdsMitFilter($this->getToolId());
      $tnAnzahl = count($dataIds);
      $dataIds = array_slice($dataIds, $iDisplayStart, $teilnehmerProSeite);
      $data = $tnHelperKinder->getDatamoduleByIds($dataIds);
    } else {
      
      $tnhelper = $this->getTeilnehmerHelper();
      
      $alleTeilnehmerNummern = $tnhelper->getIdsMitFilter($this->getToolId());
      
      $this->setTotalData($alleTeilnehmerNummern);
      $tnAnzahl = count($alleTeilnehmerNummern);

      $_REQUEST['currentIndex'] = $currentPage;
      $tnNummernDerSeite = \ToolsAPI::getDataForCurrentPage($alleTeilnehmerNummern, $teilnehmerProSeite);

      
      $data = $tnhelper->getDatamoduleByIds($tnNummernDerSeite);

      if (\GetOperations::isDefined('tnAuswahlForAbwZahlweg')) {
        $stammBvAry = $dbwStammBv->getHauptStammBvsByTnrs($tnNummernDerSeite);
        $stammBvAryAssoc = array();
        foreach ($stammBvAry as $stammBv) {
          $stammBvAryAssoc[$stammBv->nr] = $stammBv;
        }
      }
    }

    $columns = $this->getExtraColumn();
    
    $aaData = $this->datamodulToDataTable($data, $columns);

    $toolId = $this->getToolId();

    
    $tnAnzahlSeite = count($data);
    for ($i = 0; $i < $tnAnzahlSeite; $i++) {
      $tnr = \CleanOperations::cleanInt($aaData[$i][0]); 
      if (\GetOperations::isDefined('tnAuswahlForAbwZahlweg')) {
        $stammBv = isset($stammBvAryAssoc[$tnr]) ? $stammBvAryAssoc[$tnr] : $dbwStammBv->getNewObject();
        if ($stammBv->inhaber !== '') {
          $inhaber = \CleanOperations::cleanStringForHtml($stammBv->inhaber ?? '');
        } else {
          $inhaber = \CleanOperations::cleanStringForHtml($data[$i]->name) . ', ' . \CleanOperations::cleanStringForHtml($data[$i]->vorname);
        }
        $bankbez = \CleanOperations::cleanStringForHtml($stammBv->bankbez ?? '');
        $bic = \CleanOperations::cleanStringForHtml($stammBv->bic ?? '');
        $iban = \CleanOperations::cleanStringForHtml($stammBv->iban ?? '');
        $aaData[$i][0] = '<button type="button" class="btn btn-success" title="Ausw&auml;hlen" '
                . 'onclick="setAbwZahlweg(\'' . $inhaber . '\', \'' . $bankbez . '\', \'' . $bic . '\', \'' . $iban . '\', \'' . $tnr . '\')">'
                . '<i class="fa fa-download" aria-hidden="true"></i>'
                . '</button>';
      } else {
        
        $href = ($pBuchenLink) ? 'index.php?tool_id=' . $toolId . '&tnr=' . $tnr . (!is_null($data[$i]->guid) ? '&tguid=' . (string)$data[$i]->guid : '') : '#';
        $aaData[$i][0] = '<a href="' . $href . '" class="tnBuchen">'
                  . '<input type="hidden" value="' . $tnr . '" class="hiddenTnr">'
                  . '<button type="button" class="btn btn-success" title="Buchen" >'
         . '<i class="fa fa-download" aria-hidden="true"></i>'
                . '</button></a>';
      }
    }

    
    $output = array(
      'sEcho' => intval(\RequestOperations::getVarValue('sEcho')),
      'iTotalRecords' => $tnAnzahl,
      'iTotalDisplayRecords' => $tnAnzahl,
      'aaData' => $aaData
    );

    return \JsonOperations::encode($output);
  }

  
  private function datamodulToDataTable($pDatamodulAry, $pColumns)
  {
    return \Kufer\Web\KuferTools\Utils\Datatable\DatatableUtils::datamodulToDataTable(
      $this->toToolSection(),
      $this->toolSettings,
      $pDatamodulAry,
      $pColumns
    );
  }

  
  protected function setTotalData($pData)
  {
    \ToolsAPI::setTotalData($pData, $this->getToolId());
  }

  protected function getResponse($json)
  {
    $this->response->json = $json;

    return $this->response;
  }
}

class HandleTnDataTableRequest
{
  public $mehrfachAnm;
  public $firmenAnm;
  public $firmenAnmRestricted;

  
  public $kinderAnm;

  
  public $kinderAnmRestricted;

  public $getTn;
  public $tnr;
}

class HandleTnDataTableResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $json;
}