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

use Kufer\Web\Classes\Gebuehren\WarenkorbBerechnungsKontext;
use Kufer\Web\Classes\Gebuehren\WarenkorbBerechnungsState;

class GebuehrenElementVisitorGutscheinBetrag extends GebuehrenElementVisitorBase
{
  
  private $wkKontext;

  
  public $wkState;

  public function __construct(WarenkorbBerechnungsKontext $wkKontext, WarenkorbBerechnungsState $wkState)
  {
    $this->wkKontext = $wkKontext;
    $this->wkState = $wkState;
  }

  public function visit(GebuehrenElement $elem)
  {
    if ($this->wkState->gutscheinBetragOffen === 0.0 && !$this->wkState->gutscheinBetragOffenSetFlag) {
      $this->wkState->gutscheinBetragOffen = $this->wkKontext->gutscheinBetrag;
    }

    $gutscheinKursGeb = new Kursgebuehr();
    $gutscheinKursGeb->knr = $elem->getKnr();
    $gutscheinKursGeb->nurFurBerechnung = true;

    $kursGebSatzBetraege = array();
    $parts = $elem->getGebuehrensaetze();
    foreach ($parts as $kgeb) {
      $kursGebSatzBetraege[] = $kgeb->betrag;
    }
    $kursBetrag = array_sum($kursGebSatzBetraege);
    $gutscheinKursGeb->betrag = $this->getGutscheinBetragZuReduzieren($kursBetrag);

    $elem->addGebuehrensatz($gutscheinKursGeb);
  }

  
  public function getGutscheinBetragZuReduzieren($kursBetrag): float
  {
    $gutscheinBetragAbzuziehen = min($this->wkState->gutscheinBetragOffen, $kursBetrag);
    $this->wkState->gutscheinBetragOffen = abs(MathOperations::stringToFloat($this->wkState->gutscheinBetragOffen) - MathOperations::stringToFloat($gutscheinBetragAbzuziehen));
    $this->wkState->gutscheinBetragOffenSetFlag = true;

    return - MathOperations::stringToFloat($gutscheinBetragAbzuziehen);
  }
}