<?php
use League\CommonMark\Environment\Environment;
use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
use League\CommonMark\Extension\Strikethrough\StrikethroughExtension;
use League\CommonMark\Extension\Attributes\AttributesExtension;
use League\CommonMark\Extension\FrontMatter\FrontMatterExtension;
use League\CommonMark\Extension\FrontMatter\Output\RenderedContentWithFrontMatter;
use League\CommonMark\MarkdownConverter;
use League\CommonMark\CommonMarkConverter;
use function _\orderBy;

class Contents
{
  public $files = [];
  public $config = [];
  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;
    }
  }

  function getAll()
  {
    $environment = new Environment($this->config);
    $environment->addExtension(new CommonMarkCoreExtension());

    // Add the extension
    $environment->addExtension(new FrontMatterExtension());

    //Add Strikethrough rendering
    $environment->addExtension(new StrikethroughExtension());

    //add attributes to elements in markdown
    $environment->addExtension(new AttributesExtension());

    // Instantiate the converter engine and start converting some Markdown!
    $converter = new MarkdownConverter($environment);

    $contents = [];
    foreach ($this->files as $file) {
      //get meta and html from file
      $result = $converter->convertToHtml(file_get_contents($file));
      $meta = [];
      if ($result instanceof RenderedContentWithFrontMatter) {
        $meta = $result->getFrontMatter();
      }

      //get raw markdown from file
      $frontMatterExtension = new FrontMatterExtension();
      $parsed = $frontMatterExtension
        ->getFrontMatterParser()
        ->parse(file_get_contents($file));

      //never trust the front end. clean it up
      $sanitizer = HtmlSanitizer\Sanitizer::create([
        "extensions" => ["basic", "image", "list", "code"],
        "tags" => [
          "img" => [
            "allowed_attributes" => ["src", "alt", "title", "class"],
            "allowed_hosts" => null,
            "allow_relative_links" => true,
          ],
        ],
      ]);

      $scrubbed = $sanitizer->sanitize($result->getContent());

      //sort attributes into page object
      $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"]),
        "rawCreated" => $meta["created"],
        "rawUpdated" => $meta["updated"],
        "createdYear" => date("Y", $meta["created"]),
        "createdMonth" => date("m", $meta["created"]),
        "deleted" => $meta["deleted"],
        "menu" => $meta["menu"],
        "featured" => $meta["featured"],
        "published" => $meta["published"],
        "slug" => $meta["slug"],
        "filePath" => $file,
        "content" => $parsed->getContent(),
        "html" => $scrubbed,
      ];
      //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;
  }
}
