<?php
use function _\find;
use function _\pull;
use function _\remove;
class Settings
{
  private $folks;
  private $tags;
  private $themes = [];
  private static $settings;

  public function __construct()
  {
    //gets all settings files and converts to php objects
    $this->folks = json_decode(file_get_contents("../config/folks.json"), true);
    $this->tags = json_decode(file_get_contents("../config/tags.json"), true);
    self::$settings = json_decode(
      file_get_contents("../config/settings.json"),
      true
    );

    $_themes = glob("../content/themes/*", GLOB_ONLYDIR);
    foreach ($_themes as $theme) {
      array_push(
        $this->themes,
        json_decode(file_get_contents($theme . "/theme.json"), true)
      );
    }
  }

  public static function sync($data)
  {
    $settings = self::$settings;
    $settings["global"]["base_url"] = $data["global"]["base_url"];
    $settings["global"]["title"] = $data["global"]["title"];
    $settings["global"]["descriptions"] = $data["global"]["descriptions"];
    $settings["global"]["base_url"] = $data["global"]["base_url"];
    $settings["global"]["private"] = $data["global"]["private"];
    $settings["global"]["renderOnSave"] = $data["global"]["renderOnSave"];
    $settings["global"]["theme"] = $data["global"]["theme"];

    Member::updateData("handle", $data["member"]["handle"]);
    Member::updateData("email", $data["member"]["email"]);

    $settings["email"]["active"] = $data["email"]["active"];
    $settings["email"]["smtp"] = $data["email"]["smtp"];
    $settings["email"]["mailgun"] = $data["email"]["mailgun"];

    DocTools::writeSettings("../config/settings.json", $settings);
  }

  public static function navSync($data)
  {
    $settings = self::$settings;

    $remove = $data["remove"];
    //if remove contains id, find nav item page and set menu to false
    if ($remove != null || $remove != "") {
      $page = (new Book("../content/pages"))->findPageById($remove);
      $page["menu"] = "false";
      $page["published"]
        ? ($page["published"] = "true")
        : ($page["published"] = "false");
      $page["featured"]
        ? ($page["featured"] = "true")
        : ($page["featured"] = "false");
      $page["deleted"]
        ? ($page["deleted"] = "true")
        : ($page["deleted"] = "false");
      $updated = new \Moment\Moment();
      $created = new \Moment\Moment($page["rawCreated"]);
      $page["created"] = $created->format("Y-m-d\TH:i:sP");
      $page["updated"] = $updated->format("Y-m-d\TH:i:sP");

      $md = DocTools::objectToMD($page);

      if ($page["layout"] == "index") {
        $writePath = "../content/pages/start/index.md";
      } else {
        $writePath =
          "../content/pages/" . $page["path"] . "/" . $page["slug"] . ".md";
      }

      DocTools::writePages("write", $page["path"], $writePath, $md);
    }

    $settings["menu"] = [];
    $items = $data["menu"];
    foreach ($items as $item) {
      array_push($settings["menu"], [
        "title" => $item["title"],
        "id" => $item["id"],
        "uuid" => $item["uuid"],
        "slug" => $item["slug"],
        "path" => $item["path"],
      ]);
    }

    DocTools::writeSettings("../config/settings.json", $settings);
  }

  public function getThemes()
  {
    return $this->themes;
  }

  public function getFolks($key = null)
  {
    if (isset($key)) {
      $member = Session::get("member");
      $found = find($this->folks, ["handle" => $member["handle"]]);
      if ($found) {
        return $found[$key];
      }
    } else {
      return $this->folks;
    }
  }

  public function getSettings($key = null)
  {
    return self::$settings;
  }

  public static function updateGlobalData($key, $data)
  {
    $settings = self::$settings;
    $settings["global"][$key] = $data;
    DocTools::writeSettings("../config/settings.json", $settings);
  }

  public static function getCurrentIndex()
  {
    $settings = self::$settings;
    return $settings["library_stats"]["current_index"];
  }

  public static function updateIndex()
  {
    $settings = self::$settings;

    $settings["library_stats"]["current_index"] =
      $settings["library_stats"]["current_index"] + 1;

    DocTools::writeSettings("../config/settings.json", $settings);
  }

  public static function updateMenu($body)
  {
    $settings = self::$settings;
    //$menu = $settings["menu"];
    $item = [
      "title" => $body["title"],
      "id" => $body["id"],
      "uuid" => $body["uuid"],
      "slug" => $body["slug"],
      "path" => $body["path"],
    ];
    if ($body["menu"] == "true") {
      if (!find($settings["menu"], ["uuid" => $item["uuid"]])) {
        array_push($settings["menu"], $item);
      }
    } else {
      if (find($settings["menu"], ["uuid" => $item["uuid"]])) {
        pull($settings["menu"], $item);
      }
    }
    DocTools::writeSettings("../config/settings.json", $settings);
  }

  public static function makeBackup()
  {
    //make sure back directory is there
    if (!is_dir("../config/backups")) {
      mkdir("../config/backups", 0755, true);
    }
    //creat backup zip
    $zip = new ZipArchive();
    $zip->open(
      "../config/backups/latest_back.zip",
      ZipArchive::CREATE | ZipArchive::OVERWRITE
    );
    //gather data and path info for md pages
    $pagePath = "../content/pages";
    $yearPaths = glob($pagePath . "/*", GLOB_ONLYDIR);
    foreach ($yearPaths as $years) {
      $year = explode("/", $years);
      //grap the index and save it
      if (trim($year[3]) == "start") {
        $options = [
          "add_path" => "content/pages/" . $year[3] . "/",
          "remove_all_path" => true,
        ];
        $zip->addGlob($years . "/*.md", GLOB_BRACE, $options);
      }
      $monthsPath = glob($pagePath . "/" . $year[3] . "/*", GLOB_ONLYDIR);
      foreach ($monthsPath as $months) {
        $month = explode("/", $months);
        //once info is collected, add md pages to zip
        $options = [
          "add_path" => "content/pages/" . $year[3] . "/" . $month[4] . "/",
          "remove_all_path" => true,
        ];
        $zip->addGlob($months . "/*.md", GLOB_BRACE, $options);
      }
    }

    //tather data and path info for blog images
    $blogImagesPath = "../public/assets/images/blog";
    $yearPaths = glob($blogImagesPath . "/*", GLOB_ONLYDIR);
    foreach ($yearPaths as $years) {
      $year = explode("/", $years);
      $monthsPath = glob($blogImagesPath . "/" . $year[5] . "/*", GLOB_ONLYDIR);
      foreach ($monthsPath as $months) {
        $month = explode("/", $months);
        //once info is collected, add images pages to zip
        $options = [
          "add_path" =>
            "public/assets/images/blog/" . $year[5] . "/" . $month[6] . "/",
          "remove_all_path" => true,
        ];
        $zip->addGlob($months . "/*.*", GLOB_BRACE, $options);
      }
    }

    //add directory for settings and save them
    $zip->addEmptyDir("settings");
    $zip->addFile("../config/settings.json", "settings/settings.json");
    $zip->addFile("../config/folks.json", "settings/folks.json");
    $zip->addFile("../config/tags.json", "settings/tags.json");
    //save zip file
    $zip->close();

    //update settings file with latest back up date
    $updated = new \Moment\Moment();
    self::updateGlobalData("last_backup", $updated->format("Y-m-d\TH:i:sP"));

    $result = ["message" => "Backup created. THIS IS A SAFE SPACE!"];
    return $result;
  }

  public static function updateTags()
  {
    $tags = Sorting::tags();
    DocTools::writeSettings("../config/tags.json", $tags);
  }
}