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


class DokuUploadUserAPI
{
  
  public static function performDokuUpload($pFiles, $pToolId, $pData = null, $pPageId = -1, $pRestrictDownloadFuer = array(), $pDokumenteArray = null)
  {

    
    
    $user = SessionOperations::getCurrentWebToolsUser();
    

    $dbwdokumente = new DBWorkDokumenteWeb();
    
    
    $zentralsettings = ToolSettingsAPI::getToolSettings(0);

    
    $uploadPath = UploadUserAPI::getUploadPath4User($zentralsettings->uploadpath, $user);

    
    

    $downloadPath = StringOperations::convertDirSeparator2Slash(UploadUserAPI::getDownloadPath4User($zentralsettings->downloadpath, $user));

    
    $statusMessageStr4FileExt = self::getStatusMessagePart4FileExt($zentralsettings);

    
    $userBasedUploadStrategy = new UserBasedUploadFileStrategy();
    $files4Upload = UploadOperations::doUploadFiles(
      $pFiles,
      'dokument_',
      $uploadPath,
      $zentralsettings->uploadmaxcount,
      $zentralsettings->uploadmaxsize,
      $userBasedUploadStrategy
    );

    
    
    $uploadResult = NO_UPLOAD;
    $uploadMeldung = '';
    
    $uploadSuccesCount = 0;
    
    
    $uploadExtErrCount = 0;
    $uploadSizeError = false;
    $uploadFehlerCount = 0;
    foreach ($files4Upload as $uploadfile) {
      if ($uploadfile->errorType !== UPLOAD_ERR_OK) {
        if ($uploadfile->errorType == UPLOAD_ERR_EXTENSION) {
          $uploadExtErrCount++;
        }
        if ($uploadfile->errorType == UPLOAD_ERR_FORM_SIZE) {
          $uploadSizeError = true;
        }
        $uploadResult = UPLOAD_NOT_OK;
        $uploadMeldung .= $uploadfile->errorMsg;
        $uploadFehlerCount++;
      } else {
        $uploadSuccesCount++;
      }
    } 


    
    
    
    

    
    if ($uploadResult == UPLOAD_NOT_OK) { 
      if ($uploadExtErrCount == 0) {
        
        
        if (!$uploadSizeError) {
          $uploadMeldung .= 'Bitte laden Sie Ihre ' . ($uploadFehlerCount == 1 ? 'Datei ' : 'Dateien ') . ' nochmals hoch!';
        }
      } else {
        if ($uploadFehlerCount == $uploadExtErrCount) {
          
          $uploadMeldung .= $statusMessageStr4FileExt;
        }
        
        
        elseif ($uploadFehlerCount > $uploadExtErrCount || $uploadSuccesCount > 0) {
          $uploadMeldung .= 'Bitte laden Sie Ihre Dateien mit einer zugelassenen Endung nochmals hoch! ' . $statusMessageStr4FileExt;
        }
      }
      
      $processResult['process'] = UPLOAD_NOT_OK;
      if (\SessionOperations::isKuferToolsResponsive()) {
        $processResult['message'] = $uploadMeldung;
      } else {
        $uploadMeldungBox = HTMLOperations::getAlertBox('<div class="alertbox_text">' . CleanOperations::cleanStringContainingHtml($uploadMeldung) . '</div>', 'Fehler', 'in_background');
        $processResult['message'] = $uploadMeldungBox;
      }
    }
    
    
    elseif ($uploadResult == NO_UPLOAD && $uploadSuccesCount == 0) {
      $processResult['process'] = NO_UPLOAD;

      $uploadMeldung = 'Es wurden keine Dateien hochgeladen.';
      $logMessage = $uploadMeldung . ' Beachten Sie die Einstellungen für den Upload der Dokumente. Evtl. ist die max. Anzahl der '
              . 'Dokumente für den Upload falsch eingestellt (z.B. 0).';
      Logger::logg($logMessage, 150);
      
      if (\SessionOperations::isKuferToolsResponsive()) {
        $processResult['message'] = $uploadMeldung;
      } else {
        $uploadMeldungBox = HTMLOperations::getAlertBox('<div class="infobox_text">' . CleanOperations::cleanStringContainingHtml($uploadMeldung) . '</div>', 'Achtung', 'in_background');
        $processResult['message'] = array('process' => UPLOAD_NOT_OK, 'message' => $uploadMeldungBox);
      }
    } 
    
    
    else {
      
      
      Logger::logg('DokumenteUpload:  Die ausgewählten Dateien wurden erfolgreich hochgeladen', 200);

      if (is_null($pDokumenteArray)) {
        $dokumenteAry = self::getDokumenteArrayFromPost($uploadSuccesCount, $downloadPath, $dbwdokumente, $user, $pRestrictDownloadFuer, $files4Upload);
      } else {
        $dokumenteAry = $pDokumenteArray;
        foreach ($dokumenteAry as $key => $dokument) {
          $dokumenteAry[$key]->original = StringOperations::convertDirSeparator2Slash($files4Upload[$key]->name); 
          $dateiname = StringOperations::getFileNameFromDirectory($dokumenteAry[$key]->original, '/');
          $dokumenteAry[$key]->internet = $downloadPath . '/' . $dateiname;
        }
      }
      
      $processResult = DokumenteAPI::processDokumente($dokumenteAry);

      
      
      if ($pToolId == \ToolsAPI::TOOL_KURSUEBERSICHT_DOZ && $processResult['process'] == UPLOAD_OK) {
        
        self::sendMail4UploadByDozent($pToolId, $pData, $pPageId, $dokumenteAry);
      }

      
      
      
      $uploadMeldung .= $processResult['message'];
      $processResult['message'] = $uploadMeldung;
    } 

    return $processResult;
  }

  

