<?php

namespace brain\utility;

use Mni\FrontYAML\Parser;
use brain\data\Book;
use brain\data\Settings;

use function _\find;
use function _\filter;

class Sorting
{
    private static $_tags = [];
    private static $_archive = [];
    public function __construct()
    {
    }

    public static function tags()
    {
        $pages = (new Book("../content/pages"))->getContents();
        foreach ($pages as $page) {
            $temp = [];
            $temp = explode(",", $page["tags"]);
            foreach ($temp as $tag) {
                $label = trim($tag);
                if (!find(self::$_tags, ["tag_name" => $label])) {
                    array_push(self::$_tags, [
                    "tag_name" => $label,
                    "slug" => StringTools::safeString($label),
                    "pages" => self::tagPages($label, $pages),
                    ]);
                }
            }
        }

        return self::$_tags;
    }

    private static function tagPages($tag, $pages)
    {
        $tagged = [];
        foreach ($pages as $page) {
            if (strpos($page["tags"], $tag) !== false) {
                array_push($tagged, [
                "title" => $page["title"],
                "slug" => $page["slug"],
                "path" => $page["path"],
                "feature" => $page["feature"],
                ]);
            }
        }

        return $tagged;
    }

    public static function archive()
    {
        $pages = (new Book("../content/pages"))->getContents();
        $years = [];
        $archive = [];
        foreach ($pages as $page) {
            //$year = date("Y", date($page["rawCreated"]));
            $date = explode("/", $page["path"]);
            //echo $page["title"] . " : " . $year . "\n";
            if (!find($years, ["year" => trim($date[0])])) {
                $findPages = filter($pages, ["createdYear" => trim($date[0])]);
                //var_dump($findPages);
                array_push($years, [
                "year" => trim($date[0]),
                "count" => count($findPages),
                ]);
            }
        }
        foreach ($years as $year) {
            $sorted = [];
            $filtered = filter($pages, ["createdYear" => $year["year"]]);

            foreach ($filtered as $obj) {
                $month = date("m", date($obj["rawCreated"]));
                if (!find($sorted, ["month" => $month])) {
                    $perMonth = filter($pages, [
                    "path" => $year["year"] . "/" . $month,
                    "deleted" => false,
                    "published" => true,
                    "layout" => "page",
                    ]);
                    array_push($sorted, [
                      "month" => $month,
                      "full_month" => date("F", date($obj["rawCreated"])),
                      "count" => count($perMonth),
                      "pages" => $perMonth,
                      ]);
                }
            }
            array_push(self::$_archive, [
            "year" => $year["year"],
            "year_data" => $sorted,
            ]);
        }
        return self::$_archive;
    }

    public static function page($page)
    {
        $config = new Settings();
        $settings = $config->getSettings();
        $pageOption = [];

        $pageInfo = [
        "keywords" => isset($settings["global"]["keywords"])
        ? $settings["global"]["keywords"]
        : "fipamo, blog, jamstack, php, markdown, js",
        "description" => $settings["global"]["descriptions"],
        "image" =>
        $settings["global"]["base_url"] . $settings["global"]["background"],
        "baseURL" => $settings["global"]["base_url"],
        ];

        $taglist = explode(",", $page["tags"]);
        $tags = [];
        foreach ($taglist as $tag) {
            $label = trim($tag);
            array_push($tags, [
            "label" => $label . " ",
            "slug" => StringTools::safeString($label),
            ]);
        }

        $meta = [
        "who" => $page["author"],
        "when" => $page["created"],
        "tags" => $tags,
        ];

        //render markdown content and clean it
        $parser = new Parser();
        $rendered = $parser->parse($page["content"]);
        $sanitizer = \HtmlSanitizer\Sanitizer::create([
        "extensions" => ["basic", "image", "list", "code"],
        "tags" => [
        "img" => [
          "allowed_attributes" => ["src", "alt", "title", "class"],
          "allowed_hosts" => null,
        ],
        ],
        ]);

        $preclean = $sanitizer->sanitize($rendered->getContent());

        //just clean renderd string for now, Sanitize doesn't like relative img urls
        //so another option is needed
        $cleaned = strip_tags($rendered->getContent(), [
        "a",
        "br",
        "p",
        "strong",
        "br",
        "img",
        "iframe",
        "ul",
        "li",
        "i",
        "em",
        "h1",
        "h2",
        "h3",
        "pre",
        "code",
        ]);
        //$cleaned = preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $cleaned);
        //$cleaned = html_entity_decode($cleaned, ENT_QUOTES, "UTF-8");

        //if page feature isn't empty, replace page info meta image
        if ($page["feature"] != "" || $page["feature"] != null) {
            $pageInfo["image"] = $pageInfo["baseURL"] . $page["feature"];
        }

        if ($page["layout"] == "index") {
            //$template = $this->theme . "/index.twig";
            //$location = "../public/index.html";
            //$dir = null;

            $recent = [];
            $featured = [];
            $limit = 4;
            $pages = (new Book())->getContents();
            foreach ($pages as $item) {
                if (
                    !$item["deleted"] &&
                    $item["published"] &&
                    $item["menu"] != "true"
                ) {
                    if (count($recent) < $limit) {
                        array_push($recent, [
                        "path" => $item["path"],
                        "slug" => $item["slug"],
                        "title" => $item["title"],
                        "feature" => $item["feature"],
                        ]);
                    }

                    if ($item["featured"] == true) {
                        if (count($featured) < $limit) {
                            array_push($featured, [
                            "path" => $item["path"],
                            "slug" => $item["slug"],
                            "title" => $item["title"],
                            "feature" => $item["feature"],
                            ]);
                        }
                    }
                }
            }

            $pageOptions = [
            "title" => $page["title"],
            "background" => $page["feature"],
            "content" => $page["html"], //$cleaned,
            "meta" => $meta,
            "recent" => $recent,
            "featured" => $featured,
            "info" => $pageInfo,
            "menu" => $settings["menu"],
            "dynamicRender" => $settings["global"]["dynamicRender"],
            "media" => $page["media"],
            "files" => $page["docs"],
            ];
        } else {
            //$template = $this->theme . "/page.twig";
            //$location = "../public/" . $page["path"] . "/" . $page["slug"] . ".html";
            //$dir = "../public/" . $page["path"];
            $pageOptions = [
            "title" => $page["title"],
            "background" => $page["feature"],
            "content" => $page["html"], //$cleaned,
            "meta" => $meta,
            "info" => $pageInfo,
            "menu" => $settings["menu"],
            "dynamicRender" => $settings["global"]["dynamicRender"],
            "media" => $page["media"],
            "files" => $page["docs"],
            ];
        }
        return $pageOptions;
    }
}