<?php
$dbroot = __DIR__ . "/../db/";
define("JETTYDB", "sqlite:" . $dbroot . "jetty.sqlite");
define("ERRJETTYDB", "sqlite:" . __DIR__ . "/../bd/jetty.sqlite");
define("RASTDB", "sqlite:" . $dbroot . "rasmussteen.sqlite");

function create_session()
{
    $name = substr(preg_replace("/[^a-z\d]/i", "", __DIR__), -30);
    session_name($name);
    session_start();
}

function destroy_session()
{
    $_SESSION = array();
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(
            session_name(),
            '',
            time() - 42000,
            $params["path"],
            $params["domain"],
            $params["secure"],
            $params["httponly"]
        );
    }
    session_destroy();
}

function get_page($pageArr)
{
    $page = isset($_GET["page"]) ? $_GET["page"] : "me";
    if (array_key_exists($page, $pageArr)) {
        return array("id" => $page, "file" => "pages/$page.php", "title" => $pageArr[$page]);
    } else {
        return array("id" => "404", "file" => "pages/404.php", "title" => "404");
    }
}

function get_subpage($path, $pageArr)
{
    $subpage = isset($_GET["subpage"]) ? $_GET["subpage"] : "intro";
    if (array_key_exists($subpage, $pageArr)) {
        return array("id" => $subpage, "file" => "$path/$subpage.php", "title" => $pageArr[$subpage]);
    } else {
        return array("id" => "404", "file" => "pages/404.php", "title" => "404");
    }
}

function get_style($styleArr)
{
    if (isset($_POST["style"])) {
        $_SESSION["style"] = $_POST["style"];
    }
    if (isset($_GET["style"])) {
        $_SESSION["style"] = $_GET["style"];
    }
    $style = isset($_SESSION["style"]) ? $_SESSION["style"] : "default";

    if (array_key_exists($style, $styleArr)) {
        return array("id" => $style, "file" => $styleArr[$style]);
    } else {
        return array("id" => "default", "file" => $styleArr["default"]);
    }
}

