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

namespace Kufer\Web\KuferTools\Dozent\Anwesenheiten\NotenUebersicht;

class NotenUebersichtUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, new NotenUebersichtResponse());
  }

  public static function getToolId()
  {
    return 18;
  }

  public static function getToolSectionId()
  {
    return 288;
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess()) {
      return false;
    }
    if (!$this->isRechtAllowed('273.0.4')) {
      return false;
    }

    return true;
  }

  private function getKurs($knr)
  {
    $dbwKurse = new \DBWorkKurseWT(1, true);

    return $dbwKurse->getKurs($knr);
  }

  public function action()
  {
    $allgsettings = \AllgSettingsAPI::getAllgSettings();

    $this->handleResponseStrategies();

    $kurs = $this->getKurs($this->request->knr);
    $fachArry = $this->getFaecher($this->request->knr);
    $belegungen = $this->getBelegungen($kurs);
    $this->response->kurs = $kurs;
    $this->response->datum = $this->request->datum;
    $this->response->keineBelegung = (!count($belegungen) > 0) ? $this->getKeineBelegungMsg($allgsettings) : null;
    $this->response->keineFaecher = (!count($fachArry) > 0) ? $this->getKeineFaecherMsg($allgsettings) : null;

    if (!is_null($this->response->keineBelegung) || !is_null($this->response->keineFaecher)) {
      return  $this->response;
    }

    $gezetztFaecherUndBeleg = $this->setFaecherUndBelegungen($belegungen, $fachArry, $kurs);
    $this->response->belegungen = $gezetztFaecherUndBeleg['belegungen'];
    $this->response->fachArry = $gezetztFaecherUndBeleg['fachArry'];

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

  private function getFaecher($pKnr)
  {
    $dbwFack = new \DBWorkKursFach();

    return $dbwFack->getFaecherByKurs($pKnr);
  }

  private function getBelegungen(\Kurs $kurs)
  {
    $dbwBeleg = new \DBWorkBelegung();
    $dbwBeleg->orderby = 't.name';
    $dbwBeleg->newSearch();
    $dbwBeleg->fromobject->status = 'A-';

    if (!\DateTimeOperations::isEmptyOrDefault($kurs->beginn_dat)) {
      $restrictStatusByDate = \Kufer\Web\Classes\db\searchobject\BelegungToObjectStatusByDate::createFromSettings(
        \ToolSettingsAPI::getToolSettings(0),
        $kurs->beginn_dat
      );
      $dbwBeleg->toobject->restrictStatusByDate = $restrictStatusByDate;
    }

    return $dbwBeleg->getBelegungenbyKursNR($kurs->id);
  }

  private function doesFachUseIndividualNoten($kursFach)
  {
    $hlFach = $this->getHlFach();

    foreach ($hlFach as $fach) {
      if ($kursFach->fach_nr == $fach->id) {
        return $fach->individualnoten;
      }
    }

    return false;
  }

  private function getHlFach()
  {
    $dbwHLFach = new \DBWorkHLFach();
    static $hlfach = null;
    if (is_null($hlfach)) {
      $hlfach = $dbwHLFach->getAll();
    }

    return $hlfach;
  }

  private function getHlNoten()
  {
    static $hlnoten = null;
    if (is_null($hlnoten)) {
      $dbwHLNoten = new \DBWorkHLNoten(1, true);
      $hlnoten = $dbwHLNoten->getAll();
    }

    return $hlnoten;
  }

  private function setTnNote($beleg, $fach, $tnFach, $dbwTnNoten)
  {
    $tnNoten = $dbwTnNoten->getTNNotenByBelFachPruefIDs($beleg->id, $tnFach->id, 0);
    if (count($tnNoten) == 0) {
      $fach->{"note_$beleg->id"} = '0';
      $fach->{"indnote_$beleg->id"} = '';
      $fach->{"pruefung_$beleg->id"} = '';
      $fach->{"tnNoteId_$beleg->id"} = '';
    } else {
      $fach->{"note_$beleg->id"} = $tnNoten[0]->note;
      $fach->{"indnote_$beleg->id"} = $tnNoten[0]->indnote;
      $fach->{"pruefung_$beleg->id"} = $tnNoten[0]->pruefung;
      $fach->{"tnNoteId_$beleg->id"} = $tnNoten[0]->id;
    }
  }

  private function setIndividualNoten($fach, $beleg, $doesFachUseIndividualNoten)
  {
    if ($doesFachUseIndividualNoten) {
      $this->response->hlIndividualNoten = $this->getHlIndividualNoten();
      foreach ($this->response->hlIndividualNoten as $key => $individualNote) {
        $tnFachId = $fach->{"tnFachId_$beleg->id"};
        $this->response->hlIndividualNoten[$key]->{"selected$tnFachId"} = ($individualNote->indnote == $fach->{"notenWert_$beleg->id"}) ? 'selected="selected"' : '';
      }
    }
  }

  private function setHlNoten($fach, $beleg, $kurs)
  {
    if ($this->toolSettings->useNoteSelect && $kurs->notensystem == 0) {
      $this->response->hlnoten = $this->getHlNoten();
      foreach ($this->response->hlnoten as $key => $hlNote) {
        $tnFachId = $fach->{"tnFachId_$beleg->id"};
        $this->response->hlnoten[$key]->{"selected$tnFachId"} = ($hlNote->note == \MathOperations::floatToString($fach->{"notenWert_$beleg->id"})) ? 'selected="selected"' : '';
        if ($this->toolSettings->selectShowNote) {
          $pattern = '/\\d*' . (($this->toolSettings->selectNoteKommastellen > 0) ? ',\\d{' . $this->toolSettings->selectNoteKommastellen . '}/' : '/');
          $treffer = array();
          preg_match($pattern, $hlNote->note, $treffer);
          $this->response->hlnoten[$key]->matchednote = $treffer[0] . ' ';
        }
      }
    }
  }

  private function setHLNiveaus($beleg, $kurs)
  {
    if ($kurs->phase == 1 && $this->response->flagDieserTnHatMindestensEinFach) {
      $this->response->hlNiveaus = $this->getHlNiveaus();
      foreach ($this->response->hlNiveaus as $niveau) {
        $niveau->{"selected$beleg->id"} = ($niveau->niveau == $beleg->niveau) ? 'selected' : '';
      }
    }
  }

  private function setChkdUndDisabledAttrs($fach, $beleg, $tnFach)
  {
    $tnFachId = $fach->{"tnFachId_$beleg->id"};
    if ($beleg->notenende == 'W') {
      $fach->{"disabled_$tnFachId"} = ' disabled="disabled"';
    } else {
      $fach->{"disabled_$tnFachId"} = '';
    }
    $fach->{"nichtBenotetChecked_$tnFachId"} = $tnFach->nichtbeurteilt ? ' checked="checked"' : '';
    $fach->{"nichtBenotetDisabled_$tnFachId"} = $fach->{"disabled_$tnFachId"};
  }

  private function setNotenWert($fach, $beleg, $doesFachUseIndividualNoten)
  {
    if ($doesFachUseIndividualNoten) {
      $fach->{"notenWert_$beleg->id"} = $fach->{"indnote_$beleg->id"};
    } else {
      $fach->{"notenWert_$beleg->id"} = ($fach->{"note_$beleg->id"} === '0' ? '' : $fach->{"note_$beleg->id"});
    }
  }

  private function setFlags($beleg)
  {
    if ($beleg->notenende != 'W') {
      $this->response->flagKeinSubmitErlauben = false;
    }
    $this->response->flagDieserTnHatMindestensEinFach = true;
    $this->response->flagEsGibtTNFaecher = true;
  }

  private function setFaecherUndBelegungen($pBelegungen, $pFachArry, $kurs)
  {
    $dbwTNFach = new \DBWorkTNFach();
    $dbwTnNoten = new \DBWorkTNNoten();
    foreach ($pBelegungen as $beleg) {
      $beleg->belegId = $beleg->id;
      $beleg->noteEnde = ($beleg->notenende == 'W') ? 'notenende' : '';

      foreach ($pFachArry as $fach) {
        $tnFach = $dbwTNFach->getTNFachByIDs($beleg->id, $fach->id);
        if (!empty($tnFach) && !empty($tnFach->id)) {
          $fach->{"tnFachId_$beleg->id"} = $tnFach->id;
          $this->setFlags($beleg);
          $this->setTnNote($beleg, $fach, $tnFach, $dbwTnNoten);

          $doesFachUseIndividualNoten = $this->doesFachUseIndividualNoten($fach);
          $fach->doesFachUseIndividualNoten = $doesFachUseIndividualNoten;

          $this->setNotenWert($fach, $beleg, $doesFachUseIndividualNoten);
          $this->setChkdUndDisabledAttrs($fach, $beleg, $tnFach);
          $this->setIndividualNoten($fach, $beleg, $doesFachUseIndividualNoten);
          $this->setHlNoten($fach, $beleg, $kurs);
        }
      }
      $this->setHLNiveaus($beleg, $kurs);
    }

    return array('belegungen' => $pBelegungen, 'fachArry' => $pFachArry);
  }

  private function getHlNiveaus()
  {
    static $hlNiveaus = null;
    if (is_null($hlNiveaus)) {
      $dbwhlniveau = new \DBWorkHLNiveau();
      $hlNiveaus = $dbwhlniveau->getAll();
    }

    return $hlNiveaus;
  }

  private function getHlIndividualNoten()
  {
    static $hlindnoten = null;
    if (is_null($hlindnoten)) {
      $dbwHLNoten = new \DBWorkHLIndividualNoten(1, true);
      $hlindnoten = $dbwHLNoten->getAll();
    }

    return $hlindnoten;
  }

  private function getKeineFaecherMsg($allgsettings)
  {
    if (!empty($allgsettings->failMsgNotenKeineFaecher)) {
      return $allgsettings->failMsgNotenKeineFaecher;
    }

    return 'Es sind keine Fächer für diesen Kurs eingetragen!';
  }

  private function getKeineBelegungMsg($allgsettings)
  {
    if (!empty($allgsettings->failMsgNotenKeineBelegung)) {
      return $allgsettings->failMsgNotenKeineBelegung;
    }

    return 'Es sind keine Teilnehmer für diesen Kurs eingetragen!';
  }

  protected function getResponse($allgsettings)
  {
    $this->response->showNichtBenotetBoxen = $this->toolSettings->showNichtBenotetBoxen == 1;
    $this->response->gibtFaecher = (count($this->response->fachArry) > 0);
    $this->response->gibtIndividualNoten = (count($this->response->hlIndividualNoten) > 0);
    $this->response->msgNotenBezeichnerMehrphasig = $allgsettings->msgNotenBezeichnerMehrphasig;
    $this->response->msgNotenHinweisMehrphasig = $allgsettings->msgNotenHinweisMehrphasig;
    $this->response->showNote = $this->toolSettings->selectShowNote;
    $this->response->showTxtGer = $this->toolSettings->selectShowNoteTextDeutsch;
    $this->response->showTxtEng = $this->toolSettings->selectShowNoteTextEnglisch;
    $this->response->showTxtZusatz1 = $this->toolSettings->selectShowNoteTextZusatz1;
    $this->response->showTxtZusatz2 = $this->toolSettings->selectShowNoteTextZusatz2;
    $this->response->useNoteSelect = $this->toolSettings->useNoteSelect;
    $this->response->status = $this->request->status;

    return $this->response;
  }

  protected function getResponseStrategies()
  {
    return array(
        new \Kufer\Web\KuferTools\Utils\ResponseStrategies\ResponseMitRahmen($this)
    );
  }
}


class NotenUebersichtRequest
{
  public $knr;
  public $datum;
  public $ktId;
  public $status;
}

class NotenUebersichtResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $user;
  public $kurs;
  public $anwRatio = false;
  public $abwCount = false;
  public $showNichtBenotetBoxen;
  public $flagKeinSubmitErlauben = true;
  public $flagDieserTnHatMindestensEinFach = false;
  public $flagEsGibtTNFaecher = false;
  public $menuPunkte;

  public $fachArry = array();
  public $belegungen = array();
  public $hlIndividualNoten = array();
  public $hlNiveaus = array();
  public $hlnoten = array();

  public $msgNotenBezeichnerMehrphasig;
  public $msgNotenHinweisMehrphasig;
  public $useNoteSelect;

  public $gibtIndividualNoten;
  public $gibtFaecher;

  public $showNote;
  public $showTxtGer;
  public $showTxtEng;
  public $showTxtZusatz1;
  public $showTxtZusatz2;
  public $status;
  public $datum;
  public $keineBelegung;
  public $keineFaecher;
}