<?php

require_once "php/model/UserManager.php";
require_once "php/model/Article.php";
require_once "php/model/ArticleManager.php";
require_once "php/model/CommentManager.php";
require_once "php/validator/user-validator.php";

$error = null;

if (!isset($_SESSION["user"])) {
    header("Location: index.php?pfad=login");
    exit();
}

try {
    $dao = UserManager::getInstance();

    $user = $dao->findUser($_SESSION["user_email"] ?? "");

    if (!$user) {
        $_SESSION = [];
        session_destroy();

        header("Location: index.php?pfad=login");
        exit();
    }

    if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["saveProfile"])) {
        $oldEmail = $_SESSION["user_email"];

        $newEmail = trim($_POST["email"] ?? "");
        $vorname = trim($_POST["vorname"] ?? "");
        $nachname = trim($_POST["nachname"] ?? "");
        $password = $_POST["password"] ?? "";

        if (!userEmailValidator($newEmail)) {
            $error = "Bitte gib eine gültige E-Mail-Adresse ein.";
            $_GET["edit"] = "1";

        } elseif (!userNameValidator($vorname)) {
            $error = "Der Vorname muss 2 bis 20 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten.";
            $_GET["edit"] = "1";

        } elseif (!userNameValidator($nachname)) {
            $error = "Der Nachname muss 2 bis 20 Zeichen lang sein und darf nur Buchstaben, Leerzeichen und Bindestriche enthalten.";
            $_GET["edit"] = "1";

        } elseif (!userOptionalPasswordValidator($password)) {
            $error = "Das Passwort muss 5 bis 12 Zeichen lang sein.";
            $_GET["edit"] = "1";

        } else {
            $updated = $dao->updateUser(
                $oldEmail,
                $newEmail,
                $vorname,
                $nachname,
                $password
            );

            if ($updated) {
                $_SESSION["user"] = $vorname . " " . $nachname;
                $_SESSION["user_email"] = $newEmail;

                $_SESSION["message"] = "profile_updated";
                header("Location: index.php?pfad=profile");
                exit();
            } else {
                $error = "Die Daten konnten nicht gespeichert werden.";
                $_GET["edit"] = "1";
            }
        }
    }

    $user = $dao->findUser($_SESSION["user_email"] ?? "");

    $articleManager = ArticleManager::getInstance();
    $userArticles = $articleManager->getArticlesByAuthor($_SESSION["user_email"]);

    $commentManager = CommentManager::getInstance();
    $userComments = $commentManager->getCommentsByAuthor($_SESSION["user_email"]);

    if (!isset($userArticles)) {
        $_SESSION["message"] = "user_has_no_articles";
    }

} catch (InvalidArgumentException $e) {
    $error = $e->getMessage();
    $_GET["edit"] = "1";

} catch (Exception $e) {
    $error = "Es ist ein interner Fehler aufgetreten. Bitte versuche es erneut.";
    $_SESSION["message"] = "internal_error";
    $_GET["edit"] = "1";
}