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

namespace Kufer\Web\KuferTools\Dozent\HonorarAbnahme\HonorarAbnahmeUebersicht;

use Kufer\Web\KuferTools\Basis\UseCase\ToolUseCase;
use Kufer\Web\Classes\Datamodul\HonorarAbnahme;
use Kufer\Web\KuferTools\Utils\StatusMessages\PlainStatusMessage;
use Kufer\Web\KuferTools\Utils\StatusMessages\StatusMessage;

class HonorarabnahmeUebersichtUseCase extends ToolUseCase
{
  public function __construct($request)
  {
    parent::__construct($request, new HonorarAbnahmeUebersichtResponse());
  }

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

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

  public static function getToolSectionId(): int
  {
    return 784;
  }

  protected function getResponse(): HonorarAbnahmeUebersichtResponse
  {
    $this->handleResponseStrategies();

    if (\SessionOperations::isDmzBetrieb()) {
      $this->handleGetHonorarAbnahmen();
    } else {
      \Logger::logg(__METHOD__ . ': Es wird der DMZ-Betrieb für das KuferTool Honorarabnahme vorausgesetzt!', 250);
      $this->response->statusMeldungen->addStatusMessageObj(
        new PlainStatusMessage(
          StatusMessage::MSG_BOX_ERROR,
          'Diese Funktion ist nicht aktiviert! Bitte wenden Sie sich an die Einrichtung.'
        )
      );
    }

    return $this->response;
  }

  protected function handleGetHonorarAbnahmen(): void
  {
    $dnr = static::getUser()->getDnrIdentifier();

    try {
      list($this->response->kurstagDatumVon, $this->response->kurstagDatumBis) = $this->getDatumVonBis();

      $this->response->honorarAbnahmen = \HonorarAbnahmeAPI::getHonorarAbnahmen(
        $dnr,
        $this->response->kurstagDatumVon,
        $this->response->kurstagDatumBis
      );
      $this->extendHonorarAbnahmenByButtons($this->response->honorarAbnahmen);
    } catch(\Exception $e) {
      \Logger::loggException($e, 200);
      $this->response->statusMeldungen->addStatusMessageObj(
        new PlainStatusMessage(
          StatusMessage::MSG_BOX_ERROR,
          'Beim Auslesen der Honorarabrechnungen ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut oder wenden Sie sich an die Einrichtung.'
        )
      );
    }
  }

  
  private function getDatumVonBis(): array
  {
    if ($this->request->einstieg) {
      list($kurstagDatumVon, $kurstagDatumBis) = $this->getDatumVonBisDefault();
    } else {
      $kurstagDatumVon = $this->request->kurstagDatumVon ?? \SessionOperations::getVarValueWTIntern('honabnahme_kurstag_datum_von');
      $kurstagDatumBis = $this->request->kurstagDatumBis ?? \SessionOperations::getVarValueWTIntern('honabnahme_kurstag_datum_bis');

      if (!\DateTimeOperations::isValidDate($kurstagDatumVon, true)
        || !\DateTimeOperations::isValidDate($kurstagDatumBis, true)) {
        list($kurstagDatumVon, $kurstagDatumBis) = $this->getDatumVonBisDefault();
      }
    }

    \SessionOperations::setVarValueWTIntern('honabnahme_kurstag_datum_von', $kurstagDatumVon);
    \SessionOperations::setVarValueWTIntern('honabnahme_kurstag_datum_bis', $kurstagDatumBis);

    return array($kurstagDatumVon, $kurstagDatumBis);
  }

  
  private function getDatumVonBisDefault(): array
  {
    $kurstagDatumVon = $this->getDatumVonDefault();
    $kurstagDatumBis = $this->getDatumBisDefault();

    return array($kurstagDatumVon, $kurstagDatumBis);
  }

  
  private function getDatumVonDefault(): string
  {
    return \DateTimeOperations::changeMonth(\DateTimeOperations::getDateNow(), '-1', true);
  }

  
  private function getDatumBisDefault(): string
  {
    return \DateTimeOperations::changeMonth(\DateTimeOperations::getDateNow(), '-1', false);
  }

  
  private function extendHonorarAbnahmenByButtons(array $pHonorarAbnahmen): void
  {
    foreach ($pHonorarAbnahmen as $honAbnahme) {
      $buttons = '';
      if ($this->isStatusZurEinsichtFreigegeben($honAbnahme)) {
        if ($this->isAkzeptierenAllowed()) {
          $buttons .= $this->getButtonString('Akzeptieren', 'check', 'honAbnahmeAkzeptieren', 'Honorarabrechnung akzeptieren', 'honorarAbnahmeAkzeptieren', $honAbnahme, true);
        }
        if ($this->isReklamierenAllowed()) {
          $buttons .= $this->getButtonString('Reklamieren', 'times', 'honAbnahmeReklamieren', 'Honorarabrechnung reklamieren', 'honorarAbnahmeAblehnen', $honAbnahme, true);
        }
      }
      if ($this->isBelegeEinsehenAllowed()) {
        $buttons .= $this->getButtonString('Belege', 'receipt', 'honAbnahmeBelege', 'Belege einsehen', 'honorarAbnahmeBelege', $honAbnahme, true);
      }

      $honAbnahme->buttons = $buttons;
    }
  }

  private function getButtonString(string $pBeschriftung, string $pIcon, string $pClass, string $pTitle, string $pAction, HonorarAbnahme $pHonAbnahme, bool $disabled = false): string
  {
    list($icon, $link) = $this->getIconAndLinkForButton($pIcon, $pAction, $pHonAbnahme);

    return '<button type="button" '
      . 'data-href="' . $link . '" '
      . 'class="btn btn-default honabnahme_button ' . $pClass . '" '
      . 'title="' . $pTitle . '"'
      . ($disabled ? ' disabled' : '')
      . '>' . $icon . $pBeschriftung . '</button>';
  }

  private function getIconAndLinkForButton(string $pIcon, string $pAction, HonorarAbnahme $pHonAbnahme): array
  {
    $icon = '<i aria-hidden="true" class="fa fa-' . $pIcon . '"></i> ';
    $link = 'index.php?tool_id=' . static::getToolId()
      . '&action=' . $pAction
      . '&id=' . $pHonAbnahme->id
      . \Xsrf::getXsrfGetParameter($pAction, $pHonAbnahme->id);

    return array($icon, $link);
  }

  private function isAkzeptierenAllowed(): bool
  {
    return $this->isRechtAllowed('784.0.1');
  }

  private function isReklamierenAllowed(): bool
  {
    return $this->isRechtAllowed('784.0.2');
  }

  private function isBelegeEinsehenAllowed(): bool
  {
    return $this->isRechtAllowed('784.0.3');
  }

  private function isStatusZurEinsichtFreigegeben(HonorarAbnahme $pHonAbnahme): bool
  {
    return $pHonAbnahme->getCurrentStatus() === \Kufer\Web\Classes\Datamodul\HonorarAbnahmeEintrag::STATUS_DOZENT_EINSEHBAR;
  }

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