<?php

namespace brain\utility;

use function _\filter;
use function _\find;
use brain\data\Book;
use brain\data\Settings;
use Mni\FrontYAML\Parser;

class Sorting
{
    private static $p_tags    = [];
    private static $p_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::$p_tags, ['tag_name' => $label])) {
                    array_push(self::$p_tags, [
                        'tag_name' => $label,
                        'slug'     => StringTools::safeString($label),
                        'pages'    => self::tagPages($label, $pages),
                    ]);
                }
            }
        }

        return self::$p_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::$p_archive, [
                'year'      => $year['year'],
                'year_data' => $sorted,
            ]);
        }

        return self::$p_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',
        ]);

        // if page feature isn't empty, find image from list and set it as background image
        // if it is empty, just use global background
        if ($page['feature'] != '' || $page['feature'] != null) {
            $media = explode(',', $page['feature']);
            $set   = false;
            foreach ($media as $file) {
                $item = trim($file);
                $ext  = pathinfo($item, PATHINFO_EXTENSION);

                if ($ext != 'mp4' && !$set) {
                    $pageInfo['image'] = $pageInfo['baseURL'] . $item;
                    $set               = true;
                }
            }
        }

        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;
    }
}