<?php

$a = session_id();
if ($a == '')
  session_start();

include_once("common/constants.inc");
include_once("common/db_utils.php");
include_once("common/segf.php");


class ImportPhotos {

  // rendben van-e az ftp kapcsolat
  var $isFtpConnected = true;
  var $isClientFtpConnected = true;
  var $conn_id = null;
  var $client_conn_id = null;
  
  function __construct() {
    if (FTP_USE_SSL)
      $this->conn_id = ftp_ssl_connect(FTP_SERVER) or die("Couldn't connect to " . FTP_SERVER);
    else
      $this->conn_id = ftp_connect(FTP_SERVER, FTP_PORT) or die("Couldn't connect to " . FTP_SERVER);
    if (!$this->isFtpConnected = ftp_login($this->conn_id, FTP_USERNAME, FTP_PASSWORD))
      $this->isFtpConnected = false;
    else
      ftp_pasv($this->conn_id, true);
  }
  
  function importPhotos() {
    $userEmailArr = array();
    $adminEmailArr = array();
    $faultImages = array();
    $feluletek = array();
    
    // download from ftp server
    if (@ftp_chdir($this->conn_id, "/" . UPLOAD_DIRECTORY)) {
      $files1 = ftp_nlist($this->conn_id, '.');
      for ($i = 0; $i < count($files1); $i++) {
        $jpgFileIsCorrupted = false;
        if (DateTime::createFromFormat('Y-m-d', $files1[$i]) !== FALSE) {
          if (!file_exists(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i])) {
            mkdir(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i]);
            chown(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i], "www-data");
            chgrp(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i], "www-data");
          }

