<?php

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

namespace Kufer\KuferTools\Teilnehmer\ZsaAnmeldung\BelegungsUebersicht;


class BelegungsUebersichtUseCase extends \Kufer\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\KuferTools\Utils\BelegungHandler\Belegungen4Bildungsverantwortlichen($user->tnr);
  }

  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()
  {
    $order1 = ($this->request->sort_1 != '') ? $this->request->sort_1 : 'sort_bstatus';
    \SessionOperations::setVarValueWTIntern('tool43_sort1', $order1);
    $order2 = ($this->request->sort_2 != '') ? $this->request->sort_2 : 'sort_knr';
    \SessionOperations::setVarValueWTIntern('tool43_sort2', $order2);
    $order3 = ($this->request->sort_3 != '') ? $this->request->sort_3 : 'sort_tn';
    \SessionOperations::setVarValueWTIntern('tool43_sort3', $order3);
  }

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

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

  
  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\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\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\KuferTools\Utils\BelegungHandler\Belegungen4Bildungsverantwortlichen($user->tnr);
    $belegungHandler->setFilterStatus('K'); 

    return $belegungHandler->getAlleDatamodule();
  }

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

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

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

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