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

namespace Kufer\KuferTools\Utils\WssField;

class WssFieldTeilnehmerAusbilder extends WssField
{
  protected function getFieldBearbeitbar($datamodulWert, $isFormular, string $requestPrefix = '')
  {
    return $this->_buildField($this->datamodulColumn, $datamodulWert, 2, false);
  }

  protected function getFieldNichtBearbeitbar($datamodulWert, $isFormular, string $requestPrefix = '')
  {
    if ($isFormular) {
      return $this->_buildField($this->datamodulColumn, $datamodulWert, 1, false);
    } else {
      return parent::getFieldNichtBearbeitbar($datamodulWert, $isFormular, $requestPrefix);
    }
  }

  protected function getValue($datamodulWert, $isFormular = false)
  {
    $ausbilder = static::getAusbilderFromDatamodul($datamodulWert);
    if (!empty($ausbilder)) {
      if (\count($ausbilder) == 1) {
        return $this->htmlEncode(\ArrayOperations::firstValue($ausbilder)->getVarValue('titel_name_vorname'));
      } else {
        return '<ul class="wss_list">' . \implode('', \array_map(function($dozent) {
          return '<li style="white-space: nowrap;">' . $this->htmlEncode($dozent->getVarValue('titel_name_vorname')) . '</li>';
        }, $ausbilder)) . '</ul>';
      }
    }

    return $this->getAlternativtext();
  }

  protected function encodeValue($value)
  {
    
    return $this->dontEncode($value);
  }

  private function getPostName()
  {
    return 'teilnehmer_ausbilder_hidden';
  }

  public function inPost(string $requestPrefix = ''): bool
  {
    return \PostOperations::isDefined(($requestPrefix === '' ? '' : $requestPrefix . '_') . $this->getPostName());
  }

  public function getValueFromPost(string $requestPrefix = '')
  {
    $jsonBase64 = \PostOperations::getVarValue(($requestPrefix === '' ? '' : $requestPrefix . '_') . $this->getPostName());

    return \JsonOperations::getFromStringBase64InternalEncoding($jsonBase64);
  }

  public function getChangedInfo($columnValues, $changedDm, $changedFields): array
  {
    if ($this->datamodulColumn->accesslevel == 2 && $this->datamodulColumn->canedit == 1) {
      $datamodul = $this->getDatamodulName();
      $fieldname = $this->getFieldName();
      if (isset($columnValues[$datamodul][$fieldname])) {
        $newData = $columnValues[$datamodul][$fieldname];

        $newDataDnrs = \ArrayOperations::mapAttribut($newData, 'id');
        if (isset($changedDm->id) && $changedDm->id !== '') {
          static::updateBeziehungen($changedDm->id, $newDataDnrs);
        }

        $changedDm->ausbilderauswahl = $newDataDnrs;
        $changedFields[] = 'ausbilderauswahl';
      }
    }

    return array('changed' => $changedDm, 'changedFields' => $changedFields);
  }

  
  public static function updateBeziehungen($tnrMitarbeiter, $dnrAusbilder, $gueltigVon = null, $gueltigBis = null)
  {
    $currentAusbilder = static::getAusbilderFromDatamodul($tnrMitarbeiter);
    $currentAusbilderDnrs = \ArrayOperations::mapAttribut($currentAusbilder, 'id');
    $beziehungenToRemoveDnrs = \array_diff($currentAusbilderDnrs, $dnrAusbilder);
    $beziehungenToAddDnrs = \array_diff($dnrAusbilder, $currentAusbilderDnrs);
    $dbwBeziehungen = new \DBWorkBeziehung();
    foreach ($beziehungenToRemoveDnrs as $dnr) {
      $bez = $dbwBeziehungen->getBeziehungFromPerson(
        \DBWorkBeziehung::BEZIEHUNG_AUSBILDER_ZU_MITARBEITER,
        'D',
        $dnr,
        'T',
        $tnrMitarbeiter
      );
      \BeziehungAPI::deleteBeziehung($bez->id);
    }
    foreach ($beziehungenToAddDnrs as $dnr) {
      $bez = static::getAusbilderMitarbeiterBeziehung($tnrMitarbeiter, $dnr, $gueltigVon, $gueltigBis);
      \BeziehungAPI::insertBeziehung($bez);
    }
  }

