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

namespace Kufer\Web\KuferTools\Teilnehmer\ZsaAnmeldung\BelegungsUebersicht;


class BelegungsUebersichtUseCase extends \Kufer\Web\KuferTools\Basis\Uebersicht\UebersichtUseCase
{
  public $dbwBelegung;
  private $belegungHandler;

  public function __construct($request)
  {
    parent::__construct($request, new BelegungsUebersichtResponse());
    
    $this->dbwBelegung = new \DBWorkBelegung(1, true);
    $user = $this->getUser();
    $this->belegungHandler = new \Kufer\Web\KuferTools\Utils\BelegungHandler\Belegungen4Bildungsverantwortlichen($user->tnr);
    $this->initFilter();
  }

  private function belegeKursFilterVor()
  {
    if ($this->kursFilterKursbeginnVorbelegen()) {
      $datumVonBisAry = \ToolsAPI::getVorbelegungDatumVonBis($this->getToolId());
      $this->request->suchParameter['ssearch_kursbeginnzeitraum_von_tool43'] = $datumVonBisAry['von'];
      $this->request->suchParameter['ssearch_kursbeginnzeitraum_bis_tool43'] = $datumVonBisAry['bis'];
    }
  }

  private function kursFilterKursbeginnVorbelegen()
  {
    return $this->toolSettings->kursFilterKursbeginnVorbelegen || $this->toolSettings->kursFilterKursbeginnVorbelegen === 'T';
  }

  public static function getToolSectionId()
  {
    return 531;
  }

  public static function getToolId()
  {
    return 43;
  }

  protected function getUeberschrift()
  {
    return 'Anmeldungen';
  }

  
  protected function getDatamoduleProSeite()
  {
    return 1000;
  }

  protected function vorAction()
  {
    $this->setOrderingToSession();
  }

  private function setOrderingToSession()
  {
    if ($this->request->einstieg) {
      \SessionOperations::setVarValueWTIntern('tool43_sort1', 'sort_bstatus');
      \SessionOperations::setVarValueWTIntern('tool43_sort2', 'sort_knr');
      \SessionOperations::setVarValueWTIntern('tool43_sort3', 'sort_tn');
    } else {
      if ($this->request->sort_1 != '') {
        \SessionOperations::setVarValueWTIntern('tool43_sort1', $this->request->sort_1);
      }
      if ($this->request->sort_2 != '') {
        \SessionOperations::setVarValueWTIntern('tool43_sort2', $this->request->sort_2);
      }
      if ($this->request->sort_3 != '') {
        \SessionOperations::setVarValueWTIntern('tool43_sort3', $this->request->sort_3);
      }
    }
  }

  private function getOrdering()
  {
    $order1 = \SessionOperations::getVarValueWTIntern('tool43_sort1', '');
    $order2 = \SessionOperations::getVarValueWTIntern('tool43_sort2', '');
    $order3 = \SessionOperations::getVarValueWTIntern('tool43_sort3', '');

    return array($order1, $order2, $order3);
  }

  private function initFilter()
  {
    $searchAPI = new \BelegungSuchAPI();
    if (isset($this->request->suchParameter)) {
      if ($this->request->einstieg) {
        $this->belegeKursFilterVor();
      }
      $searchAPI->setSearchParamsToSession($this->request->suchParameter);
    }

    $this->belegungHandler->initFilterFromSession($this->getToolId());
  }

  
  protected function getAlleIds()
  {
    $ordering = $this->getOrdering();
    $order1 = $this->translateOrderingToField($ordering[0]);
    $order2 = $this->translateOrderingToField($ordering[1]);
    $order3 = $this->translateOrderingToField($ordering[2]);
    $this->belegungHandler->setOrdering($order1, $order2, $order3);
    
    return $this->belegungHandler->getAlleIds();
  }

  private function translateOrderingToField($sortInRequest)
  {
    switch ($sortInRequest) {
      default: return '';
      case 'sort_tn': return 't.name, t.vorname';
      case 'sort_knr': return 'k.nr';
      case 'sort_ktitel': return 'k.kurzbez';
      case 'sort_beginn_dat': return 'k.beginn_dat';
      case 'sort_bstatus': return 'b.status_1';
      case 'sort_bprio': return 'b.prioanm';
    }
  }

  protected function getPanelButtonCallBacks()
  {
    $buttons = array();

    if ($this->isRechtAllowed('531.0.1')) {
      $buttons[] = function($belegung) {
        return new \Kufer\Web\KuferTools\Basis\Button\HtmlButton('Teilnehmerdetails', 'teilnehmerDetails', 'index.php?tool_id=43&action=teilnehmerdetails&bid=' . $belegung->id, 'search', 'Teilnehmerdetails');
      };
    }

    if ($this->isRechtAllowed('531.0.2')) {
      $buttons[] = function($belegung) {
        if ($belegung->status == 'I') {
          return new \Kufer\Web\KuferTools\Basis\Button\HtmlButton('Belegungsdetails', 'belegungDetail', 'index.php?tool_id=42&action=belegungDetails&bid=' . $belegung->id, 'edit', 'Belegungsdetails');
        } else {
          return null;
        }
      };
    }

    return $buttons;
  }

  
  protected function getResponse()
  {
    parent::getResponse();
    
    $this->response->datamodule = $this->response->belegungen;
    $this->response->statusCode = $this->request->statusCode;

    $ordering = $this->getOrdering();
    $this->response->sort_1 = $ordering[0];
    $this->response->sort_2 = $ordering[1];
    $this->response->sort_3 = $ordering[2];

    $this->response->vergebenePrioritaeten = $this->vergebenePrioritaeten();

    return $this->response;
  }

  
  private function vergebenePrioritaeten()
  {
    $genehmigteBelegungen = $this->getGenehmigteBelegungen();

    $belegungenByKnr = \ArrayOperations::setAttributAsKeyArray($genehmigteBelegungen, 'knr');

    return array_map(function($belegungen) {
      $belegungenById = \ArrayOperations::setAttributAsKey($belegungen, 'id');

      return \ArrayOperations::mapAttribut($belegungenById, 'prioanm');
    }, $belegungenByKnr);
  }

  private function getGenehmigteBelegungen()
  {
    $user = $this->getUser();
    
    $belegungHandler = new \Kufer\Web\KuferTools\Utils\BelegungHandler\Belegungen4Bildungsverantwortlichen($user->tnr);
    $belegungHandler->setFilterStatus('K'); 

    return $belegungHandler->getAlleDatamodule();
  }

  protected function getDatamodulOnCurrentPage()
  {
    return new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseBelegungenOnCurrentPage($this);
  }

  protected function verlinkePanelHeaderAllowed()
  {
    return $this->isRechtAllowed('531.0.1');
  }
}

class BelegungsUebersichtRequest extends \Kufer\Web\KuferTools\Basis\Uebersicht\UebersichtRequest
{
  public $statusCode = '';
  public $sort_1 = '';
  public $sort_2 = '';
  public $sort_3 = '';
}

class BelegungsUebersichtResponse extends \Kufer\Web\KuferTools\Basis\Uebersicht\UebersichtRequest
{
  public $belegungen = array();
  public $statusCode = '';
  public $sort_1;
  public $sort_2;
  public $sort_3;
}