<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */


class GebuehrenElementBase implements GebuehrenElement
{
  private $gebuehrenSaetze;
  private $knr;
  private $zahlplaene;
  private $kurstyp;

  
  private $mwstSaetze;

  public function __construct($knr)
  {
    $this->knr = $knr;
  }

  public function accept(GebuehrenElementVisitor $visitor): void
  {
    $this->load();
    $visitor->visit($this);
  }

  public function getGebuehrensaetze(): array
  {
    return $this->gebuehrenSaetze;
  }

  
  public function exportGebuehrensaetze(): array
  {
    return $this->getGebuehrensaetze();
  }

  public function setGebuehrensaetze($gebuehrenSaetze, $convertBetraege = true): void
  {
    $this->gebuehrenSaetze = $gebuehrenSaetze;
    if ($convertBetraege) {
      $this->convertBetraegeFromStringToFloat();
    }
  }

  public function addGebuehrensatz(Kursgebuehr $gebuehrenSatz): void
  {
    $this->gebuehrenSaetze[] = $gebuehrenSatz;
  }

  public function getKnr(): string
  {
    return $this->knr;
  }

  public function getZahlplaene(): array
  {
    return $this->zahlplaene;
  }

  public function setZahlplaene($zp): void
  {
    if (is_null($zp) || is_array($zp)) {
      $this->zahlplaene = $zp;
    }
  }

  public function getMwstSaetze(): array
  {
    return $this->mwstSaetze;
  }

  public function setMwstSaetze($mwstSaetze): void
  {
    if (is_null($mwstSaetze) || is_array($mwstSaetze)) {
      $this->mwstSaetze = $mwstSaetze;
    }
  }

  public function getKurstyp(): ?string
  {
    return $this->kurstyp;
  }

  public function setKurstyp(string $typ): void
  {
    $this->kurstyp = $typ;
  }

  public function getSum(): float
  {
    $result = 0.0;
    foreach ($this->gebuehrenSaetze as $geb) {
      $result += $geb->betrag;
    }

    return round($result, 2);
  }

  public function load(): void
  {
    if (is_null($this->gebuehrenSaetze)) {
      $dbw = DBWorkKursgebuehr::getDefaultInstance();
      $this->gebuehrenSaetze = $dbw->getAllGebuehrenPartsForKnrs(array($this->knr))[$this->knr];
      
      foreach ($this->gebuehrenSaetze as $gebSatz) {
        $gebSatz->origBetrag = $gebSatz->betrag;
      }

      $this->convertBetraegeFromStringToFloat();
    }
    if (is_null($this->zahlplaene)) {
      $dbwKz = DBWorkKurszahlplan::getDefaultInstance();
      $dbwKz->mitKursgebuehr = false;
      $this->zahlplaene = $dbwKz->getKurszahlplaeneByKnr($this->knr);
      $dbwKz->mitKursgebuehr = true;
    }

    if (is_null($this->mwstSaetze)) {
      $mwstHinterlegungen = DBWorkMwst::getDefaultInstance()->getAllCached();
      foreach ($mwstHinterlegungen as $mwstSatz) {
        $this->mwstSaetze[$mwstSatz->schluessel] = MathOperations::stringToFloat($mwstSatz->prozente);
      }
    }

    if (is_null($this->kurstyp)) {
      $dbw = DBWorkKurse::getDefaultInstance();
      $k = $dbw->getKurs($this->knr);
      if (is_string($k->typ)) {
        $this->kurstyp = $k->typ;
      }
    }
  }

  private function convertBetraegeFromStringToFloat(): void
  {
    $tmp = array();
    
    foreach ($this->gebuehrenSaetze as $geb) {
      $tmpgeb = clone $geb;
      $tmpgeb->betrag = MathOperations::stringToFloat($geb->betrag);
      $tmpgeb->betrag_ermaessigt = MathOperations::stringToFloat($geb->betrag_ermaessigt);
      $tmp[] = $tmpgeb;
    }
    $this->gebuehrenSaetze = $tmp;
  }

  public function __clone()
  {
    $parts = array();
    foreach ($this->gebuehrenSaetze as $p) {
      $parts[] = clone $p;
    }
    $this->gebuehrenSaetze = $parts;
  }
}