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

namespace Kufer\KuferTools\Dozent\Portrait\DozentenportraitBearbeiten;

use Kufer\KuferTools\Utils\StatusMessages\StatusMessage;
use Kufer\KuferTools\Utils\StatusMessages\StatusMessageContainer;

class DozentenPortraitBearbeitenAbsendenUseCase extends \Kufer\KuferTools\Basis\UseCase\ToolUseCase
{
  public const SUCCESS_DOZENTEN_PORTRAIT_BEARBEITEN_ERFOLGREICH = 'dozentenPortraitBearbeitenErfolgreich';
  public const SUCCESS_DOZENTEN_PORTRAIT_BEARBEITEN_BILD_HOCHLADEN_ERFOLGREICH = 'dozentenPortraitBearbeitenBildHochladenErfolgreich';
  public const INFO_DOZENTEN_PORTRAIT_NICHT_VERAENDERT = 'dozentenPortraitNichtVeraendert';
  public const ERROR_DOZENTEN_PORTRAIT_BEARBEITEN_FEHLGESCHLAGEN = 'dozentenPortraitBearbeitenFehlgeschlagen';
  public const ERROR_DOZENTEN_PORTRAIT_BEARBEITEN_BILD_HOCHLADEN_FEHLGESCHLAGEN = 'dozentenPortraitBearbeitenBildHochladenFehlgeschlagen';
  public const ERROR_DOPPELT_ABSENDEN = 'doppeltVersandt';
  public const ERROR_DOZENTEN_PORTRAIT_DATEN_FEHLERHAFT = 'dozentenPortraitDatenFehlerhaft';

  public const SUCCESS_BENACHRICHTIGUNG_VERSANDT = 'benachrichtigungVersandt';
  public const ERROR_BENACHRICHTIGUNG_NICHT_VERSANDT = 'benachrichtigungNichtVersandt';

  private const PORTRAIT_UPLOAD_PATH = '../webbasys/bilder';

  public function __construct($request)
  {
    parent::__construct($request, new DozentenPortraitAbsendenResponse());
  }

  public static function getToolSectionId()
  {
    return 651;
  }

  public function hasAccess($pToolSectionId = null)
  {
    if (!parent::hasAccess()) {
      return false;
    }
    if (!$this->request->isXsrfOk && !$this->request->isRefresh) {
      return false;
    }

    return true;
  }

