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

namespace Kufer\KuferTools\Utils\EmailVorbelegen;

class EmailVorbelegenGeaenderteKurstage extends EmailVorbelegenKurstage
{
  
  protected function getKurstage()
  {
    $changedFieldsLabels = $this->getChangedFieldsLabels();
    $changedKurstage = \ArrayOperations::setAttributAsKey($this->getChangedKurstage(), 'id');
    $origKurstage = $this->getOrigKurstage();

    return array_filter($origKurstage, function($origKurstag) use ($changedFieldsLabels, $changedKurstage) { return $this->anyRelevantChanges($changedFieldsLabels, $changedKurstage[$origKurstag->id], $origKurstag); });
  }

  
  protected function getDatumPartEinKurstag($pDatumString)
  {
    return 'gab es Änderungen an einem Termin am ' . $pDatumString . '.';
  }

  
  protected function getDatumPartMehrereKurstage($pDatumString)
  {
    return 'gab es Änderungen an Terminen am ' . $pDatumString . '.';
  }

  
  protected function getGeaenderteDatenPart()
  {
    $result = '';
    $changedFieldsLabels = $this->getChangedFieldsLabels();

    if (empty($changedFieldsLabels)) {
      return $result;
    }

    $origKurstage = \ArrayOperations::setAttributAsKey($this->getOrigKurstage(), 'id');
    $changedKurstage = $this->getChangedKurstage();

    foreach ($changedKurstage as $changedKurstag) {
      $origKurstag = $origKurstage[$changedKurstag->id];

      if (!$this->anyRelevantChanges($changedFieldsLabels, $changedKurstag, $origKurstag)) {
        continue;
      }

      $result .= $this->getTerminUeberschrift($changedFieldsLabels, $changedKurstag, $origKurstag);
      $result .= $this->getTerminAenderungen($changedFieldsLabels, $changedKurstag, $origKurstag);

      $result .= "\r\n";
    }

    return $result;
  }

  
  protected function anyRelevantChanges($pChangedFieldsLabels, $pChangedKurstag, $pOrigKurstag)
  {
    $result = false;

    $changedFields = array_keys($pChangedFieldsLabels);
    $relevantFields = array('datum', 'zeit_beg', 'zeit_ende');
    $changedRelevantFields = array_intersect($relevantFields, $changedFields);

    if (count($changedRelevantFields) > 0) {
      foreach ($changedRelevantFields as $field) {
        if ($pChangedKurstag->{$field} != $pOrigKurstag->{$field}) {
          $result = true;
          break;
        }
      }
    } elseif (isset($pChangedFieldsLabels['ausfall']) && ($pChangedKurstag->ausfall === 'A' xor $pOrigKurstag->ausfall === 'A')) {
      $result = true;
    }

    return $result;
  }

  
  protected function getTerminUeberschrift($pChangedFieldsLabels, $pChangedKurstag, $pOrigKurstag)
  {
    $result = 'Termin am ';
    if (isset($pChangedFieldsLabels['ausfall']) && $pChangedKurstag->ausfall === 'A') {
      $result .= $pOrigKurstag->datum . ' von ' . $pOrigKurstag->zeit_beg . ' - ' . $pOrigKurstag->zeit_ende . ' Uhr';
    } else {
      $result .= $pChangedKurstag->datum . ' von ' . $pChangedKurstag->zeit_beg . ' - ' . $pChangedKurstag->zeit_ende . ' Uhr';
    }

    $result .= ":\r\n";

    return $result;
  }

  
  protected function getTerminAenderungen($pChangedFieldsLabels, $pChangedKurstag, $pOrigKurstag)
  {
    $result = '';
    if (isset($pChangedFieldsLabels['ausfall']) && ($pChangedKurstag->ausfall === 'A' xor $pOrigKurstag->ausfall === 'A')) {
      if ($pChangedKurstag->ausfall === 'A') {
        $result .= '- Dieser Termin fällt aus.' . "\r\n";
      }

      if ($pOrigKurstag->ausfall === 'A') {
        $result .= '- Dieser Termin findet wieder statt.' . "\r\n";
      }
    } else {
      if (isset($pChangedFieldsLabels['datum'])) {
        $result .= '- Der Termin wurde vom ' . $pOrigKurstag->datum . ' auf den ' . $pChangedKurstag->datum . ' verschoben.' . "\r\n";
      }

      if (isset($pChangedFieldsLabels['zeit_beg']) || isset($pChangedFieldsLabels['zeit_ende'])) {
        $result .= '- Die Uhrzeit wurde von ' . $pOrigKurstag->zeit_beg . ' - ' . $pOrigKurstag->zeit_ende . ' Uhr auf '
                . $pChangedKurstag->zeit_beg . ' - ' . $pChangedKurstag->zeit_ende . ' Uhr geändert.' . "\r\n";
      }
    }

    return $result;
  }
}