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

namespace Kufer\Web\KuferTools\Dozent\KursUebersicht\Detailsreiter\Honorar;

use Kufer\Web\KuferTools\Basis\UseCaseBuilder\SpecificToolSection;
use Kufer\Web\KuferTools\Basis\UseCaseBuilder\ToolSection;
use Kufer\Web\KuferTools\Dozent\KursUebersicht\KursUebersicht\KursUebersichtUseCase;

class HonorarUseCase extends \Kufer\Web\KuferTools\Dozent\KursUebersicht\EinzelKursUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, $this->getEmptyResponseObj());
  }

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

  protected function getEmptyResponseObj()
  {
    return new HonorarResponse();
  }

  public static function getToolSectionId()
  {
    return 320;
  }

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

    return true;
  }

  public function action()
  {
    $this->handleResponseStrategies();
    $kurs = $this->getKurs($this->request->knr);

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

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

  private function getHonorarUndZahlungFromDmz($pKnr)
  {
    static $honZahlung = null;
    if (is_null($honZahlung)) {
      $user = $this->getUser();
      $honZahlung = \DozKursAPI::getDozKurseMitUnterkursePerDMZ($user->dnr, $pKnr);
    }

    return $honZahlung;
  }

  private function getHonorar($pKurs)
  {
    if ($this->toolSettings->honorar_mit_unterkursen && \SessionOperations::isDmzBetrieb()) {
      try {
        return $this->getHonorarFromDmz($pKurs);
      } catch (\Exception $e) {
        \Logger::logg('HonorarUseCase getHonorarFromDMZ Fehler: ' . $e, 240);
      }
    }

    return $this->getHonorarFromDb($pKurs);
  }

  private function getHonorarFromDb($pKurs)
  {
    $dbwDozHon = new \DBWorkDozentenHonorar(1, true);
    $user = $this->getUser();

    return $dbwDozHon->getHonorarbyKNRDozentNR($pKurs->id, $user->dnr);
  }

  private function getHonorarFromDmz($pKurs)
  {
    $user = $this->getUser();
    $honorarUndZahlungen = $this->getHonorarUndZahlungFromDmz($pKurs->id);
    $summen = \DozKursAPI::fasseDozKurseZusammen($honorarUndZahlungen['dozKurse']);

    return \DozKursAPI::uebertrageSummenInDozKurs($summen, $pKurs->id, $user->dnr);
  }

  private function getZahlungen($pKurs)
  {
    if ($this->toolSettings->honorar_mit_unterkursen && \SessionOperations::isDmzBetrieb()) {
      try {
        return $this->getZahlungenFromDmz($pKurs);
      } catch (\Exception $e) {
        \Logger::logg('HonorarUseCase getZahlungenFromDmz Fehler: ' . $e, 240);
      }
    }

    return $this->getZahlungenFromDb($pKurs);
  }

  private function getZahlungenFromDb($pKurs)
  {
    $dbwZahlung = new \DBWorkZahlung(1, true);
    $user = $this->getUser();

    return $dbwZahlung->getZahlungByDoznrKnr($user->dnr, $pKurs->id);
  }

  private function getZahlungenFromDmz($pKurs)
  {
    $honorarUndZahlungen = $this->getHonorarUndZahlungFromDmz($pKurs->id);

    return $honorarUndZahlungen['zahlungen'];
  }

  protected function getResponse($kurs)
  {
    $this->response->kurs = $kurs;
    $this->response->honorar = $this->getHonorar($kurs);
    $this->response->journal = $this->getZahlungen($kurs);
    $this->response->columns4Journal = $this->getColumns4Journal($this->toolSettings);
    $this->response->showZusatzVertragAnzeigen = $this->getZusatzVertragAnzeigenEinstellung();

    $this->response->showOnlyHonorarGesamt = $this->getHonorarEinstellung();
    $this->response->showOnlyFahrkostenGesamt = $this->getFahrkostenEinstellung();
    $this->response->showOnlySpesenGesamt = $this->getSpesenEinstellung();

    $this->response->showAnzahlBetragProKm = $this->getShowAnzahlBetragProKm();
    $this->response->showKmSatzFaktorBetreff = $this->getShowKmSatzFaktorBetreff();
    $this->response->addLeereFelderByFahrgesamtNotNull = $this->addLeereFelderByFahrgesamtNotNull();
    $this->response->addLeereFelderByGesamt = $this->addLeereFelderByGesamt();

    $this->response->showDruckButton = $this->showDruckButton();
    $this->response->vertragsstatus = $this->getVertragsstatus();

    return $this->response;
  }

  public static function getColumns4Journal(\ToolSettings $toolSettings)
  {
    $user = static::getUser();
    if (!$user->isEmpty()) {
      $wssInFiles = new \Kufer\Web\KuferTools\Utils\WssInFiles();

      return $wssInFiles->getWss(
        new SpecificToolSection(static::getToolId(), $toolSectionId ?? static::getToolSectionId()),
        $toolSettings,
        321,
        $user
      );
    } else {
      return array();
    }
  }

  private function getZusatzVertragAnzeigenEinstellung()
  {
    return (isset($this->toolSettings->zusatz_vertrag_anzeigen) && !empty($this->toolSettings->zusatz_vertrag_anzeigen));
  }

  private function getHonorarEinstellung()
  {
    return (isset($this->toolSettings->honorar_nur_gesamtbetrag) && !empty($this->toolSettings->honorar_nur_gesamtbetrag));
  }

  private function getVertragsstatus(): int
  {
    if (\DBWorkBASysSettings::isMeppenVHS()) {
      try {
        $status = KursUebersichtUseCase::getRechnungsOrVertragsStatus(array($this->request->knr), \AbgleichAPI::ABGLEICH_GET_KURS_VERTRAGSSTATUS, $this->getUser());
        if (isset($status[$this->request->knr])) {
          return $status[$this->request->knr];
        }
      } catch (\AbgleichApiException $ex) {
      }
    }

    return 0;
  }

  private function getFahrkostenEinstellung()
  {
    return (isset($this->toolSettings->fahrtkosten_nur_gesamtbetrag) && !empty($this->toolSettings->fahrtkosten_nur_gesamtbetrag));
  }

  private function getSpesenEinstellung()
  {
    return (isset($this->toolSettings->spesen_nur_gesamtbetrag) && !empty($this->toolSettings->spesen_nur_gesamtbetrag));
  }

  private function getShowAnzahlBetragProKm()
  {
    if ($this->getHonorarEinstellung() != 1 && $this->getFahrkostenEinstellung() != 1 && $this->getSpesenEinstellung() != 1) {
      return true;
    }

    if ($this->getHonorarEinstellung() == 1 && ($this->getFahrkostenEinstellung() != 1 || $this->getSpesenEinstellung() != 1) && $this->response->honorar->getVarValue('fahrtGesamtMitKomma') != '0,00') {
      return true;
    }

    if ($this->getFahrkostenEinstellung() == 1 && ($this->getHonorarEinstellung() != 1 || $this->getSpesenEinstellung() != 1)) {
      return true;
    }

    if ($this->getSpesenEinstellung() == 1 && ($this->getHonorarEinstellung() != 1 || $this->getFahrkostenEinstellung() != 1)) {
      return true;
    }
  }

  private function getShowKmSatzFaktorBetreff()
  {
    if ($this->getHonorarEinstellung() != 1 && $this->getFahrkostenEinstellung() != 1 && $this->getSpesenEinstellung() != 1 && $this->response->honorar->getVarValue('fahrtGesamtMitKomma') != '0,00') {
      return true;
    }

    if (($this->getHonorarEinstellung() == 1 || $this->getSpesenEinstellung() == 1) && $this->getFahrkostenEinstellung() != 1 && $this->response->honorar->getVarValue('fahrtGesamtMitKomma') != '0,00') {
      return true;
    }
  }

  private function addLeereFelderByGesamt()
  {
    if ($this->getHonorarEinstellung() != 1 && $this->getFahrkostenEinstellung() != 1 && $this->getSpesenEinstellung() != 1) {
      return true;
    }

    if (($this->getHonorarEinstellung() == 1 || $this->getFahrkostenEinstellung() == 1 || $this->getSpesenEinstellung() == 1) && $this->getShowAnzahlBetragProKm() == 1) {
      return true;
    }

    if ($this->getFahrkostenEinstellung() == 1 && (($this->getHonorarEinstellung() == 1) || $this->getSpesenEinstellung() == 1) && $this->getShowAnzahlBetragProKm() == 1) {
      return true;
    }
  }

  private function addLeereFelderByFahrgesamtNotNull()
  {
    if ($this->getFahrkostenEinstellung() != 1 && $this->response->honorar->getVarValue('fahrtGesamtMitKomma') != '0,00') {
      return true;
    }
  }

  private function showDruckButton()
  {
    return $this->isRechtAllowed('247.0.10'); 
  }
}

class HonorarRequest
{
  public $knr;
}

class HonorarResponse extends \Kufer\Web\KuferTools\Basis\UseCase\ToolResponse
{
  public $honorar;
  public $journal;
  public $kurs;

  public $showOnlyFahrkostenGesamt;
  public $showOnlySpesenGesamt;
  public $showOnlyHonorarGesamt;
  public $showZusatzVertragAnzeigen;

  public $showAnzahlBetragProKm;
  public $addLeereFelderByFahrgesamtNotNull;
  public $showKmSatzFaktorBetreff;
  public $addLeereFelderByGesamt;

  public $showDruckButton;
  public $columns4Journal;
  public $vertragsstatus;
}