<?php

use Mni\FrontYAML\Parser;
use function _\orderBy;
use function _\filter;
use function _\find;

class Book
{
  public $files = [];

  public function __construct($folder)
  {
    $this->read($folder);
  }
  public function read($folder)
  {
    $folders = glob("$folder/*", GLOB_ONLYDIR);
    foreach ($folders as $folder) {
      //$this->files[] = $folder . "/";
      $this->read($folder);
    }
    $files = array_filter(glob("$folder/*md"), "is_file");
    foreach ($files as $file) {
      $this->files[] = $file;
    }
  }

  public function findPageById(string $uuid)
  {
    $content = $this->getContents();
    $page = find($content, ["uuid" => $uuid]);
    return $page;
  }

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

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

    $all = $content;

    $filter = isset($sort) ? $sort : "all";

    //echo $filter;
    $filtered = [];
    switch ($filter) {
      case "published":
        $filtered = $published;
        break;
      case "deleted":
        $filtered = $deleted;
        break;
      default:
        $filtered = $content;
        break;
    }

    $numOfPages = ceil(count($filtered) / $limit);

    $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" => $filter,
        "nextPage" => $next,
        "prevPage" => $prev,
      ],
      "stats" => [
        "all" => count($all),
        "published" => count($published),
        "deleted" => count($deleted),
      ],
    ];
  }
  public function getContents()
  {
    $parser = new Parser();
    $contents = [];
    foreach ($this->files as $file) {
      $doc = $parser->parse(file_get_contents($file), false);

      $meta = $doc->getYAML();
      $page = [
        "id" => $meta["id"],
        "uuid" => $meta["uuid"],
        "title" => $meta["title"],
        "feature" => $meta["feature"],
        "path" => $meta["path"],
        "layout" => $meta["layout"],
        "tags" => $meta["tags"],
        "author" => $meta["author"],
        "created" => date("Y M D d", $meta["created"]),
        "updated" => date("Y M D d", $meta["updated"]),
        "deleted" => $meta["deleted"],
        "menu" => $meta["menu"],
        "featured" => $meta["featured"],
        "published" => $meta["published"],
        "slug" => $meta["slug"],
        "filePath" => $file,
        "content" => $doc->getContent(),
      ];

      //checks for duplicates
      $uuid = $meta["uuid"];
      $found = current(
        array_filter($contents, function ($item) use ($uuid) {
          return isset($item["uuid"]) && $uuid == $item["uuid"];
        })
      );

      // if uuid is not present, add it
      if (!$found) {
        array_push($contents, $page);
      }
    }
    $contents = orderBy($contents, ["id"], ["desc"]);
    return $contents;
  }
}