  public function action()
  {
    $smc = StatusMessageContainer::getSharedInstance();

    $statusCodes = array();
    if ($this->request->isRefresh) {
      $statusCodes[] = self::ERROR_DOPPELT_ABSENDEN;
    } else {
      $user = $this->getUser();
      $origDozentenPortrait = $this->getDozentenPortrait();
      $changedDozentenPortrait = $this->request->wssHandler->getChangedDm($origDozentenPortrait, $this->request->columnValues);
      $changedFields = $this->request->wssHandler->getChangedFieldnames($origDozentenPortrait, $this->request->columnValues);

      $wrongFields = $this->request->wssHandler->checkColumnValues($this->request->columnValues);
      if (count($wrongFields) > 0) {
        $statusCodes[] = self::ERROR_DOZENTEN_PORTRAIT_DATEN_FEHLERHAFT;
        $this->response->wrongFields = $wrongFields;
        $this->response->changedDozentenPortrait = $changedDozentenPortrait;
      } else {
        $imageWasUploaded = false;
        $image = $this->handleImageUpload();
        if ($image !== false) {
          if ($this->checkImage($image)) {
            $imageWasUploaded = true;
            $imageBase64 = $this->getImageBase64($image->name);
            $changedDozentenPortrait->foto->pfoto_inArbeit = $imageBase64;
            $changedFields[] = 'pfoto_inArbeit';
            $changedDozentenPortrait->foto->portrait_flag |= PORTRAIT_FLAG_KUFERTOOLS;
            $changedFields[] = 'portrait_flag';
          } else {
            $smc->addStatusMessageObj(StatusMessage::getErrorMessageObj(strip_tags($image->errorMsg)));
            $statusCodes[] = self::ERROR_DOZENTEN_PORTRAIT_BEARBEITEN_BILD_HOCHLADEN_FEHLGESCHLAGEN;
          }
        }

        if (($changedDozentenPortrait->foto->portrait_flag & PORTRAIT_FLAG_BILD_LOESCHEN) == PORTRAIT_FLAG_BILD_LOESCHEN
            && !$this->request->portrait_loeschen) {
          

          
          $changedDozentenPortrait->foto->portrait_flag &= ~PORTRAIT_FLAG_BILD_LOESCHEN;
          $changedFields[] = 'portrait_flag';
        }

        if ($this->request->portrait_loeschen) {
          
          $changedDozentenPortrait->foto->portrait_flag |= PORTRAIT_FLAG_BILD_LOESCHEN;
          
          
          $this->request->portrait_in_bearbeitung_loeschen = true;
        }

        if ($this->request->portrait_in_bearbeitung_loeschen) {
          
          $changedDozentenPortrait->foto->portrait_flag &= ~PORTRAIT_FLAG_KUFERTOOLS;
          $changedFields[] = 'portrait_flag';
          $changedDozentenPortrait->foto->pfoto_inArbeit = '';
          $changedFields[] = 'pfoto_inArbeit';
        }

        if (count($changedFields) > 0) {
          try {
            $changedFields4Dmz = $this->getChangedFields4DMZ($changedFields);
            $idFoto = \PortraitAPI::sendPortrait2DMZ($changedDozentenPortrait, $changedFields4Dmz, $user->dnr);

            $dbwPortrait = \DBWorkPortrait::getDefaultInstance(1, true);
            $dbwDozWebDataCheck = \DBWorkDozWebDataCheck::getDefaultInstance(1, true);

            
            if (\SessionOperations::isReplikat()) {
              $changedDozentenPortrait->foto->pfoto_inArbeit = '';
            }

            
            
            
            
            

            if (!isset($changedDozentenPortrait->foto->id)) {
              $changedDozentenPortrait->foto->typ = 'D';
              $changedDozentenPortrait->foto->nr = $user->dnr;
              $changedDozentenPortrait->foto->id = $dbwPortrait->insertPortrait($changedDozentenPortrait->foto, \SessionOperations::isDmzBetrieb(), $idFoto);
            }

            if ($imageWasUploaded) {
              $this->renameImage($changedDozentenPortrait->foto->id);
              $statusCodes[] = self::SUCCESS_DOZENTEN_PORTRAIT_BEARBEITEN_BILD_HOCHLADEN_ERFOLGREICH;
            }

            $dbwPortrait->updatePortrait($changedDozentenPortrait->foto, \SessionOperations::isDmzBetrieb());
            $dbwDozWebDataCheck->updateDozWebDataCheck($changedDozentenPortrait->dozWebDataCheck, \SessionOperations::isDmzBetrieb());
            $statusCodes[] = self::SUCCESS_DOZENTEN_PORTRAIT_BEARBEITEN_ERFOLGREICH;

            $statusCodesBenachrichtigung = $this->sendBenachrichtigungAnEinrichtung($changedDozentenPortrait->dozent);
            $statusCodes = array_merge($statusCodes, $statusCodesBenachrichtigung);
          } catch (\Exception $e) {
            $statusCodes[] = self::ERROR_DOZENTEN_PORTRAIT_BEARBEITEN_FEHLGESCHLAGEN;
            \Logger::logg('Fehler beim Senden an die DMZ. SendPortrait2DMZ Fault: ' . $e->getMessage(), 960);
          }
        } else {
          $statusCodes[] = self::INFO_DOZENTEN_PORTRAIT_NICHT_VERAENDERT;
        }
      }
    }

    return $this->getResponse($statusCodes);
  }

  protected function getResponse($pStatusCodes)
  {
    $this->response->changedDozentenPortrait = $this->getDozentenPortrait();
    $this->response->statusCodes = $pStatusCodes;

    return $this->response;
  }