          if (@ftp_chdir($this->conn_id, "/" . UPLOAD_DIRECTORY . $files1[$i])) {
            $files2 = ftp_nlist($this->conn_id, '.');
            for ($j = 0; $j < count($files2); $j++) {
              $newFile = IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j];
              $ext = strtolower(pathinfo($newFile, PATHINFO_EXTENSION));
              if ($ext === 'jpg' || $ext === 'jpeg') {
                if (ftp_get($this->conn_id, $newFile, $files2[$j], FTP_BINARY, 0)) {
                  if (!$this->jpegFileIsCorrupted($newFile)) {
                    chown($newFile, "www-data");
                    chgrp($newFile, "www-data");
                    errorlog('Letoltott file: ' . $files2[$j]);
                    // delete file from ftp server
                    if (ftp_delete($this->conn_id, $files2[$j]))
                      errorlog('FTP-rol torolt file: ' . $files1[$i] . "/" . $files2[$j]);
                  } else {
                    unlink($newFile);
                    $jpgFileIsCorrupted = true;
                    errorlog('Hibas file: ' . $files1[$i] . "/" . $files2[$j]);
                    $userEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: Hibás fájl!";
                    $adminEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: Hibás fájl!";
                  }
                } else {
                  errorlog('Hibasan letoltott file: ' . $files1[$i] . "/" . $files2[$j]);
                }
              } else {
                ftp_delete($this->conn_id, $files2[$j]);
              }
            }
          }
        }
        if (!$jpgFileIsCorrupted && strpos("/" . UPLOAD_DIRECTORY . $files1[$i] . "/", FAULT_IMAGES_DIRECTORY) === false) {
          if (@ftp_chdir($this->conn_id, "/" . UPLOAD_DIRECTORY)) {
            if (@ftp_rmdir($this->conn_id, $files1[$i]))
              errorlog('FTP-rol torolt konyvtar: ' . $files1[$i]);
          }
        }
      }
    }

    if (file_exists(IMPORT_FELDOLGOZANDO_DIRECTORY)) {
      $files1 = scandir(IMPORT_FELDOLGOZANDO_DIRECTORY);
      for ($i = 0; $i < count($files1); $i++) {
        if (is_dir(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i]) && $files1[$i] != "." && $files1[$i] != "..") {
          $userEmailArr[] = "\nRagasztási dátum: " . $files1[$i];
          $adminEmailArr[] = "\nRagasztási dátum: " . $files1[$i];
          $files2 = scandir(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i]);
          for ($j = 0; $j < count($files2); $j++) {
            if (strpos(strtolower($files2[$j]), "jpg") !== false || strpos(strtolower($files2[$j]), "jpeg") !== false) {
              if (file_exists(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j])) {
                $felulet = $this->getFelulet($files2[$j], $files1[$i]);

                if (is_array($felulet)) { // bent van az adatbazisban
                  if (!isset($feluletek[$felulet["ragacslist_id"]]))
                    $feluletek[$felulet["ragacslist_id"]] = $felulet;

                  // kepek masolasa photos mappaba
                  $ragacsDatumAsTimeStamp = strtotime($felulet["ragasztas_datum"]);
                  $ragacsDatum = date("Y.m.d.", $ragacsDatumAsTimeStamp);
                  $dir = PHOTO_DIRECTORY . date("Y", $ragacsDatumAsTimeStamp) . "/" . date("m", $ragacsDatumAsTimeStamp) . "/" . $felulet["kampany_id"] . "/" . $ragacsDatum;
//                  $newFile = $dir . "/" . strtoupper(pathinfo($files2[$j], PATHINFO_FILENAME)) . '.' . pathinfo($files2[$j], PATHINFO_EXTENSION);
                  $newFile = $dir . "/" . strtoupper(pathinfo($files2[$j], PATHINFO_FILENAME)) . '.jpg';

                  if (trim($felulet["sajat_kod"]) != "" && $felulet["felulet_kod"] != $felulet["sajat_kod"]) {
                    $postTag = "";
                    if (strpos($newFile, "-F") !== false) {
                      $pos1 = strpos(basename($newFile), "-F");
                      $pos2 = strpos(basename($newFile), ".");
                      $postTag = substr(basename($newFile), $pos1, ($pos2-$pos1));
                    }
                    if (!SERVER_SIDE && defined("USE_SAJATKOD_AS_FILENAME") && USE_SAJATKOD_AS_FILENAME == 1) {
                      $newFile = str_replace(pathinfo($files2[$j], PATHINFO_FILENAME), $felulet["sajat_kod"] . $postTag, $newFile);
                    } else if (SERVER_SIDE) {
                      $ceg = GetClientData($felulet["ceg_id"]);
                      if (SERVER_SIDE && is_array($ceg) && isset($ceg["use_sajatkod_as_filename"]) && $ceg["use_sajatkod_as_filename"] == 1)
                        $newFile = str_replace(pathinfo($files2[$j], PATHINFO_FILENAME), $felulet["sajat_kod"] . $postTag, $newFile);
                    }
                  }
                  
                  if (!file_exists($dir)) {
                    mkdir($dir, 0777, true);
                    recurseChownChgrp(PHOTO_DIRECTORY . date("Y", $ragacsDatumAsTimeStamp) . "/" . date("m", $ragacsDatumAsTimeStamp), "www-data", "www-data");
                    chown($dir, "www-data");
                    chgrp($dir, "www-data");
                  }
                  if (file_exists($dir)) {
                    if (generateSmallImageFromFile2(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j], basename($newFile))) {
                      if (copy(TMP_DIRECTORY . basename($newFile), $newFile)) {
                        touch($newFile, filemtime(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j]));
                        $userEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: OK";
                        $adminEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: OK";
                        chown($newFile, "www-data");
                        chgrp($newFile, "www-data");
                      } else {
                        errorlog("Sikertelen masolas: " . IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j]);
                        $userEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: Sikertelen másolás!";
                        $adminEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: Sikertelen másolás!";
                      }
                    } else {
                      errorlog("Sikertelen small image generalas: " . IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j]);
                      $userEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: Sikertelen image generálás!";
                      $adminEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: Sikertelen image generálás!";
                    }
                  }
                  // kepek masolasa ftp-re
                  if ($this->conn_id != null && $this->isFtpConnected) {
                    $ragacsDatumAsTimeStamp = strtotime($felulet["ragasztas_datum"]);
                    $ragacsDatum = date("Y.m.d.", $ragacsDatumAsTimeStamp);
                    $kampanyNev = substr(removeAccent(str_replace(" ", "_", $felulet["kampany_nev"])), 0, FTP_KAMPANYNEV_LENGTH);

                    if (date("Y", $ragacsDatumAsTimeStamp) == "2017" && date("m", $ragacsDatumAsTimeStamp) == "05")
                      $ftpPath = date("Y", $ragacsDatumAsTimeStamp) . "/" . date("m", $ragacsDatumAsTimeStamp) . "/" . $felulet["kampany_id"] . "/" . $ragacsDatum;
                    else
                      $ftpPath = date("Y", $ragacsDatumAsTimeStamp) . "/" . date("m", $ragacsDatumAsTimeStamp) . "/" . $kampanyNev . "-" . $felulet["kampany_id"] . "/" . $ragacsDatum;

                    $dirExists = false;
            
                    if (!@ftp_chdir($this->conn_id, $ftpPath)) {
                      $dirExists = ftp_mkdir_($this->conn_id, $ftpPath);
                      if (@ftp_chdir($this->conn_id, $ftpPath))
                        $dirExists = true;
                    } else
                      $dirExists = true;
            
                    if ($dirExists) {
                      $contentsOnServer = ftp_nlist($this->conn_id, ".");
                      if (in_array(basename($newFile), $contentsOnServer))
                        @ftp_delete($this->conn_id, basename($newFile));
                      if (!@ftp_put($this->conn_id, basename($newFile), $newFile, FTP_BINARY)) {
                        errorlog("File feltoltese sikertelen: " . $newFile);
                        $adminEmailArr[] = "File feltoltese sikertelen: " . $newFile;
                        $ret = false;
                      }
                    } else {
                      errorlog("A mappa letrehozasa sikertelen: " . $ftpPath);
                      $adminEmailArr[] = "A mappa letrehozasa sikertelen: " . $ftpPath;
                      $ret = false;
                    }
                  }
                } else { // nincs bent az adatbazisban vagy mar le van zarva
                  $userEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: A felület nincs bent az adatbázisban!";
                  $adminEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: A felület nincs bent az adatbázisban!";
                  $faultImages[] = $files1[$i] . "/" . $files2[$j];
                }
              }
            } else {
              if ($files2[$j] != "." && $files2[$j] != "..") {
                $userEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: Csak 'jpg' kiterjesztésű állomány importálható!";
                $adminEmailArr[] = "Kép: " . $files2[$j] . "\tImportálás eredménye: Csak 'jpg' kiterjesztésű állomány importálható!";
                $faultImages[] = $files1[$i] . "/" . $files2[$j];
              }
            }
          }
        } else {
          if ($files1[$i] != "." && $files1[$i] != "..")
            unlink(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i]);
        }
      }
    }

    // adatbazisban uploadedphoto es az utolso feltoltes datuma ertekenek frissitese
    foreach ($feluletek as $felulet) {
      $ragacsDatumAsTimeStamp = strtotime($felulet["ragasztas_datum"]);
      $ragacsDatum = date("Y.m.d.", $ragacsDatumAsTimeStamp);
      $dir = PHOTO_DIRECTORY . date("Y", $ragacsDatumAsTimeStamp) . "/" . date("m", $ragacsDatumAsTimeStamp) . "/" . $felulet["kampany_id"] . "/" . $ragacsDatum . "/";

      $feluletKod = $felulet["felulet_kod"];
      $sajatKod = $felulet["sajat_kod"];

      if (file_exists($dir)) {
        $fnames = scandir($dir);
        $db = 0;
        foreach ($fnames as $fname) {
          if (($fname != '.') && ($fname != '..') && ($fname != basename($_SERVER['PHP_SELF']))) {
//            if (!is_dir($dir . "/" . $fname) && strpos(strtoupper($fname), strtoupper($feluletKod)) !== false)
            if (!is_dir($dir . "/" . $fname) && (fnmatch(strtoupper($feluletKod . ".jpg"), strtoupper(basename($fname))) !== false || fnmatch(strtoupper($feluletKod . "_J.jpg"), strtoupper(basename($fname))) !== false || fnmatch(strtoupper($feluletKod . "-F*.jpg"), strtoupper(basename($fname))) !== false || (trim($sajatKod) != "" && (fnmatch(strtoupper($sajatKod . ".jpg"), strtoupper(basename($fname))) !== false || fnmatch(strtoupper($sajatKod . "_J.jpg"), strtoupper(basename($fname))) !== false || fnmatch(strtoupper($sajatKod . "-F*.jpg"), strtoupper(basename($fname))) !== false))))
              $db++; 
          }
        }
        UpdateUploadedPhoto($felulet["ragacslist_id"], $db);
        updateFotoDatumok($felulet["ragacslist_id"]);

        // kepek feltoltese az adott ceghez is
        if (EXCHANGE_DATA && SERVER_SIDE) {
          $ragacslistId = $felulet["ragacslist_id"];
          $felulet = GetFelulet($ragacslistId);
          $ceg = GetClientData($felulet["ceg_id"]);
          if (is_array($ceg) && $ceg["local_ceg"] == 0) {
            $db = GetJobToClientsDb($ragacslistId);
            if ($db == 0) {
              $id = InsertJobToClients($ragacslistId);
              if ($id <= 0) {
                errorlog("A client job letrehozasa sikertelen: " . $ragacslistId);
                $errorArr[] = "A client job letrehozasa sikertelen: " . $ragacslistId;
              }
            }
          }
        }
      }
    }

    // fotok atmozgatasa
    if (file_exists(IMPORT_FELDOLGOZANDO_DIRECTORY)) {
      $files1 = scandir(IMPORT_FELDOLGOZANDO_DIRECTORY);
      try {
        for ($i = 0; $i < count($files1); $i++) {
          if (is_dir(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i]) && $files1[$i] != "." && $files1[$i] != "..") {
            $files2 = scandir(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i]);
            for ($j = 0; $j < count($files2); $j++) {
              if (file_exists(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j]) && $files2[$j] != "." && $files2[$j] != "..") {
                if (!file_exists(IMPORT_FELDOLGOZOTT_DIRECTORY . $files1[$i])) {
                  mkdir(IMPORT_FELDOLGOZOTT_DIRECTORY . $files1[$i], 0777, true);
                  chown(IMPORT_FELDOLGOZOTT_DIRECTORY . $files1[$i], "www-data");
                  chgrp(IMPORT_FELDOLGOZOTT_DIRECTORY . $files1[$i], "www-data");
                }
  
                rename(IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j], IMPORT_FELDOLGOZOTT_DIRECTORY . $files1[$i] . "/" . $files2[$j]);
                chown(IMPORT_FELDOLGOZOTT_DIRECTORY . $files1[$i] . "/" . $files2[$j], "www-data");
                chgrp(IMPORT_FELDOLGOZOTT_DIRECTORY . $files1[$i] . "/" . $files2[$j], "www-data");
              }
            }

            $dir = IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i];
            if (file_exists($dir)) {
              $iterator = new \FilesystemIterator($dir);
              $isDirEmpty = !$iterator->valid();      
              if ($isDirEmpty)
                rmdir($dir);
            }
          }
        }
      } catch (Exception $e) {
        $adminEmailArr[] = "Kép: " . IMPORT_FELDOLGOZANDO_DIRECTORY . $files1[$i] . "/" . $files2[$j] . "\tImportálás eredménye: $e";
      }
    }

    // fault images copy back to ftp
    if ($this->conn_id != null && $this->isFtpConnected && count($faultImages) > 0) {
      if (!@ftp_chdir($this->conn_id, FAULT_IMAGES_DIRECTORY)) {
        ftp_mkdir_($this->conn_id, FAULT_IMAGES_DIRECTORY);
      }
      if (@ftp_chdir($this->conn_id, FAULT_IMAGES_DIRECTORY)) {
        foreach ($faultImages as $faultImage) {
          $imagePathParts = pathinfo($faultImage);
          $ftpPath = FAULT_IMAGES_DIRECTORY . $imagePathParts["dirname"];
          if (!@ftp_chdir($this->conn_id, $ftpPath)) {
            $dirExists = ftp_mkdir_($this->conn_id, $ftpPath);
            if (@ftp_chdir($this->conn_id, $ftpPath))
              $dirExists = true;
          } else
            $dirExists = true;
  
          if ($dirExists) {
            if (!@ftp_put($this->conn_id, basename($faultImage), IMPORT_FELDOLGOZOTT_DIRECTORY . $faultImage, FTP_BINARY)) {
              errorlog("File feltoltese sikertelen: " . IMPORT_FELDOLGOZOTT_DIRECTORY . $faultImage);
              $adminEmailArr[] = "File feltoltese sikertelen: " . IMPORT_FELDOLGOZOTT_DIRECTORY . $faultImage;
            }
          } else {
            errorlog("A mappa letrehozasa sikertelen: " . $ftpPath);
            $adminEmailArr[] = "A mappa letrehozasa sikertelen: " . $ftpPath;
          }
        }
      }
    }

    // email to import users
    if (count($userEmailArr) > 0) {
      $body = iconv("UTF-8", "ISO-8859-2", "Importálás eredménye:\n");
      foreach ($userEmailArr as $row)
        $body .= iconv("UTF-8", "ISO-8859-2", $row) . "\n";
      if (strpos(IMPORTUSERRECIPIENTMAIL, ",") !== false) {
        $importEmails = explode(",", IMPORTUSERRECIPIENTMAIL);
        foreach ($importEmails as $importEmail) {
          mail($importEmail, IMPORTMAILSUBJECT, $body, MAILHEADER);
        }
      } else
        mail(IMPORTUSERRECIPIENTMAIL, IMPORTMAILSUBJECT, $body, MAILHEADER);
    }
    // email to admin
    if (count($adminEmailArr) > 0) {
      $body = iconv("UTF-8", "ISO-8859-2", "Importálás eredménye:\n");
      foreach ($adminEmailArr as $row)
        $body .= iconv("UTF-8", "ISO-8859-2", $row) . "\n";
      mail(RECIPIENTMAIL, IMPORTMAILSUBJECT, $body, MAILHEADER);
    }
  }
  
  function getFelulet($feluletKod, $ragasztasDatum) {
    if (strpos($feluletKod, "-F") !== false)
      $feluletKod = substr($feluletKod, 0, strpos($feluletKod, "-F"));
    else
      $feluletKod = substr($feluletKod, 0, strpos($feluletKod, "."));

    $felulet = "";

    if ($feluletKod == trim($feluletKod)) {
      $felulet = GetFeluletByFeluletKodRagasztasiDatum($feluletKod, $ragasztasDatum);
      if (!is_array($felulet))
        $felulet = GetFeluletBySajatKodRagasztasiDatum($feluletKod, $ragasztasDatum);
    }

    return $felulet;
  }

  function jpegFileIsComplete($path) {
    if (!is_resource($file = fopen($path, 'rb'))) {
      return false;
    }
    // check for the existence of the EOI segment header at the end of the file
    if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) {
      fclose($file);
      return false;
    }
    fclose($file);
    return true;
  }

  function jpegFileIsCorrupted($path) {
    return !$this->jpegFileIsComplete($path);
  }
}

$importPhotos = new ImportPhotos();

if ($importPhotos->isFtpConnected) {
  // import photos
  $importPhotos->importPhotos();

  if ($importPhotos->conn_id)
    ftp_close($importPhotos->conn_id);
  
} else {
  errorlog("Couldn't login to " . FTP_SERVER);
  sendEmail('Ftp kapcsolodas sikertelen: ' . FTP_SERVER);
}

?>
