<?php namespace Todaymade\Daux\Tree;

use Todaymade\Daux\Daux;
use Todaymade\Daux\DauxHelper;

class Builder
{
    /**
     * Build the initial tree
     *
     * @param string $dir
     * @param array $ignore
     * @param \Todaymade\Daux\Config $params
     * @param array $parents
     * @return Directory|void
     */
    public static function build($dir, $ignore, $params, $parents = null)
    {
        if (!$dh = opendir($dir)) {
            return;
        }

        $node = new Directory($dir, $parents);

        $new_parents = $parents;
        if (is_null($new_parents)) {
            $new_parents = array();
        } else {
            $new_parents[] = $node;
        }

        while (($file = readdir($dh)) !== false) {
            if ($file == '.' || $file == '..') {
                continue;
            }

            $path = $dir . DS . $file;

            if (is_dir($path) && in_array($file, $ignore['folders'])) {
                continue;
            }
            if (!is_dir($path) && in_array($file, $ignore['files'])) {
                continue;
            }

            $entry = null;
            if (is_dir($path)) {
                $entry = static::build($path, $ignore, $params, $new_parents);
            } elseif (in_array(pathinfo($path, PATHINFO_EXTENSION), Daux::$VALID_MARKDOWN_EXTENSIONS)) {
                $entry = new Content($path, $new_parents);

                if ($params['mode'] === Daux::STATIC_MODE) {
                    $entry->setUri($entry->getUri() . '.html');
                }
            } else {
                $entry = new Raw($path, $new_parents);
            }

            if ($entry instanceof Entry) {
                $node->value[$entry->getUri()] = $entry;
            }
        }

        $node->sort();
        if (isset($node->value[$params['index_key']])) {
            $node->value[$params['index_key']]->setFirstPage($node->getFirstPage());
            $node->setIndexPage($node->value[$params['index_key']]);
        } else {
            $node->setIndexPage(false);
        }
        return $node;
    }

    /**
     * @param Entry $parent
     * @param String $title
     * @return Directory
     */
    public static function getOrCreateDir($parent, $title)
    {
        $slug = DauxHelper::slug($title);

        if (array_key_exists($slug, $parent->value)) {
            return $parent->value[$slug];
        }

        $dir = new Directory();
        $dir->setTitle($title);
        $dir->setUri($slug);
        $parent->value[$slug] = $dir;

        return $dir;
    }

    /**
     * @param array $parents
     * @param string $title
     * @return Content
     */
    public static function getOrCreatePage($parents, $title)
    {
        $slug = DauxHelper::slug($title);
        $uri = $slug . ".html";

        $nearestParent = end($parents);

        if (array_key_exists($uri, $nearestParent->value)) {
            return $nearestParent->value[$uri];
        }

        $page = new Content('', $parents);
        $page->setUri($uri);
        $page->setContent("-"); //set an almost empty content to avoid problems

        if ($title == 'index') {
            $page->setName('_index');
            $page->setTitle($nearestParent->getTitle());
            $page->value = 'index';
            $nearestParent->setIndexPage($page);
        } else {
            $page->setName($slug);
            $page->setTitle($title);
        }

        $nearestParent->value[$uri] = $page;

        return $page;
    }
}