function generateArchive($themeName, $userThemeName = '', $includeThemler = true)
{
    register_shutdown_function('fatalErrorShutdownHandler');
    $themeDir = FilesHelper::normalizePath(getThemeDir($themeName));
    if (!file_exists($themeDir)) {
        die('Error : No Theme Folder');
    }
    $userThemeName = $userThemeName ? $userThemeName : $themeName;
    $uniqid = uniqid();
    $base_upload_dir = get_base_upload_dir() . '/' . $uniqid;
    $user_template_dir = $base_upload_dir . '/' . $userThemeName;
    FilesHelper::copyRecursive($themeDir, $user_template_dir);
    if (!$includeThemler) {
        $dirs = array('export', 'project');
        clearDirs($user_template_dir, $dirs);
    }
    $previewThemeDir = FilesHelper::normalizePath(getThemeDir($themeName . _PREVIEW_SUFFIX_));
    $archiveName = 'theme_' . uniqid(time()) . '.zip';
    $archiveFile = $base_upload_dir . '/' . $archiveName;
    $archive = new PclZip($archiveFile);
    add_version_folders($archive, $base_upload_dir, $user_template_dir, $previewThemeDir, $userThemeName, $includeThemler);
    add_files_to_archive_root($archive, $base_upload_dir, $user_template_dir, $previewThemeDir, $userThemeName);
    // Temporary fix to support Prestashop Cloud Install
    deleteFromArchive($archive, 'modules/designer/override/controllers/admin/AdminLoginController.php');
    if (is_readable($archiveFile)) {
        $archiveContent = array('ext' => 'zip', 'content' => base64_encode(FilesHelper::readFile($archiveFile)));
        FilesHelper::removeDir($base_upload_dir, true);
        return $archiveContent;
    }
    die('Archive file: ' . $archiveFile . ' is not readable');
}
function getThemeArchive($themeName, $userThemeName, $includeThemler)
{
    $themeDir = FilesHelper::normalizePath(getThemeDir($themeName));
    if (!file_exists($themeDir)) {
        die('Error : No Theme Folder');
    }
    $userThemeName = $userThemeName ? $userThemeName : $themeName;
    $base_upload_dir = get_base_upload_dir();
    $user_template_dir = $base_upload_dir . '/' . $userThemeName;
    FilesHelper::copyRecursive($themeDir, $user_template_dir);
    if (!$includeThemler) {
        $dirs = array('export', 'project');
        clearDirs($user_template_dir, $dirs);
    }
    $previewThemeDir = FilesHelper::normalizePath(getThemeDir($themeName . _PREVIEW_SUFFIX_));
    $archive_name = 'theme_' . uniqid(time()) . '.zip';
    $archive_file = $base_upload_dir . '/' . $archive_name;
    $archive = new PclZip($archive_file);
    add_version_folders($archive, $base_upload_dir, $user_template_dir, $previewThemeDir, $userThemeName, $includeThemler);
    add_files_to_archive_root($archive, $base_upload_dir, $user_template_dir, $previewThemeDir, $userThemeName);
    // Temporary fix to support Prestashop Cloud Install
    deleteFromArchive($archive, 'modules/designer/override/controllers/admin/AdminLoginController.php');
    FilesHelper::removeDir($user_template_dir, true);
    return $archive_file;
}
function uploadTheme($themeName, $filename, $tmp_path)
{
    $uniqid = uniqid();
    $sandbox = FilesHelper::normalizePath(_PS_CACHE_DIR_ . 'sandbox' . DIRECTORY_SEPARATOR . $uniqid) . '/';
    $uploadDir = $sandbox . ThemeInstallHelper::UPLOADED_THEME_DIR_NAME;
    // used in AdminThemesController
    $base_path = $uploadDir . '.zip';
    FilesHelper::createDir($sandbox);
    FilesHelper::renameFile($tmp_path, $base_path);
    $archive = new PclZip($base_path);
    deleteFromArchive($archive, 'modules', true);
    // We upload new theme, not modules to save module functionality
    $helper = new ThemeInstallHelper();
    if ($helper->install($base_path, $sandbox)) {
        $result = array('status' => 'done', 'path' => $base_path);
    } else {
        $themesDir = $uploadDir . '/themes';
        $files = FilesHelper::enumerate($themesDir, false);
        // not enumerateFiles method with directory checking
        if (count($files) === 1 && is_dir($files[0]['path'])) {
            $themeName = str_replace("{$themesDir}/", '', $files[0]['path']);
        }
        if ($themeName && ($theme = Theme::getByDirectory($themeName)) && is_file($uploadDir . '/Config.xml')) {
            $themeDir = $themesDir . '/' . $themeName;
            $previewThemeDir = $themeDir . '/' . $themeName . _PREVIEW_SUFFIX_;
            $newThemeName = checkThemeName($themeName);
            $newThemeDir = $themesDir . '/' . $newThemeName;
            $newThemePreviewDir = $themeDir . '/' . $newThemeName . _PREVIEW_SUFFIX_;
            // 1. rename inner preview folder
            processRename($themeDir, $previewThemeDir, $newThemeDir, $newThemePreviewDir, $newThemeName);
            $newThemePreviewDir = $newThemeDir . '/' . $newThemeName . _PREVIEW_SUFFIX_;
            // 2. now preview folder is correct
            FilesHelper::deleteFile($uploadDir . '/Config.xml');
            FilesHelper::copyFile($newThemePreviewDir . '/designer/Export/Config.xml', $uploadDir . '/Config.xml');
            unset($archive);
            FilesHelper::deleteFile($base_path);
            $archive = new PclZip($base_path);
            addToArchive($archive, $uploadDir, $uploadDir);
            $helper = new ThemeInstallHelper();
            // new object with no errors
            if ($helper->install($base_path, $sandbox)) {
                $result = array('status' => 'done', 'path' => $base_path);
            } else {
                $result = array('status' => 'error', 'errors' => Tools::jsonEncode($helper->getErrors()));
            }
        } else {
            $result = array('status' => 'error', 'errors' => 'Please make sure, that you have selected a valid PrestaShop theme.');
        }
    }
    return $result;
}