<?php

final class Blog
{

    private array $links = [];

    public function __construct()
    {
        $this->loadConfig();
    }

    public function run()
    {
        $this->render();
    }

    private function loadConfig()
    {
        require_once "config.php";
        foreach ($links as $title => $url) {
            $this->links[] = new Link($title, $url);
        }
    }

    private function render()
    {
        extract($this->populateViews());
        include "views/index.phtml";
    }

    private function populateViews(): array
    {
        return array_merge( 
            ["lang" => BLOG_LANGUAGE],
            $this->populateHeader(), 
            $this->populateMainView(),
            $this->populateBio(), 
            $this->populateNavByTag(),
            $this->populateNavByLatest(),
            $this->populateFooter()
        );
    }

    private function populateHeader(): array
    {
        return [
            "title" => BLOG_TITLE,
            "has_sub_title" => BLOG_SUB_TITLE !== "",
            "sub_title" => BLOG_SUB_TITLE
        ];
    }

    private function populateMainView(): array
    {
        $variables = [];
        $view = filter_input(INPUT_GET, "view", FILTER_SANITIZE_STRING) ?: "single";
        $variables["view"] = $view;
        switch ($view) {
            case "single":
                $date = filter_input(INPUT_GET, "date", FILTER_SANITIZE_STRING);
                $ref = filter_input(INPUT_GET, "ref", FILTER_SANITIZE_STRING);
                $variables["article"] = ($date !== null and $ref !== null) ?
                    ArticleManager::get(str_replace("-", "", $date) . $ref) :
                    ArticleManager::getNewest();
                break;
            case "tags":
                $tag = filter_input(INPUT_GET, "tag", FILTER_SANITIZE_STRING) ?: "";
                $variables["articles"] = ArticleManager::getMultiple(TagManager::getFromTag($tag));
                break;
            case "archives":
                $variables["dates"] = ArticleManager::getAll();;
                break;
        }
        return $variables;
    }

    private function populateBio(): array
    {
        return [
            "author" => AUTHOR_NICKNAME,
            "bio" => AUTHOR_BIOGRAPHY,
        ];
    }

    private function populateNavByTag(): array
    {
        return ["tags" => TagManager::getTags()];
    }

    private function populateNavByLatest(): array
    {
        return [
            "latest" => ArticleManager::getLatestArticles(ARTICLE_COUNT_IN_NAV)
        ];
    }

    private function populateFooter(): array
    {
        return [
            "has_links" => count($this->links) > 0,
            "links" => $this->links,
            "footer" => $this->getFooterString()
        ];
    }

    private function getFooterString(): string
    {
        $currentYear = getdate()["year"];
        $footerYear = BLOG_CREATION_YEAR .
            (BLOG_CREATION_YEAR !== $currentYear ? " - $currentYear" : "");
        $footerAuthor = AUTHOR_NICKNAME .
            (AUTHOR_REALNAME !== "" ? " (" . AUTHOR_REALNAME . ")" : "");
        return "$footerYear. $footerAuthor";
    }

}