<?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 $_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',
        ]);

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