<?php

// Librairie de fonctions MYSQL
// Fonction pour afficher les erreurs SQL
function afficheMessage($message) {
    return "<div style='color:#ff0000; margin-bottom:25px;'>" . $message . "</div>";
}

// Fonction de connexion globale au moteur Mysql
function getConnectionMysql($hote, $db, $usager, $motdepasse) {
    $connection = mysqli_connect($hote, $usager, $motdepasse, $db);
    if (!$connection) {
        die(mysqli_connect_error());
    }
    return $connection;
}

// Fonction de connexion à la bd de travail
// Si vide, connexion principale
// princiaple = connexion à la bd de travail
// validationlogin = connexion à la bd des utilisateurs
function setConnectionSql($typeconn = 'travail') {
    $usager = $_ENV["SQL_USER"];
    $motdepasse = $_ENV["SQL_PW"];

    if ($typeconn == 'travail') {
        $db = "dbogrdax2q4gaw";
    } elseif ($typeconn == 'maitre') {
        $db = "dbjfsfkukkmfd6";
    }

    $hote = "localhost";

    global $connection;
    global $lastConnection;
    $connection = getConnectionMysql($hote, $db, $usager, $motdepasse);
    $lastConnection = $typeconn;
    return $connection;
}

// Fonction de construction d'une requête SQL
// Recoit des paramètres SQL (table, join, etc)
// Retourne un tableau de résultats
// Debug=1 (minimal)
// Debug=2 (complet)
function executerRequeteSql($paramsql) {
    //Connexion par défaut
    if (!isset($paramsql["connexion"])) {
        $paramsql["connexion"] = "travail";
    }

    if (isset($paramsql["mode"]) && $paramsql["mode"] === "direct") {
        $sql = $paramsql["sql"];
    } else {

        //Type de requête par défaut
        if (!isset($paramsql["type"])) {
            $paramsql["type"] = "SELECT";
        }

        // Au moins, une table est requise pour la requête SQL
        if (empty($paramsql["table"])) {
            echo "Une table est requise au minimum.";
            die;
        }

        // Est-ce qu'il y a des jointures à effectuer pour établir des relations
        // entre plusieurs tables pour la requête SQL
        if (isset($paramsql["join"])) {
            if (count($paramsql["table"]) == 1 && count($paramsql["join"]) == 0) {
                $table = $paramsql["table"][0];
            } elseif (count($paramsql["table"]) == count($paramsql["join"]) + 1) {
                $parenth = str_repeat("(", count($paramsql["join"]));
                $table = $paramsql["table"][0];
                for ($x = 0; $x < count($paramsql["join"]); $x++) {
                    if ($x < count($paramsql["join"])) {
                        unset($conditionjoin);
                        if (is_array($paramsql["join"][$x])) {
                            $conditionjoin = array_slice($paramsql["join"][$x], 0, 1, false);
                            switch (strtolower($conditionjoin[0])) {
                                case "left":
                                    $conditionjoin = " LEFT ";
                                    break;
                                case "right":
                                    $conditionjoin = " RIGHT ";
                                    break;
                                default:
                                    $conditionjoin = "INNER ";
                                    break;
                            }
                        } else {
                            $conditionjoin = "INNER ";
                        }
                    }
                    $table .= " $conditionjoin JOIN " . $paramsql["table"][$x + 1] . " ";

                    if ($x < count($paramsql["join"])) {
                        if (is_array($paramsql["join"][$x])) {
                            $table .= " ON " . $paramsql["join"][$x][1];
                        } else {
                            $table .= " ON " . $paramsql["join"][$x];
                        }
                    }
                    if (count($paramsql["join"]) > 0) {
                        $table .= ") ";
                    }
                }
                $table = $parenth . $table;
            }
        } else {
            $table = $paramsql["table"][0];
        }

        if (isset($paramsql["debug"]) && $paramsql["debug"] == 2) {
            echo "table:" . $table . "<br>\n";
        }

        // Ajout des champs personnalisés
        $a = 0;
        $champs = "";
        if (isset($paramsql["champs"])) {
            if (count($paramsql["champs"]) > 0) {
                foreach ($paramsql["champs"] as $clef => $xchamps) {
                    if ($paramsql["type"] == "SELECT") {
                        $champs .= ( ($a == 0) ? "" : ",") . $xchamps;
                    } elseif ($paramsql["type"] == "UPDATE") {
                        $champs .= ( ($a == 0) ? "" : ",") . $clef . "=" . $xchamps;
                    } elseif ($paramsql["type"] == "INSERT") {
                        $champs .= ( ($a == 0) ? "" : ",") . $clef . "=" . $xchamps;
                    }
                    $a++;
                }
            } else {
                $champs = $paramsql["champs"];
            }
        } else {
            $champs = "*";
        }
        if (isset($paramsql["debug"]) && $paramsql["debug"] == 2) {
            echo "champs:" . $champs . "<br>\n";
        }

        // Ajout des conditions
        $b = 0;
        unset($xchamps);
        $condition = "";
        if (isset($paramsql["where"])) {
            if (is_array($paramsql["where"])) {
                foreach ($paramsql["where"] as $clef => $xchamps) {
                    if ($b == 0) {
                        $condition = "WHERE ";
                        $car = "";
                    } else {
                        $car = " AND ";
                    }
                    $condition .= $car . $xchamps;
                    $b++;
                }
            } else {
                $condition = "WHERE " . $paramsql["where"];
            }
        }
        if (isset($paramsql["debug"]) && $paramsql["debug"] == 2) {
            print "condition:" . $condition . "<br>\n";
        }

        // Ajout du ou des tris pour la requête
        $c = 0;
        unset($xchamps);
        $tri = "";
        if (isset($paramsql["ordre"])) {
            if (is_array($paramsql["ordre"])) {
                foreach ($paramsql["ordre"] as $clef => $xchamps) {
                    if ($c == 0) {
                        $tri = " ORDER BY ";
                        $car = "";
                    } else {
                        $car = ",";
                    }
                    $tri .= $car . $xchamps;
                    $c++;
                }
            } else {
                $tri = " ORDER BY " . $paramsql["ordre"];
            }
        }
        if (isset($paramsql["debug"]) && $paramsql["debug"] == 2 && $tri) {
            echo "tri:" . $tri . "<br>\n";
        }

        // Clause Group By
        $d = 0;
        $groupe = "";
        if (isset($paramsql["groupe"])) {
            if (is_array($paramsql["groupe"])) {
                foreach ($paramsql["groupe"] as $clef => $xgroupes) {
                    if ($d == 0) {
                        $groupe = " GROUP BY ";
                        $car = "";
                    } else {
                        $car = ",";
                    }
                    $groupe .= $car . $xgroupes;
                    $d++;
                }
            } else {
                $groupe = " GROUP BY " . $paramsql["groupe"];
            }
        }
        if (isset($paramsql["debug"]) && $paramsql["debug"] == 2 && $tri) {
            echo "groupe:" . $groupe . "<br>\n";
        }

        // Limite SQL
        $limite = "";
        if (isset($paramsql["limite"])) {
            $limite = "LIMIT " . $paramsql["limite"];
        }
        if (isset($paramsql["debug"]) && $paramsql["debug"] == 2 && $limite) {
            echo "limite:" . $limite . "<br>\n";
        }

        // Préparation de la requête SQL
        $sql = "";
        switch ($paramsql["type"]) {
            case "SELECT":
                $sql2 = "";
                if (isset($paramsql["compte"])) {
                    $compte = $paramsql["compte"];
                    $sql2 = sprintf("SELECT count(%s) as compte FROM %s %s", $compte, $table, $condition);
                }
                $sql = sprintf("SELECT %s FROM %s %s %s %s %s", $champs, $table, $condition, $groupe, $tri, $limite);
                break;
            case "UPDATE":
                $sql = sprintf("UPDATE %s SET %s %s", $table, $champs, $condition);
                break;
            case "INSERT":
                $sql = sprintf("INSERT INTO %s SET %s %s", $table, $champs, $condition);
                break;
        }
    }

    // Connexion à la BD
    if (isset($paramsql["connexion"])) {
        $connection = setConnectionSql($paramsql["connexion"]);
    } else {
        $connection = setConnectionSql("travail");
    }

    if (isset($paramsql["debug"])) {
        if ($paramsql["debug"] >= 1) {
            print $sql . "\n<br>";
        }
    } else {
        $paramsql["debug"] = 0;
    }

    //Défini l'ensemble de jeu de caractères à UTF-8
    if ($paramsql["type"] == "SELECT") {
        mysqli_query($connection, "SET NAMES 'utf8'");
        mysqli_query($connection, "SET CHARACTER SET utf8");
    } else {
        mysqli_set_charset($connection, 'utf8');
    }

    if (isset($paramsql["connexion"]) || $paramsql["connexion"] != "travail") {
        $result = mysqli_query($connection, "SET SQL_BIG_SELECTS=1");
        if (!$result) {
            die("Error " . mysqli_error());
        }
        unset($result);
    }
    $result = mysqli_query($connection, "$sql");

    if (!$result) {
        print mysqli_errno($connection) . " / " . mysqli_error($connection) . "<br>";
        die(afficheMessage("Erreur SQL $sql"));
    }

    if (isset($paramsql["compte"])) {
        $result2 = mysqli_query($connection, "$sql2");
        $ligne2 = mysqli_fetch_array($result2, MYSQLI_ASSOC);
    }

    switch ($paramsql["type"]) {
        case "UPDATE":
            return $result;
        case "INSERT":
            return mysqli_insert_id($connection);
        default:
            // Requête de sélection
            // Construction du tableau de données
            if ($result) {
                $tableauresultats = array();

                while ($ligne = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
                    if (isset($paramsql["compte"])) {
                        $ligne["compte"] = $ligne2["compte"];
                    }
                    $tableauresultats[] = $ligne;
                }
                if (isset($paramsql["debug"])) {
                    if ($paramsql["debug"] >= 1) {
                        print "<br><br>Nombre de résultats : " . count($tableauresultats) . "<br><br>";
                    }
                    if ($paramsql["debug"] == 2) {
                        var_dump($tableauresultats);
                    }
                }
                mysqli_free_result($result);
                // Retour des données
                return $tableauresultats;
            } else {
                if (isset($paramsql["debug"]) && $paramsql["debug"] == 2) {
                    $erreur = mysqli_errno();
                    $erreurmsg = mysqli_error();
                    if ($erreur != 0) {
                        echo $erreurmsg;
                        die;
                    }
                } else {
                    return null;
                }
            }
            break;
    }
}

