<?php

    error_reporting(0);
    require_once("res/x5engine.php");

    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    $sectionsToCheck = array();
    $logs = array(
        "infos" => array(),
        "success" => array(),
        "errors" => array()
    );

    // Compare 2 WSX5 versions and returns:
    // 1 if current version is higher than the other
    // -1 if current version is minor than the other
    // 0 if the 2 versions are equals
    function compareVersions($versionToCompare, $currentVersion) {
        $versionToCompare = explode(".", $versionToCompare);
        $currentVersion = explode(".", $currentVersion);

        foreach ($versionToCompare as $k => $v) {
            if (!array_key_exists($k, $currentVersion))
                $currentVersion[$k] = 0;

            if ($v > $currentVersion[$k])
                return -1;
            else if ($v < $currentVersion[$k])
                return 1;
        }
        return 0;
    }

    if (!array_key_exists("databases", $imSettings) || count($imSettings["databases"]) == 0) {
        switch ($lang) {
            case "it":
                $logs["success"][] = "Nessun database configurato. Nessun aggiornamento necessario.";
                break;
            case "de":
                $logs["success"][] = "Keine konfigurierte Datenbank. Keinen Handlungsbedarf erforderlich.";
                break;
            default:
                $logs["success"][] = "No database configured. No action needed.";
                break;
        }
    }
    else {
        switch ($lang) {
            case "it":
                $cartArea = "Carrello e-commerce";
                $usersArea = "Gestione Accessi";
                break;
            case "de":
                $cartArea = "Onlineshop";
                $usersArea = "Zugangsverwaltung";
                break;
            default:
                $cartArea = "Shopping Cart";
                $usersArea = "Access Management";
                break;
        }

        // Ecommerce
        if (array_key_exists("ecommerce", $imSettings) && array_key_exists($imSettings["ecommerce"]["database"]["id"], $imSettings["databases"])) {
            $cart = new imCart();
            $cartSettings = $cart->settings;

            $sectionsToCheck[$cartArea] = array(
                "dbSettings" => $imSettings["databases"][$imSettings["ecommerce"]["database"]["id"]],
                "tables" => array(
                    $imSettings["ecommerce"]["database"]["table"] . $cartSettings["orders_table"] => array(
                        "ip" => 45,
                        "shipping_name" => 128,
                        "payment_name" => 128
                    ),
                    $imSettings["ecommerce"]["database"]["table"] . $cartSettings["products_table"] => array(
                        "option" => 128,
                        "suboption" => 128
                    ),
                    $imSettings["ecommerce"]["database"]["table"] . $cartSettings["shipping_addresses_table"] => array(
                        "label" => 128
                    ),
                    $imSettings["ecommerce"]["database"]["table"] . $cartSettings["invoice_addresses_table"] => array(
                        "label" => 128
                    )
                )
            );
        }

        // Private area
        if (array_key_exists("access", $imSettings) && array_key_exists("dbid", $imSettings["access"]) && array_key_exists($imSettings["access"]["dbid"], $imSettings["databases"])) {
            $sectionsToCheck[$usersArea] = array(
                "dbSettings" => $imSettings["databases"][$imSettings["access"]["dbid"]],
                "tables" => array(
                    $imSettings["access"]["dbtable"] => array(
                        "ip" => 45
                    )
                )
            );
        }

        if (count($sectionsToCheck) > 0 && compareVersions("17.1.2.0", $imSettings["general"]["version"]) == -1) {
            foreach ($sectionsToCheck as $sectionName => $sectionData) {
                $db = new ImDb(
                    $sectionData["dbSettings"]["host"],
                    $sectionData["dbSettings"]["user"],
                    $sectionData["dbSettings"]["password"],
                    $sectionData["dbSettings"]["database"]
                );
    
                if (!$db->testConnection()) {
                    switch ($lang) {
                        case "it":
                            $logs["errors"][] = $sectionName . ": impossibile connettersi al database \"" . $sectionData["dbSettings"]["database"] . "\". Controlla la tua configurazione.";
                            break;
                        case "de":
                            $logs["errors"][] = $sectionName . ": Keine Verbindung zur Datenbank \"" . $sectionData["dbSettings"]["database"] . "\". möglich. Kontrollieren Sie bitte Ihre Konfigurationen.";
                            break;
                        default:
                            $logs["errors"][] = $sectionName . ": cannot connect to database \"" . $sectionData["dbSettings"]["database"] . "\". Check your configuration.";
                            break;
                    }
                }
                else {
                    $sectionTablesNeedUpdate = false;
                    foreach ($sectionData["tables"] as $tableName => $fields) {
                        if ($db->tableExists($tableName)) {
                            $query = "SHOW COLUMNS FROM `" . $sectionData["dbSettings"]["database"] . "`.`" . $tableName . "`";
                            $columns = $db->query($query);
                            $tableNeedUpdate = false;
                            if ($columns) {
                                foreach ($columns as $c) {
                                    if (array_key_exists($c["Field"], $fields)) {
                                        $currentLenght = substr(substr($c["Type"], strpos($c["Type"], "(") + 1), 0, -1);
                                        $desiredLength = $fields[$c["Field"]];
                                        if ($currentLenght != $desiredLength) {
                                            $tableNeedUpdate = true;
                                            if (!$sectionTablesNeedUpdate) {
                                                switch ($lang) {
                                                    case "it":
                                                        $logs["infos"][] = $sectionName . ": le tabelle del database sono state aggiornate!";
                                                        break;
                                                    case "de":
                                                        $logs["infos"][] = $sectionName . ": Die Datenbanktabellen wurden aktualisiert!";
                                                        break;
                                                    default:
                                                        $logs["infos"][] = $sectionName . ": database tables updated!";
                                                        break;
                                                }
                                                $sectionTablesNeedUpdate = true;
                                            }
                                        }
                                    }
                                }
                            }
                            if ($tableNeedUpdate) {
                                foreach ($fields as $fieldName => $lenght) {
                                    $query = "ALTER TABLE `" . $sectionData["dbSettings"]["database"] . "`.`" . $tableName . "` MODIFY COLUMN `" . $fieldName . "` VARCHAR(" . $lenght . ") NOT NULL";
                                    $res = $db->query($query);
                                    if ($res === false) {
                                        switch ($lang) {
                                            case "it":
                                                $logs["errors"][] = $sectionName . ": impossibile aggiornare il database \"" . $sectionData["dbSettings"]["database"] . "\". Controlla la tua configurazione.";
                                                break;
                                            case "de":
                                                $logs["errors"][] = $sectionName . ": Aktualisierung der Datenbank fehlgeschlagen \"" . $sectionData["dbSettings"]["database"] . "\". möglich. Kontrollieren Sie bitte Ihre Konfigurationen.";
                                                break;
                                            default:
                                                $logs["errors"][] = $sectionName . ": cannot update database \"" . $sectionData["dbSettings"]["database"] . "\". Check your configuration.";
                                                break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                $db->closeConnection();
            }
        }
        if (count($logs["errors"]) == 0) {
            switch ($lang) {
                case "it":
                    $logs["success"][] = "Il tuo database è aggiornato.";
                    break;
                case "de":
                    $logs["success"][] = "Ihre Datenbank ist auf dem neuesten Stand.";
                    break;
                default:
                    $logs["success"][] = "Your database is up-to-date.";
                    break;
            }
        }
    }

?>

<!DOCTYPE html>
<html>
<head>
    <title>Website X5</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            margin-top: 20px;
        }
        div {
            width: 50%;
            padding: 10px 20px;
            border: 1px solid transparent;
            margin-bottom: 5px;
            margin: 0 auto 10px auto;
            font-family: Arial, sans-serif;
            font-size: 14px;
            line-height: 25px;
        }
        div span {
            font-size: 25px;
            vertical-align: middle;
            display: inline-block;
            width: 40px;
        }
        .info {
            color: #004085;
            background-color: #cce5ff;
            border-color: #b8daff;
        }
        .success {
            color: #155724;
            background-color: #d4edda;
            border-color: #c3e6cb;
        }
        .error {
            color: #721c24;
            background-color: #f8d7da;
            border-color: #f5c6cb;
        }
    </style>
</head>
<body>
    <?php
        foreach ($logs["infos"] as $log) {
            echo "<div class=\"info\"><span>&#8505;</span>" . $log . "</div>";
        }
        foreach ($logs["success"] as $log) {
            echo "<div class=\"success\"><span>&#10004;</span>" . $log . "</div>";
        }
        foreach ($logs["errors"] as $log) {
            echo "<div class=\"error\"><span>&#10006;</span>" . $log . "</div>";
        }
    ?>
</body>
</html>