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

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

use Kufer\Web\KuferTools\Basis\UseCaseBuilder\ToolSection;
use Kufer\Web\KuferTools\Utils\StatusMessages\StatusMessage;

abstract class WssFieldPersonFoto extends \Kufer\Web\KuferTools\Utils\WssField\WssField
{
  protected $foto_nr;

  public function __construct(ToolSection $toolSection, \ToolSettings $toolSettings, $datamodulColumn, $foto_nr)
  {
    parent::__construct($toolSection, $toolSettings, $datamodulColumn);
    $this->foto_nr = $foto_nr;
  }

  public function getFieldNichtBearbeitbar($datamodulWert, $isFormular, string $requestPrefix = '')
  {
    return $this->getImageTag($datamodulWert);
  }

  public function isValueEmpty($value): bool
  {
    return empty($value);
  }

  abstract protected function getFotoHTMLName(): string;

  public function getFieldBearbeitbar($datamodulWert, $isFormular, string $requestPrefix = '')
  {
    $fieldname = $this->getFieldName();

    if (isset($datamodulWert->{$fieldname}) && $datamodulWert->{$fieldname} === 'entfernen') {
      $img = '';
    } else {
      $img = $this->getImageTag($datamodulWert);
    }

    $buttonText = 'Foto ändern';

    $vorschau = '';

    if (isset($datamodulWert->{$fieldname}) && is_array($datamodulWert->{$fieldname})) {
      $imgFile = file_get_contents($datamodulWert->{$fieldname}['tmp_name']);
      $mime = $datamodulWert->{$fieldname}['type'];

      
      
      $vorschau = '<img class="foto_img" src="data: ' . $mime . ';base64,' . base64_encode($imgFile) . '">';
    }

    $fotoEntfernenButtons
       = '<div>
          <button class="btn btn-danger foto_entfernen" type="button">Foto entfernen</button>
        </div>
        <div>
          <button class="btn btn-danger foto_wiederherstellen" type="button">Foto doch nicht entfernen</button>
        </div>';

    if ($img == '') {
      $img = 'Kein Foto';
      if ($vorschau == '') { 
        $fotoEntfernenButtons = '';
      }
    }

    $name = $this->getFotoHTMLName();

    $img = '<div class="col-md-1 col-sm-1 col-xs-12">Aktuell:</div><div class="col-md-4 col-sm-4 col-xs-12">' . $img . '</div>';

    $img .= '
      <div class="foto_upload">
        <div  class="col-md-3 col-sm-3 col-xs-12">
          <div>
            <label for="' . $name . '" class="foto_upload_label">' . $buttonText . '
              <input id="' . $name . '" type="file" name="' . $name . '" class="foto_input">
            </label>
            <button class="btn btn-danger foto_clear" type="button" aria-label="Foto wieder entfernen"><i class="fa fa-trash" aria-hidden="true"></i></button>
          </div>
          ' . $fotoEntfernenButtons . '
        </div>
        <div  class="col-md-4 col-sm-4 col-xs-12">
        <div id="' . $name . '_vorschau" class="foto_vorschau">' . $vorschau . '</div>
          </div>
      </div>';

    return $img;
  }

  protected function encodeValue($value)
  {
    return $value;
  }

  protected function getImageTag($datamodulWert)
  {
    $foto = $this->getFoto($datamodulWert);

    if ($foto->id > 0) {
      $link = \FotoAPI::getFotoLink($foto->typ, $foto->id, $foto->lfdNr, $foto);
      if ($link == '') {
        return '';
      }

      return '<img class="foto_img" src="../webbasys/' . $link . '" alt="' . $datamodulWert->getVarValue('beschreibung_bf') . '" title="' . $datamodulWert->getVarValue('untertitel') . '">';
    } else {
      return '';
    }
  }

  abstract protected function getFoto($datamodulWert): \Foto;

  public function inPost(string $requestPrefix = ''): bool
  {
    if (parent::inPost($requestPrefix) && parent::getValueFromPost($requestPrefix) === 'entfernen') {
      return true;
    }

    $realPrefix = $requestPrefix === '' ? '' : $requestPrefix . '_';

    return isset($_FILES[$realPrefix . $this->getDatamodulAndFieldName()]) && strlen($_FILES[$realPrefix . $this->getDatamodulAndFieldName()]['name']) > 0;
  }

  public function getValueFromPost(string $requestPrefix = '')
  {
    if (parent::getValueFromPost() === 'entfernen') {
      return 'entfernen';
    }

    return $_FILES[($requestPrefix === '' ? '' : $requestPrefix . '_') . $this->getDatamodulAndFieldName()];
  }

  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]) && $columnValues[$datamodul][$fieldname] === 'entfernen') {
        $changedDm->{$fieldname} = 'entfernen';
        $changedFields[] = $fieldname;
      } elseif (isset($columnValues[$datamodul][$fieldname], $_FILES[$this->getDatamodulAndFieldName()])) {
        $changedDm->{$fieldname} = $_FILES[$this->getDatamodulAndFieldName()];
        $changedFields[] = $fieldname;
      }
    }

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

  public function isValid($value, bool $checkPflichtfelder = true): bool
  {
    
    if (is_null($value) || $value == '') {
      if ($checkPflichtfelder && $this->isMandatory()) {
        
        
        
      } else {
        return true;
      }
    }

    if ($value === 'entfernen') {
      return true;
    }

    $statusMessage = \Kufer\Web\KuferTools\Utils\StatusMessages\StatusMessageContainer::getSharedInstance();

    $tool0Settings = \ToolSettingsAPI::getToolSettings(0);

    $file = $_FILES[$this->getDatamodulAndFieldName()];
    if ($file['error'] != 0) {
      \Logger::logg('Foto hochladen - Fehler beim Hochladen: Nr. ' . $file['error']);
      $statusMessage->addStatusMessageObj(new \Kufer\Web\KuferTools\Utils\StatusMessages\PlainStatusMessage(StatusMessage::MSG_BOX_ERROR, 'Beim Übertragens des Fotos ist ein technischer Fehler aufgetreten. Bitte versuchen Sie es erneut, oder wenden sich an die Einrichtung.'));

      return false;
    }

    if ($file['size'] > $tool0Settings->uploadmaxsize) { 
      \Logger::logg('Foto hochladen - Foto zu groß. Datei' . $file['size'] . ' > Erlaubt' . $tool0Settings->uploadmaxsize);
      $maxSize = \FSOperations::formatHumanReadable($tool0Settings->uploadmaxsize);
      $statusMessage->addStatusMessageObj(new \Kufer\Web\KuferTools\Utils\StatusMessages\PlainStatusMessage(StatusMessage::MSG_BOX_ERROR, 'Das Foto übersteigt die maximal erlaubte Dateigröße von ' . $maxSize . '.'));

      return false;
    }

    if (!\StringOperations::checkWhitelistFileExtension(explode(',', $tool0Settings->imgUploadWhitelist), $file['name'])) {
      \Logger::logg('Foto hochladen - Dateiendung nicht erlaubt. Dateiname ' . $file['name']);
      $statusMessage->addStatusMessageObj(new \Kufer\Web\KuferTools\Utils\StatusMessages\PlainStatusMessage(StatusMessage::MSG_BOX_ERROR, 'Das Foto muss in einen der folgenden Formate angegeben sein: ' . $tool0Settings->imgUploadWhitelist . '.'));

      return false;
    }

    return true;
  }
}