<?php

namespace App\Services;

use Carbon\Carbon;

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

class SortingService
{
    private $p_tags    = [];
    private $p_archive = [];
    private $settings;
    private $contents;
    private $strings;
    private $themes;

    public function __construct(
        SettingsService $settingsService,
        ContentService $contentService,
        StringService $stringService,
        ThemeService $themeService,
    ) {
        $this->settings = $settingsService;
        $this->contents = $contentService;
        $this->strings  = $stringService;
        $this->themes   = $themeService;
    }

    public function tags()
    {
        $pages = $this->contents->loadAllPages();
        foreach ($pages as $page) {
            $temp = [];
            if (isset($page['tags'])) {
                $temp = explode(',', $page['tags']);
                foreach ($temp as $tag) {
                    $label = trim($tag);
                    if (!find($this->p_tags, ['tag_name' => $label])) {
                        array_push($this->p_tags, [
                            'tag_name' => $label,
                            'slug'     => $this->strings::safeString($label),
                            'pages'    => $this->tagPages($label, $pages),
                        ]);
                    }
                }
            }
        }
        $global  = $this->settings->getGlobal();
        $tagData = [];

        $pageInfo = [
            'keywords' => isset($global['keywords'])
            ? $global['keywords']
            : 'fipamo, blog, jamstack, php, markdown, js',
            'menu'          => $this->settings->getMenu(),
            'tags'          => $this->settings->getTags(),
            'description'   => $global['descriptions'],
            'image'         => $global['base_url'] . $global['background'],
            'baseURL'       => $global['base_url'],
            'dynamicRender' => $global['dynamicRender'],
        ];
        $tagData = [
            'tags' => $this->p_tags,
            'info' => $pageInfo,
        ];
        return $tagData;
    }

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

        return $tagged;
    }

    public function archive()
    {
        $pages   = $this->contents->loadAllPages();
        $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($this->p_archive, [
                'year'      => $year['year'],
                'year_data' => $sorted,
            ]);
        }
        $global       = $this->settings->getGlobal();
        $archive_data = [];
        $pageInfo     = [
            'keywords' => isset($global['keywords'])
            ? $global['keywords']
            : 'fipamo, blog, jamstack, php, markdown, js',
            'menu'          => $this->settings->getMenu(),
            'tags'          => $this->settings->getTags(),
            'description'   => $global['descriptions'],
            'image'         => $global['base_url'] . $global['background'],
            'baseURL'       => $global['base_url'],
            'dynamicRender' => $global['dynamicRender'],
        ];
        $archiveData = [
            'archive' => $this->p_archive,
            'info'    => $pageInfo,
        ];

        return $archiveData;
    }

    public function page($page)
    {
        $global      = $this->settings->getGlobal();
        $pageOptions = [];

        $pageInfo = [
            'keywords' => isset($global['keywords'])
            ? $global['keywords']
            : 'fipamo, blog, jamstack, php, markdown, js',
            'description' => $global['descriptions'],
            'image'       => $global['base_url'] . $global['background'],
            'baseURL'     => $global['base_url'],
        ];
        $tags = [];
        if (isset($page['tags'])) {
            $taglist = explode(',', $page['tags']);
            foreach ($taglist as $tag) {
                $label = trim($tag);
                array_push($tags, [
                    'label' => $label . ' ',
                    'slug'  => $this->strings->safeString($label),
                ]);
            }
        }
        $meta = [
            'who'  => $page['author'],
            'when' => $page['created'],
            'tags' => $tags,
        ];
        // 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;
                }
            }
        }
        $recent   = [];
        $featured = [];
        $limit    = 4;
        $pages    = $this->contents->loadAllPages();
        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'],
            'meta'          => $meta,
            'recent'        => $recent,
            'featured'      => $featured,
            'info'          => $pageInfo,
            'menu'          => $this->settings->getMenu(),
            'dynamicRender' => $global['dynamicRender'],
            'media'         => $page['media'],
            'files'         => $page['docs'],
            'tags'          => $meta['tags'],
        ];
        return $pageOptions;
    }

    public function settings()
    {
        $global      = $this->settings->getGlobal();
        $email       = $this->settings->getEmail();
        $updated     = new Carbon($global['last_backup']);
        $status      = session('member') != '' ? true : false;
        $pageOptions = [
            'title'               => 'Settings',
            'private'             => $global['private'],
            'renderOnSave'        => $global['renderOnSave'],
            'background'          => $global['background'],
            'member'              => session('member'),
            'ftoken'              => session('form_token'),
            'siteTitle'           => $global['title'],
            'baseUrl'             => $global['base_url'],
            'desc'                => $global['descriptions'],
            'lastBackup'          => $updated->format('Y M D d'),
            'currentTheme'        => $global['theme'],
            'themes'              => $this->themes->getThemes(),
            'apiStatus'           => isset($global['externalAPI']) ? $global['externalAPI'] : 'false',
            'dynamicRenderStatus' => isset($global['dynamicRender']) ? $global['dynamicRender'] : 'false',
            'mailOption'          => $email['active'],
            'mailConfig'          => $email,
            'status'              => $status,
        ];
        return $pageOptions;
    }
}