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

namespace Kufer\Web\KuferTools\Basis\Kursdetails\Detailsreiter\Teilnehmer\HandleNachlassBearbeiten;

abstract class HandleNachlassBearbeitenUseCase extends \Kufer\Web\KuferTools\Basis\UseCase\EinzelKursUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, new HandleNachlassBearbeitenResponse());
  }

  public function hasAccess($pToolsectionId = null)
  {
    if (!parent::hasAccess($pToolsectionId)) {
      return false;
    }
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      \Logger::logg(' Fehler beim Ändern der Nachlassdaten. Der Xsrf Schlüssel im Handler zum Nachlass bearbeiten ist falsch', 250);

      return false;
    }

    if (!in_array($this->getKursId(), $this->getKursHelper()->getIdsOhneFilter())) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $statusMessage = $this->handleNachlassBearbeiten();

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

  private $belegung;

  protected function getBelegung(): \Belegung
  {
    if (is_null($this->belegung)) {
      $this->belegung = \DBWorkBelegung::getDefaultInstance()->getBelegung($this->request->belid);
    }

    return $this->belegung;
  }

  protected function getRequestedId()
  {
    return $this->request->belid;
  }

  protected function getKursId(): string
  {
    return $this->getBelegung()->knr;
  }

  protected function getAllowedIds()
  {
    return $this->getBelegungsHelper($this->getKurs($this->getKursId()))->getIdsOhneFilter();
  }

  protected function getBelegungsHelper(\Kurs $kurs): \Kufer\Web\KuferTools\Utils\DatamodulHelper\Belegungen\BelegungsHelper
  {
    return new \Kufer\Web\KuferTools\Utils\DatamodulHelper\Belegungen\ReiterTeilnehmerBelegungen(
      $this->toolSettings,
      $this->request,
      $kurs->id,
      false
    );
  }

  
  private function handleNachlassBearbeiten()
  {
    $statusMessage = '';
    $allgSettings = \AllgSettingsAPI::getAllgSettings();
    
    
    if (\SessionOperations::isReplikat() && !$allgSettings->dmzEnabled) {
      $statusMessage .= '<div role="status" class="alert alert-danger">Ein Speichern der Daten zum Nachlass ist im reinen Replikatbetrieb nicht möglich.</div>';

      return $statusMessage;
    }

    
    $belegung = $this->getBelegung();
    if ($belegung->isKind() && $belegung->kurs->typ !== 'K') {
      return '<div class="altert alter-danger">Bei Kinder-Anmeldung in nicht Kinderkursen ist kein Nachlass möglich!</div>';
    }

    $nachlassBetrag = $this->request->nachlassBetrag;
    $nachlassGrund = $this->request->nachlassGrund;
    $origBelegung = $belegung->copy();

    $dbwZahlung = new \DBWorkZahlung();
    $zahlungen = $dbwZahlung->getZahlungJournalByBelegId($this->request->belid);

    
    if (count($zahlungen) == 0) {
      return '<div role="status" class="alert alert-danger">' . \CleanOperations::cleanStringForHtml($allgSettings->failSubmitMsgNachlass) . '</div>';
    }

    
    $nachlassBetragNegativ = $nachlassBetrag * -1;
    $zahlungenNachlass = \ZahlungAPI::getNachlassZahlungen($zahlungen, $nachlassBetragNegativ, $nachlassGrund, 'Nachlass', false);

    $anzFields2Change = 0;
    
    
    if ($nachlassBetrag != 0) {
      $belegung->entgelt = \MathOperations::floatToString(\MathOperations::stringToFloat($belegung->entgelt) - $nachlassBetrag);
      $belegung->bet_offen = \MathOperations::floatToString(\MathOperations::stringToFloat($belegung->bet_offen) - $nachlassBetrag);
      
      if ($this->toolSettings->writeNachlassGrund2IntBemerkung) {
        $trenner = !empty($belegung->bemerkung) ? '; ' : '';
        $belegung->bemerkung .= $trenner . $nachlassGrund;
      }

      
      
      $correctFields = array('entgelt', 'bet_offen');
      $anzFields2Change = count($correctFields);
    }

    $success = false;
    
    if ($anzFields2Change > 0) {
      
      
      
      $success = \BelegungAPI::updateBelegung($belegung, $origBelegung);
      
      if ($success) {
        
        $success = \ZahlungAPI::insertZahlungen($zahlungenNachlass);
        
        if (!$success) {
          \BelegungAPI::updateBelegung($origBelegung, $belegung);
        }
      }
    }

    if ($success) {
      $statusMessage .= '<div role="status" class="alert alert-success">' . \CleanOperations::cleanStringForHtml($allgSettings->successMsgNachlass) . '</div>';
    } else {
      $statusMessage .= '<div role="status" class="alert alert-danger">' . \CleanOperations::cleanStringForHtml($allgSettings->failSubmitMsgNachlass) . '</div>';
    }

    return $statusMessage;
  }

  protected function getResponse($statusMessage)
  {
    $this->response->statusMessage = $statusMessage;

    return $this->response;
  }
}