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

namespace Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Termine\TerminDirectAbrechnen;

use Kufer\Web\KuferTools\Utils\Dozent\TerminDirectAbrechnenUtils;

class TerminAbrechnenUseCase extends \Kufer\Web\KuferTools\Dozent\KursUebersicht\EinzelKursUseCase
{
  public $dbwKurseTage;

  public function __construct($request)
  {
    parent::__construct($request, new TerminAbrechnenResponse());
    $this->dbwKurseTage = new \DBWorkKurseTageWT(1, true);
  }

  public static function getToolId()
  {
    return \ToolsAPI::TOOL_KURSUEBERSICHT_DOZ;
  }

  public static function getToolSectionId()
  {
    return 4;
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess()) {
      return false;
    } elseif (!TerminDirectAbrechnenUtils::hasAccessToTerminDirectAbrechnen()) {
      return false;
    } elseif (!$this->areKurstageFromKurs()) {
      return false;
    } elseif (!$this->areKurstageAllowed()) {
      return false;
    }

    return true;
  }

  public function action()
  {
    return $this->getResponse();
  }

  protected function getResponse()
  {
    $this->handleResponseStrategies();
    $this->response->kurs = $this->getKurs($this->request->knr);
    $this->response->kurstage = $this->getKurstage();
    $this->response->kursTagIdsStr = $this->request->kursTagIdsStr;

    $this->response->isAbgesandt = $this->request->isAbgesandt;
    $this->response->success = $this->request->success;

    $hlgrundsys = new \DBWorkHLGrundSys(1, true);

    
    $this->response->bonusKtSelbstAbrechnen = \MathOperations::floatToString(\CleanOperations::cleanFloatMitKomma($hlgrundsys->getFeldWert('honorarabnahmebonusselbstfreigabe')));

    return $this->response;
  }

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

  private function getKurstage()
  {
    static $kurstage = null;

    if (is_null($kurstage)) {
      $kthelper = new \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\DozentenKurstage($this->toolSettings, $this->getUser());
      
      $kurstage = $kthelper->getDatamoduleByIds($this->request->kursTagIds, true);
      try {

        $kurstageByKnr = \ArrayOperations::setAttributAsKeyArray($kurstage, 'knr');
        foreach($kurstageByKnr as $knr=>$kurstageZumKurs) {
          $user = $this->getUser();

          $vertragsinfos = \DozKursAPI::getVertragInfos($user->dnr, $knr, $kurstageZumKurs);

          $HonDetailInfosByKtId = \ArrayOperations::setAttributAsKeyArray($vertragsinfos->HonDetailInfos, 'KurstagId');
          foreach ($kurstageZumKurs as $kurstag) {
            $betrag = 0;
            $honorar = 0;
            $fahrtkosten = 0;
            if (isset($HonDetailInfosByKtId[$kurstag->id])) {
              list($betrag, $honorar, $fahrtkosten) = \DozKursAPI::summarizeHonorarDetails($HonDetailInfosByKtId[$kurstag->id]);
            }
            $kurstag->hd_betrag = \MathOperations::floatToString($betrag);
            $kurstag->hd_honorar = \MathOperations::floatToString($honorar);
            $kurstag->hd_fahrtkosten = \MathOperations::floatToString($fahrtkosten);
          }
        }
      } catch (\Exception $e) {
        \Logger::logg('TerminAbrechnen: Die Honorar-Informationen zu den Kurstagen konnten nicht abgerufen werden. Fehler: ' . $e->getMessage(), 250);
        $kurstage = array();
      }
    }

    return $kurstage;
  }

  private function areKurstageFromKurs()
  {
    $kthelper = new \Kufer\Web\KuferTools\Utils\DatamodulHelper\KursTage\DozKurstageZuKurs($this->toolSettings, $this->getUser(), $this->request, $this->getKurs($this->request->knr));
    
    
    $KurstagIds = $kthelper->getIdsOhneFilter();

    $kurstage = $this->getKurstage();
    foreach ($kurstage as $kurstag) {
      if (!in_array($kurstag->id, $KurstagIds)) {
        return false;
      }
    }

    return true;
  }

  private function areKurstageAllowed()
  {
    $kurstage = $this->getKurstage();
    foreach ($kurstage as $kurstag) {
      if ($kurstag->nodoztool) {
        return false;
      }
    }

    return true;
  }
}