  public static function getAusbilderMitarbeiterBeziehung($mitarbeiterId, $ausbilderId, $gueltigVon = null, $gueltigBis = null)
  {
    $bezId = \Kufer\KuferTools\Firma\MitarbeiterUebersicht\NewTeilnehmer\HandleTeilnehmerInsert\HandleTeilnehmerInsertUseCase::getHLBeziehungByArt(\DBWorkBeziehung::BEZIEHUNG_AUSBILDER_ZU_MITARBEITER);
    $result = new \Beziehung();
    $result->bezId = $bezId;
    $result->typ1 = 'D';
    $result->nr1 = $ausbilderId;
    $result->typ2 = 'T';
    $result->nr2 = $mitarbeiterId;
    $result->gueltig_von = \is_null($gueltigVon) ? \DateObj::getNow()->getDate() : $gueltigVon;
    $result->gueltig_bis = \is_null($gueltigBis) ? DEFAULTDATE : $gueltigBis;

    return $result;
  }

  protected function isMandatoryValueEmpty($value)
  {
    return \count($value) === 0;
  }

  private function _buildField($field, $datamodulWert, $privileg, $pPrintversion)
  {
    $canedit = ($privileg == 2 && !$pPrintversion && $field->canedit);

    $htmlField = $this->_getArea($datamodulWert, $pPrintversion, $field, $canedit);
    if ($canedit) {
      $htmlField .= '<div class="ausbilderauswahl_buttons" style="position: absolute; right: 25px; top: 5px; font-size: 2em;">';

      $htmlField
        .= '<div style="resize: none;">'
          . '<span class="button_new_ausbilderauswahl_test" title="AusbilderIn auswählen">'
            . '<i class="fa fa-address-book-o"></i>'
          . '</span>'
        . '</div>';

      $htmlField
        .= '<div style="resize: none;">'
          . '<span class="button_delete_ausbilderauswahl" title="AusbilderIn entfernen">'
            . '<i class="fa fa-trash"></i>'
          . '</span>'
        . '</div>';

      $htmlField .= '</div>';
    }

    if (!$pPrintversion) {
      
      static $callInit = true;
      if ($callInit) {
        $htmlField .= $this->initJS();
        $callInit = false;
      }
    }

    return $htmlField;
  }

  private function initJS()
  {
    return '';
  }

  private function _getArea($datamodulWert, $pPrintversion, $field, $pEditable)
  {
    $fieldname = $this->_getFieldname($field);
    
    $dozentenJs = \array_map(function(\Dozent $doz) {
      $result = new \stdClass();
      $result->id = $doz->id;
      $result->vorname = $doz->vorname;
      $result->name = $doz->name;

      return $result;
    }, static::getAusbilderFromDatamodul($datamodulWert));

    $tablespaceproperties = ($pPrintversion) ? 'cellpadding="2" cellspacing="2"' : '';

    $readonly = (!$pEditable) ? ' disabled' : '';

    $pflichtfeldClass = '';
    if (!$readonly && $field->mandatory_field) {
      $pflichtfeldClass = 'form_mandatory';
    }

    $str = '<div id="' . $fieldname . '" class="recht_' . $field->privileg_key . ' ' . $fieldname . ' ' . $pflichtfeldClass . ' form-control mnlist" style="min-height: 177px; overflow: auto;".' . $readonly . '>' . "\n"
              . '<table class="mnlisttable" border="1" ' . $tablespaceproperties . ' rules="all" style="font-size:12px; width: 95%;">' . "\n"
                . '<thead></thead>' . "\n"
                . '<tbody>' . "\n";
    $str .= '</tbody>' . "\n"
           . '</table>' . "\n"
           . '<input id="' . $fieldname . '_hidden" class="mnlist_hidden" name="' . $fieldname . '_hidden" type="hidden" value="' . \JsonOperations::encodeBase64($dozentenJs) . '">' . "\n"
        . '</div>' . "\n";

    return $str;
  }

  
  public static function getAusbilderFromDatamodul($datamodulWert)
  {
    $tnr = \is_int($datamodulWert) ? $datamodulWert : $datamodulWert->getVarValueEx('id', 'teilnehmer');
    if ($tnr === '') {
      return array();
    }

    $dbwBeziehungen = new \DBWorkBeziehung();
    $ausbilderBez = $dbwBeziehungen->getBeziehungenAusbilderZuTeilnehmer($tnr);
    $dbwDozenten = new \DBWorkDozenten();

    return \array_map(function(\Beziehung $bez) use ($dbwDozenten) {
      return $dbwDozenten->getDozent($bez->nr1);
    }, $ausbilderBez);
  }
}