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

namespace Kufer\Web\Classes\Datamodul;


class HonorarAbnahme extends \Datamodul
{
  
  public $honorarAbnahmeEintraege = array();
  
  public $honorarAbnahmeDetails = array();

  public function getTyp($pFieldName)
  {
    switch ($pFieldName) {
      case 'id':
        return \DatamodulVarType::TYPE_INT;
      case 'honorarAbnahmeEintraege':
      case 'honorarAbnahmeDetails':
        return \DatamodulVarType::TYPE_ARRAY;
      default:
        return parent::getTyp($pFieldName);
    }
  }

  
  public function getKurs(): \Kurs
  {
    if (!isset($this->honorarAbnahmeDetails[0]->honDetail->kurstag->kurs)) {
      return new \Kurs();
    }

    return $this->honorarAbnahmeDetails[0]->honDetail->kurstag->kurs;
  }

  public function getZeitbereich(): string
  {
    $kurstage = $this->getKurstage();
    if (empty($kurstage)) {
      \Logger::logg(__METHOD__ . ': Es sind keine Kurstage vorhanden und das dürfte eigentlich nicht sein!', 201);

      return '';
    }

    
    $ersterKurstag = $kurstage[0]->datum;
    $letzterKurstag = $kurstage[count($kurstage) - 1]->datum;

    $monatJahrErsterKurstag = \DateTimeOperations::getNameofMonthByDate($ersterKurstag) . ' ' . \DateTimeOperations::getYear($ersterKurstag);
    $monatJahrLetzterKurstag = \DateTimeOperations::getNameofMonthByDate($letzterKurstag) . ' ' . \DateTimeOperations::getYear($letzterKurstag);

    $result = $monatJahrErsterKurstag;
    if ($result !== $monatJahrLetzterKurstag) {
      $result .= ' - ' . $monatJahrLetzterKurstag;
    }

    return $result;
  }

  
  public function getKurstage(): array
  {
    static $kurstageCached = array();
    if (isset($kurstageCached[$this->id])) {
      return $kurstageCached[$this->id];
    }
    $honAbnahmeReklamationen = $this->getLatestHonorarAbnahmeReklamationen();
    $honAbnahmeReklamationen = \ArrayOperations::setAttributAsKeyArray($honAbnahmeReklamationen, 'hon_detail_id');

    $kurstagIdsInserted = array();
    foreach ($this->honorarAbnahmeDetails as $honAbnahmeDetail) {
      if (empty($honAbnahmeDetail->honDetail->kurstag->id)) {
        continue;
      }

      if (!in_array($honAbnahmeDetail->honDetail->kurstag->id, $kurstagIdsInserted)) {
        $kurstagIdsInserted[] = $honAbnahmeDetail->honDetail->kurstag->id;
        $honAbnahmeDetail->honDetail->kurstag->honDetailAry = array($honAbnahmeDetail->honDetail);
        $honAbnahmeDetail->honDetail->kurstag->honAbnahmeReklamationenAry = array($honAbnahmeDetail->honDetail->id => $honAbnahmeReklamationen[$honAbnahmeDetail->honDetail->id] ?? array());
        $kurstageCached[$this->id][] = $honAbnahmeDetail->honDetail->kurstag;
      } else {
        
        $honAbnahmeDetail->honDetail->kurstag->honDetailAry[] = $honAbnahmeDetail->honDetail;
        $honAbnahmeDetail->honDetail->kurstag->honAbnahmeReklamationenAry[$honAbnahmeDetail->honDetail->id] = $honAbnahmeReklamationen[$honAbnahmeDetail->honDetail->id] ?? array();
      }
    }

    return $kurstageCached[$this->id];
  }

  public function getAnzahlKurstage(): int
  {
    return count($this->getKurstage());
  }

  public function getUeGesamt(): string
  {
    $ueGesamt = 0;
    foreach ($this->getKurstage() as $kurstag) {
      $ueGesamt += \MathOperations::stringToFloat($kurstag->ue);
    }

    return \MathOperations::floatToString($ueGesamt);
  }

  public function getHonorarGesamt(): string
  {
    $honorarGesamt = 0;
    foreach ($this->honorarAbnahmeDetails as $honorarAbnahmeDetail) {
      $honorarGesamt += $honorarAbnahmeDetail->honDetail->getVarValue('gesamtfloat');
    }

    return \MathOperations::floatToString($honorarGesamt);
  }

  public function getCurrentStatus(): ?int
  {
    if (empty($this->honorarAbnahmeEintraege)) {
      return null;
    }

    $honorarAbnahmeEintraege = \ArrayOperations::setAttributAsKey($this->honorarAbnahmeEintraege, 'id');
    $key = max(array_keys($honorarAbnahmeEintraege));

    return $honorarAbnahmeEintraege[$key]->status;
  }

  
  public function getLatestHonorarAbnahmeReklamationen(): array
  {
    if (empty($this->honorarAbnahmeEintraege)) {
      return array();
    }

    $honorarAbnahmeEintraege = \ArrayOperations::setAttributAsKey($this->honorarAbnahmeEintraege, 'id');
    $key = max(array_keys($honorarAbnahmeEintraege));
    $lastHonAbnahmeEintrag = $honorarAbnahmeEintraege[$key];

    return $lastHonAbnahmeEintrag->honorarAbnahmeReklamationen;
  }

  public function getDatamodulName(): string
  {
    return 'honorarabnahme';
  }

  public static function fromDmzValues(\stdClass $dmzDatamodul): \Datamodul
  {
    $result = parent::fromDmzValues($dmzDatamodul);
    $result->honorarAbnahmeDetails = array_filter($result->honorarAbnahmeDetails, static function(HonorarAbnahmeDetail $honorarAbnahmeDetail) {
      return !empty($honorarAbnahmeDetail->honDetail->kurstag);
    });

    return $result;
  }
}