<?php

/*
 * Duplicator Website Installer
 * Copyright (C) 2018, Snap Creek LLC
 * website: snapcreek.com
 *
 * Duplicator (Pro) Plugin is distributed under the GNU General Public License, Version 3,
 * June 2007. Copyright (C) 2007 Free Software Foundation, Inc., 51 Franklin
 * St, Fifth Floor, Boston, MA 02110, USA
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// Prevent direct access in wordpress install
$disabledDirs = array(
    '/installer/dup-installer',
    '/backups-dup-lite',
    '/wp-snapshots'
);
$currentDir   = str_replace('\\', '/', dirname(__FILE__));
foreach ($disabledDirs as $disableDir) {
    if (strpos($currentDir, $disableDir) === (strlen($currentDir) - strlen($disableDir))) {
        exit;
    }
}

if (!defined('DUPXABSPATH')) {
    define('DUPXABSPATH', dirname(__FILE__));
}

define('DUPX_VERSION', '1.5.11.1');
define('DUPX_INIT', str_replace('\\', '/', dirname(__FILE__)));
define('DUPX_ROOT', preg_match('/^[\\\\\/]?$/', dirname(DUPX_INIT)) ? '/' : dirname(DUPX_INIT));

use Duplicator\Installer\Utils\Log\Log;
use Duplicator\Libs\Snap\SnapUtil;

require_once(DUPX_INIT . '/src/Utils/Autoloader.php');
Duplicator\Installer\Utils\Autoloader::register();

try {
    /**
     * init constants and include
     */
    Duplicator\Installer\Core\Bootstrap::init();
    Log::setThrowExceptionOnError(true);
    Log::logTime('INIT END', Log::LV_DETAILED);

    // if is ajax always die in controller
    DUPX_Ctrl_ajax::controller();
} catch (Exception $ex) {
    Log::logException($ex, Log::LV_DEFAULT, 'EXCEPTION ON INIT: ');
    dupxTplRender('page-boot-error', array(
        'message' => $ex->getMessage(),
        'trace'   => $ex->getTraceAsString()
    ));
    die();
}

ob_start();
try {
    $controller     = DUPX_CTRL::getInstance();
    $exceptionError = false;
    // Log::error thotw an exception
    Log::setThrowExceptionOnError(true);
    Log::logTime('CONTROLLER START', Log::LV_DETAILED);

    $controller->mainController();
} catch (Exception $e) {
    SnapUtil::obCleanAll(false);
    $controller->setExceptionPage($e);
}

/**
 * clean output
 */
$unespectOutput = trim(ob_get_clean());
ob_end_clean();
if (!empty($unespectOutput)) {
    Log::info('ERROR: Unespect output ' . Log::v2str($unespectOutput));
    $exceptionError = new Exception('Unespected output ' . Log::v2str($unespectOutput));
    $controller->setExceptionPage($exceptionError);
}

ob_start();
try {
    echo $controller->renderPage();
} catch (Exception $e) {
    SnapUtil::obCleanAll(false);
    ob_end_clean();
    $controller->setExceptionPage($e);
    echo $controller->renderPage();
}
