<?php
/**
 * Created by IntelliJ IDEA.
 * User: nosko
 * Date: 1/26/13
 * Time: 10:57 PM
 * To change this template use File | Settings | File Templates.
 */
class Parser {
 
    private $restaurants = array();
    private $logger;
 
    function __construct($logger, $restaurants) {
 
        // Check if logger implements iOutput interface
        if (  !in_array("iOutput", class_implements($logger)) ) {
            throw new InvalidArgumentException("Logger class must implement interface iOutput");
        }
 
        $this->logger = $logger;
 
        if (empty($restaurants) || !is_array($restaurants)) {
            throw new InvalidArgumentException("Array argument required");
        }
 
        $this->restaurants = $restaurants;
    }
 
    public function parse() {
        foreach ($this->restaurants as $restaurant) {
 
            $source = file_get_contents($restaurant->getUrl());
 
            if ($source === false) {
                throw new RuntimeException("Can't read source address: " . $restaurant->getUrl());
            }
 
            $dom = new DOMDocument();
            @$dom->loadHTML($source);
            $xpath_obj = new DOMXPath($dom);
 
            $this->logger->log("Restaurant: <a href='{$restaurant->getUrl()}'>" . $restaurant->getName() . "</a>".$this->logger->newLine());
 
            foreach ($restaurant->getXpaths() as $name => $xpath) {
 
                $found = $xpath_obj->query($xpath);
 
                if ($found === false || $found->length === 0) {
                    continue;
                }
 
                $this->logger->log("<b>$name</b>");
                $exists = false;
                foreach ($found->item(0)->childNodes as $elem) {
 
                    $meal = trim($elem->nodeValue);
                    if (!empty($meal)) {
                        $this->logger->log("\t<br>$meal\n");
                        $exists = true;
                    }
                }
                if (!$exists) {
                    $this->logger->log($this->logger->newLine()."{}");
                }
                $this->logger->log($this->logger->newLine());
            }
            $this->logger->log($this->logger->newLine());
        }
    }
}