  public static function getToolId()
  {
    return \ToolsAPI::TOOL_PORTRAIT_DOZ;
  }

  
  protected function getDozentenPortrait()
  {
    $user = $this->getUser();
    $dozentenPortrait = new \DozentenPortrait();

    $dbwPortrait = \DBWorkPortrait::getDefaultInstance(1, true);
    $dozentenPortrait->foto = $dbwPortrait->getPortrait('D', $user->dnr);

    $dbwDozWebDataCheck = \DBWorkDozWebDataCheck::getDefaultInstance(1, true);
    $dozentenPortrait->dozWebDataCheck = $dbwDozWebDataCheck->getOrCreateDozWebDataCheck($user->dnr, true, false, \SessionOperations::isDmzBetrieb());

    $dbwDozenten = \DBWorkDozenten::getDefaultInstance(1, true);
    $dozentenPortrait->dozent = $dbwDozenten->getDozent($user->dnr);

    return $dozentenPortrait;
  }

  
  protected function handleImageUpload()
  {
    $wssDatamodulAndFieldName = 'foto_pfoto_inArbeit';
    $user = $this->getUser();
    if (file_exists($_FILES[$wssDatamodulAndFieldName]['tmp_name']) && is_uploaded_file($_FILES[$wssDatamodulAndFieldName]['tmp_name'])) {
      $tool0Settings = \ToolSettingsAPI::getToolSettings(0);
      $uploadPath = \UploadUserAPI::getUploadPath4User(self::PORTRAIT_UPLOAD_PATH, $user, false, true);

      $imageName = $this->getImageName();
      $maxUploadCounter = 1;
      $fileNameCounter = ''; 
      $overwriteExistingFile = true;


      $images = \UploadOperations::doUpload(
        $wssDatamodulAndFieldName,
        $uploadPath,
        $maxUploadCounter,
        $tool0Settings->bildUploadMaxSize,
        new \UserBasedUploadFileStrategy(),
        $fileNameCounter,
        $overwriteExistingFile,
        $imageName
      );

      if (isset($images[0])) {
        $image = $images[0];
      } else {
        $image = null;
      }

      return $image;
    }

    return false;
  }

  
  protected function checkImage($pImage)
  {
    $isImageValid = true;
    if (is_null($pImage) || $pImage->errorType !== UPLOAD_ERR_OK) {
      \Logger::logg('Dozentenportrait: ' . strip_tags($pImage->errorMsg != '' ? $pImage->errorMsg : 'Unbekannter Fehler beim Hochladen des Bildes.'), 250);
      $isImageValid = false;
    }

    return $isImageValid;
  }

  protected function getImageName($pId = null)
  {
    if (is_null($pId)) {
      $user = $this->getUser();
      $id = 'tmp_' . $user->dnr;
    } else {
      $id = $pId;
    }

    return 'D_' . $id . '_pfoto_inArbeit.jpg';
  }

  
  protected function renameImage($pId)
  {
    $user = $this->getUser();
    $uploadPath = \UploadUserAPI::getUploadPath4User(self::PORTRAIT_UPLOAD_PATH, $user, false, true);

    $tempImageName = $uploadPath . DIRECTORY_SEPARATOR . $this->getImageName();
    $imageName = $uploadPath . DIRECTORY_SEPARATOR . $this->getImageName($pId);

    rename($tempImageName, $imageName);
  }

  protected function getImageBase64($pImagePath)
  {
    $dataString = file_get_contents($pImagePath);

    return base64_encode($dataString);
  }