  private static function getDokumenteArrayFromPost($uploadSuccesCount, $downloadPath, $dbwdokumente, $user, $pRestrictDownloadFuer, $files4Upload)
  {
    $dokumenteAry = array();
    $i = 1;
    
    
    while (PostOperations::isDefined('dokInfo_' . $i) && PostOperations::getVarValue('dokInfo_' . $i) != '' && $i <= $uploadSuccesCount) {
      $loadedDokuRaw = PostOperations::getVarValue('dokInfo_' . $i);
      $loadedJsonDoku = JsonOperations::getFromString(urldecode($loadedDokuRaw));

      
      
      
      
      
      
      $loadedJsonDoku->original = StringOperations::convertDirSeparator2Slash($files4Upload[$i - 1]->name); 
      $dateiname = StringOperations::getFileNameFromDirectory($loadedJsonDoku->original, '/');

      
      
      $loadedJsonDoku->internet = $downloadPath . '/' . $dateiname;

      
      
      $dokument = $dbwdokumente->getNewObject();  
      $dokument->loadDatafromJSON($loadedJsonDoku);
      
      $dokument->uploaddoz = $user->dnr;

      
      if (count($pRestrictDownloadFuer) > 0 && !in_array($dokument->downloadTN, $pRestrictDownloadFuer)) {
        $dokument->downloadTN = max($pRestrictDownloadFuer); 
      }

      $dokumenteAry[$i] = $dokument;
      $i++;
    } 

    return $dokumenteAry;
  }

  
  public static function getStatusMessagePart4FileExt($pTool0Settings)
  {
    $fileExtStr = '';
    $additionalText = '';
    if ($pTool0Settings->dokuUploadAllowByExclude) {
      
      $fileExtList = explode(',', $pTool0Settings->uploadBlacklist4Ext); 
      $statusText = ' Zugelassene Endungen sind alle außer ';
      $additionalText .= ' und Dateien, die nicht mit einem Punkt beginnen.';
    } else {
      
      $fileExtList = explode(',', $pTool0Settings->uploadWhitelist4Ext); 
      $statusText = ' Zugelassene Endungen sind ';
    }

    
    foreach ($fileExtList as $fileExt) {
      $fileExt = trim($fileExt);
      $fileExtStr .= $fileExt . ', ';
    }
    
    $fileExtStr = StringOperations::substr($fileExtStr, 0, -2);

    $additionalText .= ' <div>Außerdem darf der Dateiname keine Sonderzeichen außer Bindestrich (-) Unterstrich (_) Punkt (.) enthalten.</div>';

    return $statusText . $fileExtStr . $additionalText;
  }

  

  
  public static function sendMail4UploadByDozent($pToolId, $pData, $pPageId, $pDokumentAry)
  {
    
    $freigabe4mindEinDokumentNoetig = false;
    $dokumentStr = '';
    foreach ($pDokumentAry as $dokument) {
      $dokumentStr .= $dokument->bezeichnung . ' (' . $dokument->internet . ')';
      if ($dokument->freigabenoetig == 'W') {
        
        $freigabe4mindEinDokumentNoetig = true;
        $dokumentStr .= ' (Freigabe durch einen Mitarbeiter nötig)';
      }
      $dokumentStr .= "\n";
    } 

    if ($freigabe4mindEinDokumentNoetig) {
      $dokumentStr .= "\n" . 'In KuferSQL können Dokumente im Kursstamm unter "Web / Downloads" freigeschaltet werden, indem ein Datum in das Feld "Freigabe erteilt am" eingetragen wird.' . "\n";
    }

    $toolId = $pToolId;
    $toolSettings = ToolSettingsAPI::getToolSettings($toolId);
    
    
    isset($toolSettings->uploadInfoMailAnVerwMa) ?: $toolSettings->uploadInfoMailAnVerwMa = false;
    isset($toolSettings->uploadInfoMailAnPlanMa) ?: $toolSettings->uploadInfoMailAnPlanMa = false;

    isset($toolSettings->sendMailOnly4FreigabeMA) ?: $toolSettings->sendMailOnly4FreigabeMA = false;

    
    
    if (!$toolSettings->sendMailOnly4FreigabeMA || $freigabe4mindEinDokumentNoetig) {
      
      

      $user = SessionOperations::getCurrentWebToolsUser();
      $aktDozent = SessionOperations::getCurrentWebToolsDozent();
      $mailAnMaAry = array();
      $mailAnMaAry['VerwMa'] = $toolSettings->uploadInfoMailAnVerwMa;
      $mailAnMaAry['PlanMa'] = $toolSettings->uploadInfoMailAnPlanMa;
      
      
      $mailAdressAry = ToolsAPI::getEmailAdressForKursMA($pData, $toolId, $pPageId, $mailAnMaAry);
      $senderEmailData = ToolsAPI::getSenderEmailAddressAndName($aktDozent);

      
      foreach ($mailAdressAry as $mailAdress) {
        
        $email = new smtpMailTools();
        $email->SetVar2Value('from', $senderEmailData['email']);
        $email->SetVar2Value('sendername', $senderEmailData['name']);
        $email->SetVar2Value('reply', $senderEmailData['reply']);
        $email->SetVar2Value('replyname', $senderEmailData['replyname']);

        $email->SetVar2Value('to', $mailAdress);
        $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_TEXT);
        $email->SetVar2Value('doNotSplitHTMLBody', true);
        $email->subject = 'Upload von Dokumenten';
        
        $dozentBez = $aktDozent->geschlecht == 'F' ? 'Dozentin ' : 'Dozent ';
        $email->body = $dozentBez . $aktDozent->namevorname . ' hat folgende Dokumente zum Kurs ' . $pData->id . ' erfolgreich hochgeladen:' . "\n"
                       . $dokumentStr;
        
        
        $email->setFooter('Upload von Dokumenten zu einem Kurs', $user, $pData);
        if ($email->sendMail()) {
          
          Logger::logg('Mail an ' . $mailAdress . ' wurde erfolgreich versendet', 101);
        } else {
          Logger::logg('Fehler: Mail an ' . $mailAdress . ' konnte nicht versendet versendet werden', 101);
        }
      } 
    } 
  }

  

  
  public static function performDokuRelease($pTool, $pSelectedKursnrAry)
  {
    
    
    $toolId = $pTool->getToolId();
    $dokumentid = PostOperations::getVarValue('dokumentid', '');

    return self::dokuRelease($toolId, $dokumentid, $pSelectedKursnrAry);
  }

  

  public static function dokuRelease($toolId, $dokumentid, $pSelectedKursnrAry)
  {
    $toolSettings = ToolSettingsAPI::getToolSettings($toolId);
    $dbwdokumente = new DBWorkDokumenteWeb();
    $aktuellesDokument = $dbwdokumente->getDokument($dokumentid);

    $dokumenteAry = array();
    
    foreach ($pSelectedKursnrAry as $kursnr) {
      
      
      
      

      $dokument = clone($aktuellesDokument);
      $dokument->id = '';
      $dokument->knr = $kursnr;

      $dokument->stand = DateTimeOperations::getDateNow();
      
      
      $dokument->freigabeam = DEFAULTDATE;
      $dokument->freigabevon = 0;
      
      
      
      if ($toolId == \ToolsAPI::TOOL_KURSUEBERSICHT_DOZ) {
        $dokument->freigabenoetig = 'F';
        if ($toolSettings->freigabeDokuByMA) {
          $dokument->freigabenoetig = 'W';
        }
      }
      
      
      else {
        $dokument->freigabenoetig = 'W';
      }
      $maxreihenfolge = $dbwdokumente->getMaxReihenfolge4Kurs($kursnr);
      $dokument->reihenfolge = ++$maxreihenfolge;
      
      $dokument->uploaddoz = -1;
      $dokumenteAry[] = $dokument;
    } 
    
    return DokumenteAPI::processDokumente($dokumenteAry, false);
  }

  
  public static function getKursdata4AjaxForm($pTool)
  {
    $user = $pTool->getUser();
    $toolId = $pTool->getToolId();

    $result = '';
    $aktuelleKnr = GetOperations::getVarValue('aktKnr');
    $dokumentname = GetOperations::getVarValue('dokumentbez');

    $kursdata = self::getKurs4DownloadUebertragen($toolId, $user, $aktuelleKnr, $dokumentname);

    
    foreach ($kursdata as $kurs) {
      $kursausgabe = $kurs->id . ': ' . $kurs->kurzbez;
      $result .= HTMLOperations::CreateInputTag('kurse4release', 'checkbox', 'kurse4release_' . $kurs->id, 'kurse4release', $kurs->id);
      $result .= '<label for="kurse4release_' . CleanOperations::cleanStringForHtml($kurs->id) . '">' . CleanOperations::cleanStringForHtml($kursausgabe) . '</label>' . BR_WT;
    }
    
    return $result;
  }

  

  
  public static function getKurs4DownloadUebertragen($toolId, $user, $aktuelleKnr, $dokumentname)
  {
    $dbwdokumente = new DBWorkDokumenteWeb();
    $exceptKnr = $dbwdokumente->getReleasedKnrFromDokumente($dokumentname);
    if (!in_array($aktuelleKnr, $exceptKnr)) {
      $exceptKnr[] = $aktuelleKnr;
    }

    
    $dbwkurse = new DBWorkKurseWT();
    $dbwkurse->newSearch();
    $toolSettings = ToolSettingsAPI::getToolSettings($toolId);
    $dbwkurse->fromobject->semester = $toolSettings->semlist;
    $dbwkurse->toobject->semester = '';
    $dbwkurse->orderby = $toolSettings->sortkurse;
    $dbwkurse->orderbyasc = $toolSettings->sortkurseasc;

    $kursdata = array();
    
    
    if ($user->dnr > 0 && $toolId == \ToolsAPI::TOOL_KURSUEBERSICHT_DOZ) {
      $kursdata = $dbwkurse->getKursebyDozentNR($user->id);
    } elseif ($user->ben != -1 && $toolId == \ToolsAPI::TOOL_KURSPLANUNG_MA) {
      $kursdata = $dbwkurse->getKursebyBenutzerNR($user->getIdentifier());
    } elseif ($user->dnr > 0 && $toolId == \ToolsAPI::TOOL_KURSUEBERSICHT_VA) {
      $kursHelper = Kufer\KuferTools\Utils\DatamodulHelper\KursHelper\KursHelperFactory::getKursHelperByToolID(\ToolsAPI::TOOL_KURSUEBERSICHT_VA, ToolSettingsAPI::getToolSettings(\ToolsAPI::TOOL_KURSUEBERSICHT_VA));
      $kursdata = $kursHelper->getDatamoduleOhneFilter();
    }

    $kursdata = array_filter($kursdata, function($kurs) use ($exceptKnr) {
      return !in_array($kurs->id, $exceptKnr);
    });

    
    return array_values($kursdata);
  }
}