function get_usagedata()
{
    return array(
        "files" => count(get_included_files()),
        "memory" => round(memory_get_peak_usage(true) / pow(10, 6), 1),
        "time" => round((microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000, 3)
    );
}

function create_navbar($pageArr, $pageId)
{
    $navButtons = "";
    foreach ($pageArr as $id => $name) {
        $class = $pageId == $id ? "class=\"selected\"" : "";
        $navButtons .= "<a $class href=\"?page=$id\">$name</a>";
    }
    return $navButtons;
}

function create_subnavbar($parent, $pageArr, $pageId)
{
    $navButtons = "";
    foreach ($pageArr as $id => $name) {
        $class = $pageId == $id ? "class=\"selected\"" : "";
        $navButtons .= "<a $class href=\"?page=$parent&amp;subpage=$id\">$name</a>";
    }
    return $navButtons;
}

function create_stylechooser($styleArr, $styleId)
{
    $styleOpts = "";
    foreach (array_keys($styleArr) as $id) {
        $selected = $styleId == $id ? "selected" : "";
        $text = ucfirst($id);
        $styleOpts .= "<option value=\"$id\" $selected>$text</option>";
    }
    return $styleOpts;
}

function check_libs()
{
    if (class_exists('PDO') && in_array("sqlite", pdo_drivers())) {
        return true;
    } else {
        return false;
    }
}

function connect_database($dsn)
{
    try {
        $db = new PDO($dsn);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $db;
    } catch (PDOException $e) {
        echo "DSN: $dsn";
        echo "<p style=\"color: red;\">$e</p>";
        return null;
    }
}

function create_statement($querySql)
{
    if (check_libs()) {
        $db = connect_database(RASTDB);
        if ($db != null) {
            return $db->prepare($querySql);
        } else {
            echo "ERROR: Failed to get the requested database.";
        }
    } else {
        echo "ERROR: The sqlite PDO drive is disabled.";
    }
}

function format_comments($queryResult)
{
    $rows = null;
    foreach ($queryResult as $row) {
        $name = htmlentities($row["name"]);
        $time = htmlentities($row["time"]);
        $text = htmlentities($row["text"]);

        $rows .= "<div class=\"comment\">";
        $rows .= "$name wrote on $time UTC<br />";
        $rows .= "<p>$text</p>";
        $rows .= "</div>";
    }
    return $rows;
}

function search($params, $query)
{
    $stmt = create_statement($query);
    $stmt->execute($params);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function get_comments($parent, $maxResults)
{
    $params = [$parent, $maxResults];
    try {
        $res = search($params, "SELECT * FROM comments WHERE parent = ? ORDER BY datetime(time) DESC LIMIT ?");
        return format_comments($res);
    } catch (PDOException $e) {
        return "<p>Failed to get comments.</p>";
        throw $e;
    }
}

function get_account_by_username($username)
{
    try {
        return search([$username], "SELECT * FROM accounts WHERE name = ?");
    } catch (PDOException $e) {
        return null;
    }
}

function get_account_by_id($id)
{
    try {
        return search([$id], "SELECT * FROM accounts WHERE id = ?");
    } catch (PDOException $e) {
        return null;
    }
}

function check_username($username)
{
    $res = get_account_by_username($username);
    return $res != null && is_array($res) && count($res) > 0;
}

function create_account($username, $passhash)
{
    $stmt = create_statement("INSERT INTO accounts VALUES(?, ?, ?, 0)");
    $params = [rand(0, PHP_INT_MAX), $username, $passhash];
    try {
        $stmt->execute($params);
        return true;
    } catch (PDOException $e) {
        return false;
    }
}

function update_account($id, $username, $passhash, $isadmin)
{
    // Build query.
    $query = "UPDATE accounts SET ";
    $params = array();
    if ($username != null) {
        $query .= "name = ?, ";
        array_push($params, $username);
    }
    if ($passhash != null) {
        $query .= "pwd = ?, ";
        array_push($params, $passhash);
    }
    $query .= "isadm = ? WHERE id == ?";
    $stmt = create_statement($query);
    array_push($params, $isadmin, $id);
    try {
        $stmt->execute($params);
        return true;
    } catch (PDOException $e) {
        return false;
    }
}

function delete_account($id)
{
    $intid = intval($id);
    if (gettype($intid) == "integer") {
        $stmt = create_statement("DELETE FROM accounts WHERE id = ?");
        $params = [$id];
        try {
            $stmt->execute($params);
            return true;
        } catch (PDOException $e) {
            return false;
        }
    } else {
        return false;
    }
}

function get_table($res, $map)
{
    if (count($res) > 0) {
        $table = "<table cellspacing=\"0\" cellpadding=\"0\"><tr>";
        // Create header.
        foreach ($map as $key => $name) {
            $table .= "<th>$name</th>";
        }
        $table .= "</tr>";
        // Fill table.
        foreach ($res as $row) {
            $table .= "<tr>";
            foreach ($map as $key => $name) {
                $safedata = htmlentities($row[$key]);
                $table .= "<td>$safedata</td>";
            }
            $table .= "</tr>";
        }
        $table .= "</table>";
        return $table;
    } else {
        return "<p>Lyckades inte hitta vad du sökte efter.</p><p>Det kan vara så att du stavat fel eller att det du sökte efter inte finns i databasen.</p>";
    }
}

function get_comments_table($res)
{
    $map = [
        "time" => "Time",
        "parent" => "Parent",
        "name" => "Author",
        "text" => "Text"
    ];
    return get_table($res, $map);
}

function get_users_table($res)
{
    $map = [
        "id" => "Id",
        "name" => "Name",
        "isadm" => "IsAdmin"
    ];
    return get_table($res, $map);
}

// Ugly AF
function printJettyResultsetToHTMLTable($res)
{
    $rows = null;
    foreach ($res as $row) {
        $rows .= "<tr><td>{$row['jettyPosition']}</td><td>{$row['boatType']}</td><td>{$row['boatEngine']}</td><td>{$row['boatLength']}</td><td>{$row['boatWidth']}</td><td>{$row['ownerName']}</td></tr>";
    }
    echo "<table cellspacing=\"0\" cellpadding=\"0\"><tr><th>jettyPostion</th><th>boatType</th><th>boatEngine</th><th>boatLength</th><th>boatWidth</th><th>ownerName</th></tr>$rows</table>";
}
