<?php
defined('BASEPATH') OR exit('No direct script access allowed');

use Coduo\PHPHumanizer\DateTimeHumanizer;

class User extends MY_Controller
{

    public function __construct()
    {
        parent::__construct('profile', 'language_names', 'country_names');
        $this->load->model('UserModel', '', TRUE);
        $this->load->model('PostsModel', '', TRUE);
        $this->load->model('FileModel', '', TRUE);
    }

    public function index($user = "")
    {
        if ($user == "") {
            $title = "Error - Profile";
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."];
        } else {
            $user_data = $this->UserModel->getUser($user);
            $user_exists = !empty($user_data);
            if ($user_exists) {
                $user_data = $user_data[0];
                $user_stats = $this->UserModel->getUserStats($user_data['ID']);

                $user_posts = $this->PostsModel->getUserPosts($user_data['ID'], 3, 0, 192);
                $user_comments = $this->UserModel->getUserComments($user_data['ID'], 3, 0);
                $user_blog_posts = $this->UserModel->getUserBlogPosts($user_data['ID'], 3, 0);

                $date_created = strtotime($user_data['date_created']);
                $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date_created"), $_SESSION['site_lang']);
                $title = $user_data['displayname'] . " - Profile";
                $isCurrentUserFollowing = false;
                if (isset($_SESSION['user']['ID']))
                    $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']);

                $_SESSION['currentProfilePage'] = $user_data['ID'];
            } else {
                $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."];
                $title = "Error - Profile";
            }
        }

        $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]);
        if (isset($message)) {
            $this->load->view('network/message', $message);
        }
        if (isset($user_data) && isset($user_stats) && isset($user_posts) && isset($user_comments) && isset($user_blog_posts)) {
            $this->load->view('network/user/profile_page', ['data' => $user_data, 'stats' => $user_stats, 'posts' => $user_posts, 'comments' => $user_comments, 'blog_posts' => $user_blog_posts, 'isCurrentUserFollowing' => $isCurrentUserFollowing]);
        }
        $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]);
    }

    public function comments($user = "")
    {
        if ($user == "") {
            $title = "Error - Profile";
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."];
        }

        $user_data = $this->UserModel->getUser($user);
        $user_exists = !empty($user_data);
        if ($user_exists) {
            $user_data = $user_data[0];
            $dateCreated = strtotime($user_data['date_created']);
            $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']);
            $user_stats = $this->UserModel->getUserStats($user_data['ID']);
            $title = $user_data['displayname'] . " - Blog-Kommentare";
            $isCurrentUserFollowing = false;
            if (isset($_SESSION['user']['ID']))
                $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']);

            $_SESSION['currentProfilePage'] = $user_data['ID'];
        } else {
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."];
            $title = "Error - Profile";
        }


        $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]);
        if (isset($message)) {
            $this->load->view('network/message', $message);
        }
        if ($user_exists) {
            $this->load->view('network/blog/user_comments', ['data' => $user_data, 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing]);
        }
        $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]);
        $this->load->view('network/blog/user_comments_end', ['data' => $user_data]);
    }

    public function getComments()
    {
        $user = (int)$this->input->get('user');
        $amount = (int)$this->input->get('amount');
        $offset = (int)$this->input->get('offset') * $amount;
        $user_comments = $this->UserModel->getUserComments($user, $amount, $offset);
        $comment_user = $this->UserModel->getUserByID($user)[0];

        foreach ($user_comments as $comment) {
            $this->load->view('network/blog/comment_item', ['data' => $comment_user, 'c' => $comment]);
        }
    }

    public function posts($user = "")
    {
        if ($user == "") {
            redirect(base_url('user'));
        }

        $user_data = $this->UserModel->getUser($user);
        $user_exists = !empty($user_data);
        if ($user_exists) {
            $user_data = $user_data[0];
            $dateCreated = strtotime($user_data['date_created']);
            $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']);
            $user_stats = $this->UserModel->getUserStats($user_data['ID']);
            $title = $user_data['displayname'] . " - Posts";
            $isCurrentUserFollowing = false;
            if (isset($_SESSION['user']['ID']))
                $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']);

            $_SESSION['currentProfilePage'] = $user_data['ID'];
        } else {
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."];
            $title = "Error - Profile";
        }

        $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]);
        if (isset($message)) {
            $this->load->view('network/message', $message);
        }
        if ($user_exists) {
            $this->load->view('network/user/user_posts', ['data' => $user_data, 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing]);
        }
        $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]);
        $this->load->view('network/user/user_posts_end', ['data' => $user_data]);
    }

    public function getPosts()
    {
        $user = (int)$this->input->get('user');
        $amount = (int)$this->input->get('amount');
        $offset = (int)$this->input->get('offset') * $amount;
        $user_posts = $this->PostsModel->getUserPosts($user, $amount, $offset);

        foreach ($user_posts as $post) {
            $this->load->view('network/posts/post_item', $post);
        }
    }

    public function blogposts($user = "")
    {
        if ($user == "") {
            redirect(base_url('user'));
        }

        $user_data = $this->UserModel->getUser($user);
        $user_exists = !empty($user_data);
        if ($user_exists) {
            $user_data = $user_data[0];
            $dateCreated = strtotime($user_data['date_created']);
            $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']);
            $user_stats = $this->UserModel->getUserStats($user_data['ID']);
            $title = $user_data['displayname'] . " - Posts";
            $isCurrentUserFollowing = false;
            if (isset($_SESSION['user']['ID']))
                $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']);

            $_SESSION['currentProfilePage'] = $user_data['ID'];
        } else {
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."];
            $title = "Error - Profile";
        }

        $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]);
        if (isset($message)) {
            $this->load->view('network/message', $message);
        }
        if ($user_exists) {
            $this->load->view('network/blog/user_blog_posts', ['data' => $user_data, 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing]);
        }
        $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]);
        $this->load->view('network/blog/user_blog_posts_end', ['data' => $user_data]);
    }

    public function getBlogPosts()
    {
        $user = (int)$this->input->get('user');
        $amount = (int)$this->input->get('amount');
        $offset = (int)$this->input->get('offset') * $amount;
        $user_posts = $this->UserModel->getUserBlogPosts($user, $amount, $offset);
        $post_user = $this->UserModel->getUserByID($user)[0];

        foreach ($user_posts as $post) {
            $this->load->view('network/blog/blog_post_item', ['data' => $post_user, 'post' => $post]);
        }
    }

    public function publishPost()
    {
        if (!isset($_SESSION['user']) || empty($_SESSION['user'])) {
            ?>
            <div class="alert alert-danger" role="alert">
                <b>Veröffentlichen des Posts fehlgeschlagen!</b>
                Du musst in deinen Account eingeloggt sein, um Posts erstellen zu können.<br>

                Bitte erstelle dir entweder
                <a href="<?= base_url('login') ?>">kostenlos einen neuen Account</a>
                oder
                <a href="<?= base_url('login') ?>">melde dich an</a>
                .
            </div>
            <?php
            exit;
        }

        $content = $this->input->post('content');
        if (strlen($content) >= 10000) {
            ?>
            <div class="alert alert-warning" role="alert">
                <b>Veröffentlichung des Posts fehlgeschlagen!</b> Dein Post ist leider zu lang. Er darf maximal 10.000
                Zeichen umfassen.
            </div>
            <?php
            exit;
        }

        $replyTo = $this->input->post('replyTo');
        if ($replyTo !== "-1" && !$this->PostsModel->isUUIDValid($replyTo)) {
            ?>
            <div class="alert alert-warning" role="alert">
                <b>Veröffentlichung des Posts fehlgeschlagen!</b> Der Post, an den du deine Antwort richten willst,
                existiert nicht (mehr).<br>
                Solltest du dies für einen Fehler halten, versuche es später erneut oder kontaktiere uns.
            </div>
            <?php
            exit;
        }

        $postID = -1;
        if ($replyTo !== "-1") {
            $postID = $this->PostsModel->addReply($_SESSION['user']['ID'], $content, $replyTo);
        } else {
            $postID = $this->PostsModel->addPost($_SESSION['user']['ID'], $content);
        }

        $media = $this->input->post('postMedia');
        if (!empty($media)) {
            foreach ($media as $entry) {
                $image = str_replace(' ', '+', $entry['image']);
                $image = substr($image, strpos($image, ',') + 1);
                $image = base64_decode($image);

                $fileUrl = $this->FileModel->uploadFileByContent($image, $entry['name'], $entry['type'], $entry['size']);

                $this->PostsModel->addImageToPost($postID, $fileUrl);
            }

            ?>
            <div class="alert alert-success" role="alert">
                <b>Dein Post wurde erfolgreich veröffentlicht!</b> Möchtest du nun deine Posts ansehen? <br>
                <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">Nein</button>
                <a href='<?= base_url('user/' . $_SESSION['user']['username'] . '/posts') ?>'
                   class='btn btn-sm btn-primary'>Ja</a>
            </div>
            <?php
        }
    }

    public function followers($user = "")
    {
        if ($user == "") {
            $title = "Error - Profile";
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."];
        }

        $user_data = $this->UserModel->getUser($user);
        $user_exists = !empty($user_data);
        if ($user_exists) {
            $user_data = $user_data[0];
            $dateCreated = strtotime($user_data['date_created']);
            $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']);
            $user_stats = $this->UserModel->getUserStats($user_data['ID']);
            $followers = $this->UserModel->getFollowers($user_data['ID']);
            $title = $user_data['displayname'] . " - Follower";
            $isCurrentUserFollowing = false;
            if (isset($_SESSION['user']['ID']))
                $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']);

            $_SESSION['currentProfilePage'] = $user_data['ID'];
        } else {
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."];
            $title = "Error - Profile";
        }

        $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]);
        if (isset($message)) {
            $this->load->view('network/message', $message);
        }
        if ($user_exists) {
            $this->load->view('network/user/user_followers', ['data' => $user_data, 'active' => 'followers', 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing, 'followers' => $followers]);
        }
        $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]);
    }

    public function following($user = "")
    {
        if ($user == "") {
            $title = "Error - Profile";
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Es wurde kein Nutzername angegeben."];
        }

        $user_data = $this->UserModel->getUser($user);
        $user_exists = !empty($user_data);
        if ($user_exists) {
            $user_data = $user_data[0];
            $dateCreated = strtotime($user_data['date_created']);
            $user_data['time_existing'] = DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$dateCreated"), $_SESSION['site_lang']);
            $user_stats = $this->UserModel->getUserStats($user_data['ID']);
            $following = $this->UserModel->getFollowing($user_data['ID']);
            $title = $user_data['displayname'] . " - Follower";
            $isCurrentUserFollowing = false;
            if (isset($_SESSION['user']['ID']))
                $isCurrentUserFollowing = $this->UserModel->isFollowing($_SESSION['user']['ID'], $user_data['ID']);

            $_SESSION['currentProfilePage'] = $user_data['ID'];
        } else {
            $message = ["type" => "danger", "message1" => "Dieser Nutzer existiert nicht!", "message2" => "Der angegebene Nutzername konnte nicht gefunden werden."];
            $title = "Error - Profile";
        }

        $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['profile_page.css']]);
        if (isset($message)) {
            $this->load->view('network/message', $message);
        }
        if ($user_exists) {
            $this->load->view('network/user/user_followers', ['data' => $user_data, 'active' => 'following', 'stats' => $user_stats, 'isCurrentUserFollowing' => $isCurrentUserFollowing, 'followers' => $following]);
        }
        $this->load->view('footer', ['additionalScripts' => ['profile_page.js']]);
    }

    public function switchFollowing()
    {
        header('Content-Type: application/json');
        if (!isset($_SESSION['currentProfilePage'])) {
            $response = ['type' => 'error', 'code' => -1];
            echo json_encode($response);
            exit;
        }

        $followedUser = $_SESSION['currentProfilePage'];

        // code 0: not logged in
        // code 1: same user
        // code 10: unfollowed
        // code 11: now following

        if (!isset($_SESSION['user']['username'])) {
            $response = ['type' => 'error', 'code' => 0];
            echo json_encode($response);
            exit;
        }

        $follower = $_SESSION['user']['ID'];

        if ($follower == $followedUser) {
            $response = ['type' => 'error', 'code' => 1];
            echo json_encode($response);
            exit;
        }

        if ($this->UserModel->isFollowing($follower, $followedUser)) {
            $this->UserModel->unfollow($follower, $followedUser);
            $response = ['type' => 'success', 'code' => 10];
            echo json_encode($response);
            exit;
        }

        $this->UserModel->follow($follower, $followedUser);
        $response = ['type' => 'success', 'code' => 11];
        echo json_encode($response);
        exit;
    }

    public function edit($user = "")
    {
        if ($user == "") {
            redirect(base_url('user'));
        }

        $user_data = $this->UserModel->getUser($user);
        $user_exists = !empty($user_data);
        if ($user_exists) {
            $user_data = $user_data[0];
            // Update Settings
            $newData = [];
            // TODO: Error messages
            // Username
            if (isset($_POST['username'])) {
                if (!preg_match('/[^A-Za-z0-9._]/', $_POST['username'])) {
                    if ($this->LoginModel->isAvailable($_POST['username'])) {
                        if (strlen($_POST['username']) >= 4) {
                            $newData['username'] = strtolower($_POST['username']);
                            $newData['displayname'] = $_POST['username'];
                        } else {
                            $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Zu kurzer Nutzername!</b> Dein Name muss 4 Zeichen oder mehr enthalten.</div>";
                        }
                    } else {
                        $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Nutzername bereits vergeben!</b> Ein anderer Nutzer hat anscheinend diesen Namen bereits gewählt.</div>";
                    }
                } else {
                    $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Ungültiger Nutzername!</b> Dein Name darf nur Groß- (A-Z) und Kleinbuchstaben (a-z), Zahlen (0-9) und Punkte (.) sowie Unterstriche (_).</div>";
                }
            }
            // Gender
            if (isset($_POST['gender'])) {
                if ($_POST['gender'] == "male" || $_POST['gender'] == "female" || $_POST['gender'] == 'other') {
                    $newData['gender'] = $_POST['gender'];
                }
            }
            // Birth date
            if (isset($_POST['birthdate-day']) && isset($_POST['birthdate-month'])) {
                $day = intval($_POST['birthdate-day']);
                $month = intval($_POST['birthdate-month']);
                if ($month > 0 && $month <= 12) {
                    $monthDayCount = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
                    if ($day <= $monthDayCount[$month - 1]) {
                        $newData['birthdate'] = $day . '.' . $month . '.';
                    }
                }
            }
            if (isset($_POST['birthdate-year'])) {

            }
            // Language
            if (isset($_POST['language'])) {
                $newData['language'] = $_POST['language'];
            }
            // Country
            if (isset($_POST['country'])) {
                $newData['country'] = $_POST['country'];
            }
            // Biography/About
            if (isset($_POST['biography'])) {
                $newData['about'] = $_POST['biography'];
            }
            // Avatar
            if (isset($_FILES['avatar'])) {
                $image = $this->FileModel->uploadCroppedImage('avatar', 4096, $_FILES['avatar']['name'], 500, 500);
                if ($image != null)
                    $newData['profile_picture'] = $image;
                unset($_FILES['avatar']);
            }
            // Header
            if (isset($_FILES['header'])) {
                $image = $this->FileModel->uploadImage('header', 4096, $_FILES['header']['name'], 1920);
                if ($image != null)
                    $newData['header_image'] = $image;
                unset($_FILES['header']);
            }
            // Social Networks
            if (isset($_POST['social-networks'])) {

            }
            // Profile color
            if (isset($_POST['color'])) {

            }
            // E-Mail-Address
            if (isset($_POST['email'])) {
                if (isset($_POST['email-password']) && !empty($_POST['email-password'])) {
                    $loginData = $this->LoginModel->getLoginData($_SESSION['user']['username']);
                    if (empty($loginData)) {
                        $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Ungültiger Account</b> Anscheinend versuchst du die E-Mail-Adresse eines nicht existierenden Accounts zu ändern. Sollte es sich um einen Fehler handeln, kontaktiere bitte das Website-Team!</div>";
                    } else {
                        $loginData = $loginData[0];
                        $encryptedPassword = $this->LoginModel->getPasswordHash($_POST['email-password'], $loginData['original_name']);
                        if ($loginData['password'] == $encryptedPassword) {
                            $isRegistered = $this->LoginModel->isRegistered($_POST['email']);
                            if ($isRegistered == "") {
                                $trashMail = $this->LoginModel->isTrashMail($_POST['email']);
                                if ($trashMail == '') {
                                    $this->LoginModel->changeMailAddress($_POST['email'], $loginData['username']);
                                    $_SESSION['profileEditNotification'] .= "<div class='alert alert-warning' role='alert'><b>Deine E-Mail-Adresse wurde geändert!</b> Nun musst du nur noch in deinem Postfach vorbeischauen und die neue Adresse aktivieren.</div>";
                                } else {
                                    $_SESSION['profileEditNotification'] .= $trashMail;
                                }
                            } else {
                                $_SESSION['profileEditNotification'] .= $isRegistered;
                            }
                        } else {
                            $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Ungültiges Passwort!</b> Es scheint als wäre das eingegebene Passwort nicht mit dem richtigen übereinstimmend.</div>";
                        }
                    }
                } else {
                    $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Bitte gib dein Passwort ein!</b> Das Ändern der E-Mail-Adresse ist ein tiefgreifender Eingriff in den Account. Daher benötigen wir zur Sicherheit nochmal dein Passwort.</div>";
                }
            }
            // Notifications
            if (isset($_POST['email-notifications'])) {
                $newData['receiveEmails'] = filter_var($_POST['email-notifications'], FILTER_VALIDATE_BOOLEAN);
            }
            // Newsletter
            if (isset($_POST['newsletter'])) {
                $newData['receiveNewsletter'] = filter_var($_POST['newsletter'], FILTER_VALIDATE_BOOLEAN);
            }
            // Password
            if (isset($_POST['passwordNew'])) {
                if (isset($_POST['passwordOld'])) {
                    $loginData = $this->LoginModel->getLoginData($_SESSION['user']['username']);
                    if (!empty($loginData)) {
                        $loginData = $loginData[0];
                        $encryptedPassword = $this->LoginModel->getPasswordHash($_POST['passwordOld'], $loginData['original_name']);
                        if ($encryptedPassword == $loginData['password']) {
                            if ($this->LoginModel->checkPassword($_POST['passwordNew'])) {
                                if (isset($_POST['passwordNewRepeat']) && $_POST['passwordNew'] == $_POST['passwordNewRepeat']) {
                                    $this->LoginModel->changePassword($_POST['passwordNew'], $loginData['original_name']);
                                    $_SESSION['profileEditNotification'] .= "<div class='alert alert-success' role='alert'><b>Dein Passwort wurde geändert!</b> Du kannst dich nun damit einloggen</div>";
                                } else {
                                    $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Wiederholtes Passwort falsch!</b> Das Passwort, das du wiederholt hast, stimmt nicht mit dem eigentlichen überein.</div>";
                                }
                            } else {
                                $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Zu unsicheres Passwort!</b> Dein Passwort sollte mindest 8 Zeichen lang sein und jeweils einen Groß-, einen Kleinbuchstaben, eine Zahl und ein Sonderzeichen enthalten.</div>";
                            }
                        } else {
                            $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Altes Passwort falsch!</b> Dein altes eingegebenes Passwort ist falsch!</div>";
                        }
                    } else {
                        $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Ungültiger Account</b> Anscheinend versuchst du die E-Mail-Adresse eines nicht existierenden Accounts zu ändern. Sollte es sich um einen Fehler handeln, kontaktiere bitte das Website-Team!</div>";
                    }
                } else {
                    $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Altes Passwort fehlend!</b> Bitte gib dein altes Passwort ebenfalls ein!</div>";
                }
            }
            if (isset($_POST['showAds'])) {
                if (isset($_SESSION['user']) && $_SESSION['user']['rank'] >= 2) {
                    $newData['showAds'] = filter_var($_POST['email-notifications'], FILTER_VALIDATE_BOOLEAN);
                } else {
                    $_SESSION['profileEditNotification'] .= "<div class='alert alert-danger' role='alert'><b>Du bist dazu nicht berechtigt!</b> Um diese Einstellung zu verändern, musst du mindestens ein Premium-Nutzer oder höher sein!</div>";
                }
            }
            if (!empty($newData)) {
                // Add entry to history
                unset($user_data['rankName']);
                unset($_SESSION['user']);
                $this->UserModel->insertIntoHistory($user_data);
                // Update profile
                $this->UserModel->updateProfile($newData, $user_data['ID']);
                $this->db->cache_delete('user', $user_data['username']);

                $this->LoginModel->reloadLoginSession($user_data);

                redirect(base_url(uri_string()));
            }

            $user_stats = $this->UserModel->getUserStats($user_data['ID']);
            $title = $user_data['displayname'] . ' - Profil bearbeiten';
        }

        $this->load->view('header', ['active' => 'profile', 'title' => $title, 'additionalStyles' => ['lib/selectize.css', 'lib/selectize.bootstrap3.css', 'lib/bootstrap-colorpicker.min.css', 'profile_page.css']]);
        $editMessage = isset($_SESSION['profileEditNotification']) ? $_SESSION['profileEditNotification'] : "";
        $_SESSION['profileEditNotification'] = "";
        if (isset($message)) {
            $this->load->view('network/message', $message);
        }
        if ($user_exists) {
            $this->load->view('network/user/profile_edit', ['message' => $editMessage, 'data' => $user_data, 'stats' => $user_stats]);
        }
        $this->load->view('footer', ['additionalScripts' => ['lib/selectize.js', 'lib/bootstrap-colorpicker.min.js', 'profile_page.js', 'profile_edit.js']]);
    }

    public function single_post($username = null, $uuid = null, $origin = null)
    {
        $origin = isset($_GET['o']) ? $_GET['o'] : null;
        if ($origin == null) {
            $origin = base_url('user/' . $username);
        } else {
            $origin = base64_decode(urldecode($origin));
        }

        $this->load->view('header', ['active' => 'profile', 'title' => 'Test']);
        $this->load->view('network/posts/user_post_page', ['origin' => $origin, 'username' => $username, 'uuid' => $uuid]);
        $this->load->view('footer', ['additionalScripts' => ['single-post-page.js']]);
    }

    public function single_post_data($username = null, $uuid = null)
    {
        $message = "";
        $post = [];
        $replies = [];
        if ($username == null) {
            $message .= '<div class="alert alert-danger" role="alert"><b>Es wurde kein Nutzer angegeben!</b> Es können keine Posts von einem undefinierten Nutzer gefunden werden.</div>';
            goto display;
        }
        if ($uuid == null) {
            $message .= '<div class="alert alert-danger" role="alert"><b>Es wurde keine Post-ID angegeben!</b> Es können keine undefinierten Posts gefunden werden.</div>';
            goto display;
        }

        $user = $this->UserModel->getUser($username);
        if (empty($user)) {
            $message .= '<div class="alert alert-warning" role="alert"><b>Es wurde kein Nutzer mit dem angegebenen Namen gefunden!</b> Vielleicht kannst du ja diese Lücke füllen?</div>';
            goto display;
        }
        $user = $user[0];

        $post = $this->PostsModel->getPostDetails($user['ID'], $uuid);
        if (empty($post)) {
            $message .= '<div class="alert alert-warning" role="alert"><b>Es wurde kein Post mit der angegebenen ID gefunden!</b> Vielleicht kannst du ja diesen neuen Content erschaffen?</div>';
            goto display;
        }
        $post = $post[0];

        $replies = $this->PostsModel->getPostReplies($post['ID']);

        display:
        $this->load->view('network/posts/user_post_content', ['message' => $message, 'post' => $post, 'replies' => $replies]);

    }
}