  protected function getChangedFields4DMZ($pChangedFields)
  {
    $user = $this->getUser();

    $dbwPortrait = \DBWorkPortrait::getDefaultInstance(1, true);
    $origFoto = $dbwPortrait->getPortrait('D', $user->dnr);

    $dbwDozWebDataCheck = \DBWorkDozWebDataCheck::getDefaultInstance(1, true);
    $origDozWebDataCheck = $dbwDozWebDataCheck->getOrCreateDozWebDataCheck($user->dnr, true, false, \SessionOperations::isDmzBetrieb());

    $changedFotoFields = array();
    $changedDozWebDataCheckFields = array();

    $dozWebDataCheckObjVars = array_keys(get_object_vars($origDozWebDataCheck));
    $fotoObjVars = array_keys(get_object_vars($origFoto));

    foreach ($pChangedFields as $changedFieldName) {
      if (in_array($changedFieldName, $dozWebDataCheckObjVars)) {
        $changedDozWebDataCheckFields[] = $changedFieldName;
      } elseif (in_array($changedFieldName, $fotoObjVars)) {
        $changedFotoFields[] = $changedFieldName;
      }
    }

    return array('foto' => $changedFotoFields, 'dozWebDataCheck' => $changedDozWebDataCheckFields);
  }

  
  protected function benachrichtigeEinrichtungPerMail($pDozent)
  {
    $user = $this->getUser();

    $subject = 'KuferTools: neues oder geändertes Dozentenportrait von ' . $pDozent->vorname . ' ' . $pDozent->name . ' eingegangen';
    $body = 'Es wurde das Dozentenportrait von ' . $pDozent->vorname . ' ' . $pDozent->name . ' geändert.' . "\n\n"
            . 'Das geänderte Dozentenportrait kann in KuferSQL überprüft und freigegeben werden.';
    $footerGrund = 'Änderung des Dozentenportraits';

    $email = new \Kufer\Mail\EMail\EMailPlaintext($subject, $body);
    $email->addKuferToolsFooter($footerGrund, $user);
    $emailSender = \Kufer\Mail\Sender\EMailSenderFactory::createForToolsWithCustomAddress($this->toolSettings->vhsEmailTool37Section457);

    $versendet = $emailSender->sendFromToolsUserToEinrichtung($email, $user)->hasSentAnyMails();
    if (!$versendet) {
      \Logger::logg('Dozentenportrait: Benachrichtigungs-E-Mail konnte nicht versendet werden!', 100);
    }

    return $versendet;
  }

  
  protected function benachrichtigeEinrichtungPerTelefonTodoListe($pDozent)
  {
    $user = $this->getUser();
    $versendet = true;

    $todo = new \TelefonToDoListe();
    $todo->bisdatum = \DateTimeOperations::getDateNow();
    $todo->bisuhrzeit = \DateTimeOperations::getTimeNow();
    $todo->text = 'Änderung des Dozentenportraits von ' . $pDozent->name . ' ' . $pDozent->vorname;
    $todo->bemerkung = 'Der/Die Dozent/in ' . $pDozent->name . ' ' . $pDozent->vorname . ' hat sein/ihr Dozentenportrait geändert.';
    $todo->referenztyp = 'D';
    $todo->referenznr = $user->dnr;
    $todo->referenztext = \StringOperations::substr('Doz: ' . $pDozent->name . ', ' . $pDozent->vorname, 0, 250);

    if (\SessionOperations::isDmzBetrieb()) {
      try {
        \TelefonToDoListeAPI::sendTodos(array($todo));
      } catch (\Exception $ex) {
        \Logger::logg('Fehler beim Abgleich mit DMZ: ' . $ex->getMessage(), 100);
        $versendet = false;
      }
    } elseif (!\SessionOperations::isReplikat()) {
      $todo->eintragungsdatum = $todo->bearbdatum = \DateTimeOperations::getDateNow();
      $todo->eintragender = $todo->bearbeiter = \SessionOperations::getCurrentWebToolsUserKennung();
      $todo->prioritaet = 0;
      $todo->status = 0;
      $todo->gelesen = false;
      $todo->terminid = $todo->ansprechid = $todo->benutzerid = 0;

      $dbwHlGrundsys = \DBWorkHLGrundSys::getDefaultInstance(1, true);
      $todo->mitarbeiter = $dbwHlGrundsys->getSetting('TelWebUser')->wert;

      $dbwTodo = \DBWorkTelefonToDoListe::getDefaultInstance(1, true);
      $dbwTodo->insertTelefonToDoListe($todo, false);
    }

    return $versendet;
  }

  
  protected function sendBenachrichtigungAnEinrichtung($pDozent)
  {
    $statusCodes = array();
    if ($this->toolSettings->informiereEinrichtungPerEmail || $this->toolSettings->informiereEinrichtungPerTelefonTodoListe) {
      $versendet = false;
      if ($this->toolSettings->informiereEinrichtungPerEmail) {
        $versendet |= $this->benachrichtigeEinrichtungPerMail($pDozent);
      }
      if ($this->toolSettings->informiereEinrichtungPerTelefonTodoListe) {
        $versendet |= $this->benachrichtigeEinrichtungPerTelefonTodoListe($pDozent);
      }

      if ($versendet) {
        $statusCodes[] = self::SUCCESS_BENACHRICHTIGUNG_VERSANDT;
      } else {
        $statusCodes[] = self::ERROR_BENACHRICHTIGUNG_NICHT_VERSANDT;
      }
    }

    return $statusCodes;
  }
}

class DozentenPortraitAbsendenRequest
{
  public $dnr;
  public $columnValues;
  public $isRefresh;
  public $isXsrfOk;
  public $wssHandler;

  public $portrait_loeschen;
  public $portrait_in_bearbeitung_loeschen;
}

class DozentenPortraitAbsendenResponse extends \Kufer\KuferTools\Basis\UseCase\ToolResponse
{
  public $dozentenPortrait;
  public $statusCodes;
  public $wrongFields = array();
  public $changedDozentenPortrait;
}