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

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

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

  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 (!\DBWorkBASysSettings::isMVHS()) {
      return false;
    } elseif (!$this->areKurstageFromKurs()) {
      return false;
    } elseif (!$this->isVertragBereitsAkzeptiert()) {
      return false;
    } elseif (!$this->areKurstageAllowed()) {
      return false;
    }

    return true;
  }

  private function isVertragBereitsAkzeptiert()
  {
    $vertragUtils = \Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar\Vertrag\Utils\VertragUtilsDefaultDruckenAkzeptierenAblehnen::getVertragUtils($this->request->knr);

    return $vertragUtils->isVertragBereitsAkzeptiert();
  }

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

  private function isReadOnly()
  {
    return $this->request->readonly || !$this->alleKurstageStatusOk();
  }

  private function alleKurstageStatusOk()
  {
    $kurstage = $this->getKurstage();
    $user = $this->getUser();
    foreach ($kurstage as $kurstag) {
      if (
        $kurstag->dnr != $user->dnr
        || !isset($kurstag->rechnungStatus)
        || $kurstag->rechnungStatus != 1
        || \DateTimeOperations::isDateAfter($kurstag->datum, \DateTimeOperations::getDateNow())) {
        return false;
      }
    }

    return true;
  }

  protected function getResponse()
  {
    $this->handleResponseStrategies();
    $this->response->kurs = $this->getKurs($this->request->knr);
    $this->response->dozent = \SessionOperations::getCurrentWebToolsDozent();
    $this->response->kurstage = $this->getKurstage();
    $this->response->kursTagIdsStr = $this->request->kursTagIdsStr;
    $this->response->readonly = $this->isReadOnly();
    $this->response->mailsVersandt = $this->request->mailsVersandt;

    $this->response->abrechnung = $this->request->abrechnung;
    $this->response = $this->setVorbelegungen($this->response);
    $this->response->honorarGesamt = $this->request->honorarGesamt;
    $this->response->iban = $this->request->iban;
    $this->response->bic = $this->request->bic;
    $this->response->bankbez = $this->request->bankbez;
    $this->response->steuernr = $this->request->steuernr;
    $this->response->bemerkung = $this->request->bemerkung;

    return $this->response;
  }

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

  private function setVorbelegungen($response)
  {
    if ($this->request->isAbgesandt) {
      $response->honorarSatz1 = $this->request->honorarSatz1;
      $response->honorarSatz2 = $this->request->honorarSatz2;
      $response->honorarSatz3 = $this->request->honorarSatz3;
      $response->stundenAnzahl1 = $this->request->stundenAnzahl1;
      $response->stundenAnzahl2 = $this->request->stundenAnzahl2;
      $response->stundenAnzahl3 = $this->request->stundenAnzahl3;
      $response->honorarBetrag1 = $this->request->honorarBetrag1;
      $response->honorarBetrag2 = $this->request->honorarBetrag2;
      $response->honorarBetrag3 = $this->request->honorarBetrag3;
    } else {
      $betraegeZuUEs = $this->betraegeZuUEs; 
      krsort($betraegeZuUEs);
      for ($i = 1; $i <= 3; $i++) {
        $response->{'honorarSatz' . $i} = key($betraegeZuUEs);
        $response->{'stundenAnzahl' . $i} = array_shift($betraegeZuUEs);
      }
    }

    return $response;
  }

  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);
      try {
        $user = $this->getUser();
        $vertragsinfos = \DozKursAPI::getVertragInfos($user->dnr, $this->request->knr, $kurstage);

        $dbwBasysSettings = new \DBWorkBASysSettings(1, true);
        $settings = $dbwBasysSettings->getSettings();
        $anzahlNachkommaStellen = $settings->honoraranzahlZweistelligRunden ? 2 : 4;

        foreach ($kurstage as $kurstag) {
          foreach ($vertragsinfos->HonDetailInfos as $honDetInfo) {
            
            if ($honDetInfo->KurstagId == $kurstag->id && $honDetInfo->Art != 'F') {
              $kurstag->hd_faktor = \MathOperations::floatToStringTruncateNull($honDetInfo->Faktor, $anzahlNachkommaStellen);
              $kurstag->hd_satz = \MathOperations::floatToString($honDetInfo->Satz);
              $kurstag->hd_art = $honDetInfo->Art;
              $kurstag->hd_text = $honDetInfo->Text;
              $kurstag->hd_betrag = \MathOperations::floatToString($honDetInfo->Betrag);
              if (!isset($this->betraegeZuUEs[$kurstag->hd_satz])) {
                $this->betraegeZuUEs[$kurstag->hd_satz] = $kurstag->hd_faktor;
              } else {
                $this->betraegeZuUEs[$kurstag->hd_satz] = \MathOperations::floatToString(\MathOperations::stringToFloat($this->betraegeZuUEs[$kurstag->hd_satz])
                        + \MathOperations::stringToFloat($kurstag->hd_faktor), $anzahlNachkommaStellen);
              }
              break;
            }
          }
        }
      } catch (\Exception $e) {
        \Logger::logg('TerminAbrechnen: Die Honorar-Informationen zu den Kurstagen konnten nicht abgerufen werden.', 250);
      }
    }

    return $kurstage;
  }

  private function areKurstageFromKurs()
  {
    $kurstage = $this->getKurstage();
    foreach ($kurstage as $kurstag) {
      if ($kurstag->kurs->id != $this->request->knr) {
        return false;
      }
    }

    return true;
  }

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

    return true;
  }
}

class TerminAbrechnenRequest
{
  public $knr;
  public $kursTagIds;
  public $kursTagIdsStr;
  public $readonly;
  public $mailsVersandt;
  public $isRefresh;

  
  public $abrechnung;
  public $honorarSatz1;
  public $honorarSatz2;
  public $honorarSatz3;
  public $stundenAnzahl1;
  public $stundenAnzahl2;
  public $stundenAnzahl3;
  public $honorarBetrag1;
  public $honorarBetrag2;
  public $honorarBetrag3;
  public $honorarGesamt;
  public $iban;
  public $bic;
  public $bankbez;
  public $steuernr;
  public $bemerkung;
  public $isAbgesandt;
}

class TerminAbrechnenResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $user;
  public $menuPunkte;
  public $kurs;
  public $dozent;
  public $kurstage;
  public $kursTagIdsStr;
  public $readonly;
  public $mailsVersandt;

  
  public $abrechnung;
  public $honorarSatz1;
  public $honorarSatz2;
  public $honorarSatz3;
  public $stundenAnzahl1;
  public $stundenAnzahl2;
  public $stundenAnzahl3;
  public $honorarBetrag1;
  public $honorarBetrag2;
  public $honorarBetrag3;
  public $honorarGesamt;
  public $iban;
  public $bic;
  public $bankbez;
  public $steuernr;
  public $bemerkung;
}