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


class DokumenteDownloadAPI
{
  const CACHED_FILE_UPTODATE = 0;
  const NEWER_FILE_AVAILABLE = 1;
  const DELETE_CACHED_FILE = 2;

  
  public static function getDownloadDokument(DokumentWeb $dokumentweb)
  {
    if (!SessionOperations::isDmzBetrieb()) {
      Logger::logg('Funktion steht derzeit nicht zur Verfügung: DMZ-Betrieb ist nicht aktiviert!', 2013);

      return false;
    }

    if (is_null($dokumentweb->id)) {
      Logger::logg('Der übergebene Parameter darf nicht null sein.', 2014);

      return false;
    }

    $operationSuccess = true;

    
    $dokumentweb->cachedFileModifyDate = self::getDokumentwebModifyDate($dokumentweb->id);

    
    try {
      $resultArrDmz = DokumenteAPI::getDokumentewebFromDMZ(array($dokumentweb));
    } catch (AbgleichApiException $e) {
      Logger::logg('DokumentenDownload - Exception aufgetreten: ' . $e->getMessage(), 200);

      return false;
    }

    
    $doc = new DownloadDokument();
    $doc->dokumentewebId = $resultArrDmz[0]->DokumentewebID;
    $doc->dateiname = $resultArrDmz[0]->DateiName;
    $doc->status = $resultArrDmz[0]->Status;

    $resContent = $resultArrDmz[0]->ContentBase64;

    switch ($doc->status) {
      
      case static::CACHED_FILE_UPTODATE:
        $doc->content = self::getContentFromCache($doc->dokumentewebId);
        break;
      
      case static::NEWER_FILE_AVAILABLE:
        $operationSuccess = self::saveDokumentInCache($doc->dokumentewebId, $resContent);
        $doc->content = self::getContentFromCache($doc->dokumentewebId);
        break;
      
      case static::DELETE_CACHED_FILE:
        $operationSuccess = self::delCachedDokument($doc->dokumentewebId);
        break;
    }

    if (!$operationSuccess || $doc->content === false) {
      Logger::logg('Fehler bei der Verarbeitung des DMZ-Ergebnisses.', 2015);

      return false;
    }

    return $doc;
  }

  

  
  public static function getDownloadDokumentById(int $id)
  {
    $dbw = new DBWorkDokumenteWeb();
    $documentweb = $dbw->getDokument($id);

    return self::getDownloadDokument($documentweb);
  }

  

  
  private static function saveDokumentInCache(int $id, string $contentBase64): bool
  {
    $file = new SimpleFileWork();
    $file->filename = self::getCachedDokumentName($id);
    $file->access = 'w';
    $file->content = base64_decode($contentBase64);
    $fileExists = file_exists($file->filename);

    if (!$fileExists) {
      $fileExists = FSOperations::touch($file->filename);
    }

    $file->openFile();
    $file->setContent();
    $file->closeFile();

    if (!$fileExists) {
      Logger::logg("Speichern / Aktualisieren: Der Inhalt von $file->filename konnte nicht erstellt werden.", 2010);

      return false;
    }

    return true;
  }

  
  private static function delCachedDokument(int $id): bool
  {
    $filename = self::getCachedDokumentName($id);
    if (file_exists($filename)) {
      if (!FSOperations::delFile($filename)) {
        Logger::logg("Löschen: $filename konnte nicht gelöscht werden!", 2011);

        return false;
      }
    }

    return true;
  }

  
  private static function getContentFromCache(int $id): string
  {
    $path = self::getCachedDokumentName($id);

    $file = new SimpleFileWork();
    $file->filename = $path;

    $file->content = @file_get_contents($file->filename);
    if ($file->content == '') {
      Logger::logg("Dateidownload: $path war unerwarteterweise nicht vorhanden!", 2012);

      return false;
    }

    return $file->content;
  }

  
  private static function getDokumentwebModifyDate(int $id): string
  {
    $path = self::getCachedDokumentName($id);

    $mDate = FSOperations::getCorrectMTime($path);

    return $mDate === false ? '' : date('d.m.Y H:i', $mDate);
  }

  
  private static function getCachedDokumentName(int $id, bool $fileNameOnly = false): string
  {
    $filename = strval($id) . '.tmp';
    if (!$fileNameOnly) {
      $path = empty(KUFERSQL_DOKUMENTEWEB_BASEDIR) ? 'dokumente/' : KUFERSQL_DOKUMENTEWEB_BASEDIR;
      $filename = FSOperations::path($path, $filename);
    }

    return $filename;
  }

  
  public static function erzeugeAutouploadLink(int $id): string
  {
    return CmsAnb::getAnbindung()->getKuferWebUrl() . 'webbasys/dokumentwebDownload.php?id=' . $id;
  }
}


class DownloadDokument
{
  
  public $dokumentewebId;
  
  public $dateiname;
  
  public $status;
  
  public $content;
}