<?php

include_once __DIR__.'/../core.php';

$updateRate = 20;
$scriptValue = $updateRate * 5;

/*
* Aggiornamento tramite AJAX
*/
if (filter('action') == 'do_update') {
    // Aggiornamento in progresso
    if (Update::isUpdateAvailable()) {
        $update = Update::getUpdate();

        $result = Update::doUpdate($updateRate);

        if (!empty($result)) {
            // Aggiunta del messaggio generico riguardante l'aggiornamento
            echo '
        <script>
            addVersion("'.$update['version'].'");
        </script>';

            if (is_array($result)) {
                // Aggiunta del messaggio riguardante la conclusione dell'aggiornamento del database
                if (!empty($update['sql']) && $result[1] == $result[2]) {
                    echo '
        <script>
            $("#progress .info").html($("#progress .info").html() + "<p>&nbsp;&nbsp;&nbsp;&nbsp;<i class=\"fa fa-check\"></i> '.tr('Aggiornamento del database (_FILENAME_)', [
                '_FILENAME_' => '<i>'.$update['filename'].'.sql</i>',
            ]).'</p>");
        </script>';
                }

                $rate = $result[1] - $result[0];
            } elseif (!empty($update['script'])) {
                // Aggiunta del messaggio riguardante la conclusione dello script
                echo '
        <script>
            $("#progress .info").html($("#progress .info").html() + "<p>&nbsp;&nbsp;&nbsp;&nbsp;<i class=\"fa fa-check\"></i> '.tr('Esecuzione dello script di aggiornamento (_FILENAME_)', [
                '_FILENAME_' => '<i>'.$update['filename'].'.php</i>',
            ]).'</p>");
        </script>';

                $rate = $scriptValue;
            }

            // Aumento della percentuale di completamento totale
            if (!empty($rate)) {
                echo '
        <script>
            addProgress('.$rate.');
        </script>';
            }

            echo '
        <script>
            $("#result").load("index.php?action=do_update&firstuse='.$_GET['firstuse'].'");
        </script>';
        } else {
            // Fallimento
            echo '
            <div class="alert alert-danger">
                <i class="fa fa-times"></i> '.tr("Errore durante l'esecuzione dell'aggiornamento alla versione _VERSION_", [
                    '_VERSION_' => $update['version'],
                ]).'
            </div>';
        }
    }
    // Aggiornamento completato
    elseif (Update::isUpdateCompleted()) {
        Update::updateCleanup();

        echo '
        <p><strong>'.tr('Aggiornamento completato!!!').'</strong> <i class="fa fa-smile-o"></i></p>';

        // Rimostro la finestra di login
        echo '
        <script>
            $(".login-box").fadeIn();
        </script>';

        // Istruzioni per la prima installazione
        if ($_GET['firstuse'] == 'true') {
            if (!empty($_SESSION['osm_password'])) {
                $password = $_SESSION['osm_password'];
            } else {
                $password = 'admin';
            }

            echo '
        <p>'.tr('Puoi procedere al login con i seguenti dati').':</p>
        <p>'.tr('Username').': <i>admin</i></p>
        <p>'.tr('Password').': <i> '.$password.'</i></p>
        <p class="text-danger">'.tr("E' fortemente consigliato rimuovere i permessi di scrittura dal file _FILE_", [
            '_FILE_' => '<b>config.inc.php</b>',
        ]).'.</p>';

            // Imposto la password di admin che l'utente ha selezionato all'inizio
            if (isset($_SESSION['osm_password'])) {
                $dbo->query('UPDATE `zz_users` SET `password`='.prepare(Auth::hashPassword($password))." WHERE `username`='admin'");

                unset($_SESSION['osm_password']);
            }

            if (isset($_SESSION['osm_email'])) {
                if (!empty($_SESSION['osm_email'])) {
                    $dbo->query('UPDATE `zz_users` SET `email`='.prepare($_SESSION['osm_email'])." WHERE `username`='admin' ");
                }
                unset($_SESSION['osm_email']);
            }
        }
    }

    exit();
} elseif (Update::isUpdateAvailable()) {
    // Controllo se l'aggiornamento รจ in esecuzione
    if (Update::isUpdateLocked() && filter('force') === null) {
        $pageTitle = tr('Aggiornamento in corso!');

        if (file_exists($docroot.'/include/custom/top.php')) {
            include_once $docroot.'/include/custom/top.php';
        } else {
            include_once $docroot.'/include/top.php';
        }

        echo '
        <div class="box box-center box-danger box-solid text-center">
            <div class="box-header with-border">
                <h3 class="box-title">'.tr('Aggiornamento in corso!').'</h3>
            </div>
            <div class="box-body">
                <p>'.tr("E' attualmente in corso la procedura di aggiornamento del software, e pertanto siete pregati di attendere fino alla sua conclusione").'.</p>
                <p>'.tr("Nel caso il problema persista, rivolgersi all'amministratore o all'assistenza ufficiale").'.</p>
                <a class="btn btn-info" href="'.$rootdir.'/index.php"><i class="fa fa-repeat"></i> '.tr('Riprova').'</a>
            </div>
        </div>';

        if (file_exists($docroot.'/include/custom/bottom.php')) {
            include_once $docroot.'/include/custom/bottom.php';
        } else {
            include_once $docroot.'/include/bottom.php';
        }

        exit();
    }

    $firstuse = !$dbo->isInstalled() ? 'true' : 'false';

    $button = !$dbo->isInstalled() ? tr('Installa!') : tr('Aggiorna!');
    $pageTitle = !$dbo->isInstalled() ? tr('Installazione') : tr('Aggiornamento');

    if (file_exists($docroot.'/include/custom/top.php')) {
        include_once $docroot.'/include/custom/top.php';
    } else {
        include_once $docroot.'/include/top.php';
    }

    echo '
        <div class="box box-center-large box-warning text-center">
            <div class="box-header with-border">
                <h3 class="box-title">'.(!$dbo->isInstalled() ? tr('Installazione') : tr('Aggiornamento')).'</h3>
            </div>
            <div class="box-body">';
    if (!$dbo->isInstalled()) {
        echo '
                <p><strong>'.tr("E' la prima volta che avvii OpenSTAManager e non hai ancora installato il database").'.</strong></p>';
    } else {
        echo '
                <p>'.tr("E' necessario aggiornare il database a una nuova versione").'.</p>';
    }
    echo '
                <p>'.tr("Premi il tasto _BUTTON_ per procedere con l'".(!$dbo->isInstalled() ? tr('installazione') : tr('aggiornamento')).'!', [
                    '_BUTTON_' => '<b>"'.$button.'"</b>',
                ]).'</p>
                <input type="button" class="btn btn-primary" value="'.$button.'" onclick="continue_update()" id="contine_button">

                <script>
                function continue_update(){
                    swal({
                        title: "'.(!$dbo->isInstalled() ? tr('Procedere con l\'installazione?') : tr('Procedere l\'aggiornamento?')).'",
                        text: "",
                        type: "warning",
                        showCancelButton: true,
                        confirmButtonClass: "btn btn-lg btn-success",
                        confirmButtonText: "'.tr('Procedi').'",
                    }).then(
                    function(){
                        $("#progress").show();
                        $("#result").load("index.php?action=do_update&firstuse='.$firstuse.'");
                        $("#contine_button").remove();
                    }, function(){});
                }
                </script>

                <div id="progress">
                    <div class="progress">
                        <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">
                            <span>0%</span>
                        </div>
                    </div>
                    <hr>
                    <div class="box box-info text-center collapsed-box">
                        <div class="box-header with-border">
                            <h3 class="box-title"><a class="clickable" data-widget="collapse">'.tr('Log').'</a></h3>
                            <div class="box-tools pull-right">
                                <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button>
                            </div>
                        </div>
                        <div class="box-body info text-left"></div>
                    </div>
                </div>
                <div id="result"></div>';

    $total = 0;
    $updates = Update::getTodos();

    foreach ($updates as $update) {
        if ($update['sql'] && (!empty($update['done']) || is_null($update['done']))) {
            $queries = readSQLFile(DOCROOT.$update['directory'].$update['filename'].'.sql', ';');
            $total += count($queries);

            if (intval($update['done']) > 1) {
                $total -= intval($update['done']) - 2;
            }
        }

        if ($update['script']) {
            $total += $scriptValue;
        }
    }

    echo '
                <script>
                    $(document).ready(function(){
                        $(".login-box").fadeOut();

                        count = '.count($updates).';
                        current = 0;
                        versions = [];

                        progress = 0;
                        total = '.$total.';
                    });

                    function addProgress(rate){
                        progress += rate;
                        percent = progress / total * 100;
                        percent = Math.round(percent);
                        percent = percent > 100 ? 100 : percent;

                        $("#progress .progress-bar").width(percent + "%");
                        $("#progress .progress-bar span").text(percent + "%");
                    }

                    function addVersion(version){
                        if(versions.indexOf(version) === -1){
                            versions.push(version);
                            current += 1;

                            $("#progress .info").html($("#progress .info").html() + "<p><strong>'.tr('Aggiornamento _DONE_ di _TODO_ (_VERSION_)', [
                                '_DONE_' => '" + current + "',
                                '_TODO_' => '" + count + "',
                                '_VERSION_' => '" + version + "',
                            ]).'</strong></p>");
                        }
                    }
                </script>
            </div>
        </div>';
}