// Fais la mise à jour des infos utilisateur
function updateSessionUtilisateur($page, $action) {
    // Une session existe ?
    if (session_id() != "" && !empty($_SESSION["utilisateur"]) && !empty($_SESSION["adressecourriel"])) {

        //Requêtes mySQL pour établir la validation.
        $sqlparam["connexion"] = "maitre";
        $sqlparam["table"][] = "administration";
        $sqlparam["where"][] = sprintf("utilisateur = '%s'", addslashes($_SESSION["utilisateur"]));
        $sqlparam["where"][] = sprintf("email = '%s'", addslashes($_SESSION["adressecourriel"]));
        $sqlparam["limite"] = 1;
        $result = executerRequeteSql($sqlparam);
        if ($result && $result[0]["acces"] == 0) {
            unset($sqlparam);
            $sqlparam["connexion"] = "maitre";
            $sqlparam["type"] = "UPDATE";
            $sqlparam["table"][] = "administration";
            $sqlparam["where"][] = sprintf("utilisateur = '%s'", addslashes($_SESSION["utilisateur"]));
            $sqlparam["where"][] = sprintf("email = '%s'", addslashes($_SESSION["adressecourriel"]));
            $sqlparam["champs"]["dern_acces"] = "'" . date("Y-m-d H:i:s") . "'";
            $sqlparam["champs"]["essais"] = 0;
            $sqlparam["champs"]["enligne"] = 1;
            executerRequeteSql($sqlparam);

            ajoutHistoriquePage(addslashes($_SESSION["noutilisateur"]), $page, $action);
        } elseif ($page != "validation.php") {
            fermeSessionUtilisateur(-10);
        }
    } else {
        fermeSessionUtilisateur();
    }
}

// Ajout de l'action dans l'historique
function ajoutHistoriquePage($utilisateur, $page, $action) {
    $sqlparam["connexion"] = "maitre";
    $sqlparam["type"] = "INSERT";
    $sqlparam["table"][] = "historique_page";
    $sqlparam["champs"]["noutilisateur"] = sprintf("%d", $utilisateur);
    $sqlparam["champs"]["page"] = sprintf("'%s'", $page);
    $sqlparam["champs"]["action"] = sprintf("'%s'", $action);
    executerRequeteSql($sqlparam);
}
