<?php
use Mni\FrontYAML\Parser;
use function _\find;
use function _\filter;

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"],
        ]);
      }
    }

    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",
      "h1",
      "h2",
      "h3",
      "pre",
      "code",
    ]);
    //$cleaned = preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $cleaned);
    //$cleaned = html_entity_decode($cleaned, ENT_QUOTES, "UTF-8");

    //if page feature isn't empty, replace page info meta image
    if ($page["feature"] != "" || $page["feature"] != null) {
      $pageInfo["image"] = $pageInfo["baseURL"] . $page["feature"];
    }

    if ($page["layout"] == "index") {
      //$template = $this->theme . "/index.twig";
      //$location = "../public/index.html";
      //$dir = null;

      $recent = [];
      $featured = [];
      $limit = 4;
      $pages = (new Book("../content/pages"))->getContents();
      foreach ($pages as $item) {
        //TODO: Move page data organization to render to utility class
        if (!$item["deleted"] && $item["published"]) {
          if (count($recent) < $limit) {
            array_push($recent, [
              "path" => $item["path"],
              "slug" => $item["slug"],
              "title" => $item["title"],
            ]);
          }

          if ($item["featured"] == true) {
            if (count($featured) < $limit) {
              array_push($featured, [
                "path" => $item["path"],
                "slug" => $item["slug"],
                "title" => $item["title"],
              ]);
            }
          }
        }
      }

      $pageOptions = [
        "title" => $page["title"],
        "background" => $page["feature"],
        "content" => $cleaned,
        "meta" => $meta,
        "recent" => $recent,
        "featured" => $featured,
        "info" => $pageInfo,
        "menu" => $settings["menu"],
        "dynamicRender" => $settings["global"]["dynamicRender"],
      ];
    } 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" => $cleaned,
        "meta" => $meta,
        "info" => $pageInfo,
        "menu" => $settings["menu"],
        "dynamicRender" => $settings["global"]["dynamicRender"],
      ];
    }
    return $pageOptions;
  }
}