<?php
/**
 * Created by IntelliJ IDEA.
 * User: onigoetz
 * Date: 06/11/15
 * Time: 20:27
 */
namespace Todaymade\Daux\Format\Base;

use DOMDocument;
use Todaymade\Daux\DauxHelper;
use Todaymade\Daux\Tree\Content;
use Todaymade\Daux\Tree\Root;

class EmbedImages
{
    protected $tree;

    public function __construct(Root $tree)
    {
        $this->tree = $tree;
    }

    public function embed($page, Content $file, $callback)
    {
        return preg_replace_callback(
            "/<img\\s+[^>]*src=['\"]([^\"]*)['\"][^>]*>/",
            function($matches) use ($file, $callback) {
                if ($result = $this->findImage($matches[1], $matches[0], $file, $callback)) {
                    return $result;
                }

                return $matches[0];
            },
            $page
        );
    }

    private function getAttributes($tag)
    {
        $dom = new DOMDocument();
        $dom->loadHTML($tag);

        $img = $dom->getElementsByTagName('img')->item(0);

        $attributes = ['align', 'class', 'title', 'style', 'alt', 'height', 'width'];
        $used = [];
        foreach ($attributes as $attr) {
            if ($img->attributes->getNamedItem($attr)) {
                $used[$attr] = $img->attributes->getNamedItem($attr)->value;
            }
        }

        return $used;
    }

    private function findImage($src, $tag, Content $file, $callback)
    {
        //for protocol relative or http requests : keep the original one
        if (substr($src, 0, strlen('http')) === 'http' || substr($src, 0, strlen('//')) === '//') {
            return $src;
        }

        //Get the path to the file, relative to the root of the documentation
        $url = DauxHelper::getCleanPath(dirname($file->getUrl()) . '/' . $src);

        //Get any file corresponding to the right one
        $file = DauxHelper::getFile($this->tree, $url);


        if ($file === false) {
            return false;
        }

        $result = $callback($src, $this->getAttributes($tag), $file);

        return $result ?: $src;
    }
}
