<?php

namespace App\Services;

use function _\filter;

class PaginateService
{
    protected $content;

    public function __construct(ContentService $contentService)
    {
        $this->content = $contentService;
    }

    public function getPage(int $page, int $limit, string $sort = null)
    {
        $content = $this->content->loadAllPages();

        $published = filter($content, function ($item) {
            return $item['published'] == true && $item['deleted'] == false;
        });
        $deleted = filter($content, function ($item) {
            return $item['deleted'] == true;
        });

        // $all = $content;
        $all = filter($content, function ($item) {
            return $item['deleted'] == false;
        });
        $filter = isset($sort) ? $sort : 'all';
        switch ($filter) {
            case 'published':
                $filtered = $published;
                break;
            case 'deleted':
                $filtered = $deleted;
                break;
            default:
                $filtered = $all;
                break;
        }
        $numOfPages = ceil(count($filtered) / ($limit + 1));
        $folder     = [];

        if (count($filtered) != 0) {
            if (count($filtered) < $limit) {
                $limit = count($filtered) - 1;
            }
            $range = $page * $limit - $limit;

            if ($range != 0) {
                $range = $range + 1;
            }
            for ($i = 0; $i <= $limit; ++$i) {
                if (isset($filtered[$i + $range])) {
                    array_push($folder, $filtered[$i + $range]);
                } else {
                    // chill out
                }
            }
        }

        $prev = $page - 1;
        if ($prev <= 0) {
            $prev = $numOfPages;
        }

        $next = $page + 1;
        if ($next > $numOfPages) {
            $next = 1;
        }

        return [
            'pages'      => $folder,
            'numOfPages' => $numOfPages,
            'entryCount' => count($filtered),
            'paginate'   => [
                'sort'     => $sort,
                'nextPage' => $next,
                'prevPage' => $prev,
            ],
            'stats' => [
                'all'       => count($all),
                'published' => count($published),
                'deleted'   => count($deleted),
            ],
        ];
    }
}