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

namespace Kufer\Web\KuferTools\Utils\WssField\Dozent;

class WssFieldDozentAusbildungAuswahl extends \Kufer\Web\KuferTools\Utils\WssField\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);
    }
  }

  protected function getValue($datamodulWert, $isFormular = false)
  {
    $ausbildungen = $datamodulWert->getVarValue('ausbildungen');
    if (count($ausbildungen) > 0) {
      return implode('<br>', \array_map(function($ausbildung): string {
        return $this->htmlEncode($ausbildung->ausb_stud)
               . $this->htmlEncode($ausbildung->fachrichtung)
               . $this->htmlEncode($ausbildung->abschluss);
      }, $ausbildungen));
    }

    return 'keine Ausbildungen angegeben';
  }

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

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

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

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

  public function getChangedInfo($columnValues, $changedDm, $changedFields): array
  {
    $datamodul = $this->getDatamodulName();
    $fieldname = $this->getFieldName();
    if (isset($columnValues[$datamodul][$fieldname])) {
      $origData = $changedDm->getVarValueEx('ausbildungen', $datamodul);
      $newData = $columnValues[$datamodul][$fieldname];
      $datamodulArray = $this->createNewValueDatamodulArray($newData, $changedDm);
      if (count($origData) !== count($newData)) {
        $changedDm->ausbildungen = $datamodulArray;
        $changedFields[] = 'ausbildungen';
      } else {
        $newDataIds = \ArrayOperations::mapAttribut($newData, 'id');
        foreach ($origData as $origValue) {
          if ($origValue->id === '' || !in_array($origValue->id, $newDataIds)) {
            $changedDm->ausbildungen = $datamodulArray;
            $changedFields[] = 'ausbildungen';
            break;
          }
        }
      }
    }

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

  protected function isMandatoryValueEmpty($value): bool
  {
    return empty($value);
  }

  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="ausbildungenauswahl_buttons" style="position: absolute; right: 25px; top: 5px; font-size: 2em;">';

      $htmlField
        .= '<div style="resize: none;">'
          . $this->getAusbildungenDialogHlButton()
        . '</div>';

      $htmlField
        .= '<div style="resize: none;">'
          . '<button class="button_new_ausbildungenauswahl no-button-style" title="Neue Ausbildung" type="button">'
            . '<i class="fas fa-plus-square hinterlegung-button-icon"></i>'
          . '</button>'
        . '</div>';

      $htmlField
        .= '<div style="resize: none;">'
          . '<button class="button_update_ausbildungenauswahl no-button-style" title="Ausbildung ändern" type="button">'
            . '<i class="fa fa-edit hinterlegung-button-icon"></i>'
          . '</button>'
        . '</div>';

      $htmlField
        .= '<div style="resize: none;">'
          . '<button class="button_delete_ausbildungenauswahl no-button-style" title="Ausbildung entfernen" type="button">'
            . '<i class="fa fa-trash hinterlegung-button-icon"></i>'
          . '</button>'
        . '</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);

    $ausbildungen = $datamodulWert->getVarValueEx('ausbildungen', 'dozent');

    $ausbildungenJs = array_map(function($ausbildung) {
      $result = new \stdClass();
      $result->id = $ausbildung->id;
      $result->typ = $ausbildung->typ;
      $result->ausb_stud = $ausbildung->ausb_stud;
      $result->fachrichtung = $ausbildung->fachrichtung;
      $result->abschluss = $ausbildung->abschluss;

      return $result;
    }, $ausbildungen);

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

    $readonly = (!$pEditable) ? 'read_only' : '';
    $str = '<div id="' . $fieldname . '" class="recht_' . $field->privileg_key . ' ' . $fieldname . ' ' . $readonly . ' form-control" style="min-height: 177px; overflow: auto;">' . "\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($ausbildungenJs) . '">' . "\n"
        . '</div>' . "\n";

    return $str;
  }

  private function getAusbildungenDialogHlButton()
  {
    $fields = array('ausbildung_ausb_stud', 'ausbildung_fachrichtung', 'ausbildung_abschluss', 'ausbildung_id');
    $buttonClass = 'hl_ausbildungen';
    $buttonStyle = '';
    $dialogId = 'hlausbildungen_div';
    $dialogTitle = 'Ausbildungen';
    $dialogWidth = 'auto';
    $dialogHeight = '500';

    return \PageButtonsAPI::getHinterlegungSymbol(\HLDispatcher::HL_AUSBILDUNGEN_DIALOG, $fields, $buttonClass, $buttonStyle, $dialogId, $dialogTitle, $dialogWidth, $dialogHeight, true);
  }

  private function createNewValueDatamodulArray($ausbildungen, $changedDm)
  {
    $ausbildungenkArray = array();
    foreach ($ausbildungen as $ausbildung) {
      $result = new \TNAusbildung();
      $result->id = $ausbildung->id;
      $result->tnr = $changedDm->id;
      $result->typ = 'D';
      $result->ausb_stud = $ausbildung->ausb_stud;
      $result->fachrichtung = $ausbildung->fachrichtung;
      $result->abschluss = $ausbildung->abschluss;
      $ausbildungenkArray[] = $result;
    }

    return $ausbildungenkArray;
  }
}