package com.flicklib.tools;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import net.htmlparser.jericho.Element;

public class SimpleXPath implements Iterable<Element> {
    List<Element> root;

    public SimpleXPath() {
        this.root = new ArrayList<Element>();
    }

    public SimpleXPath(List<Element> root) {
        this.root = root;
    }

    public SimpleXPath(Element element) {
        this();
        this.add(element);
    }

    public void add(Element el) {
	if (el == null) {
	    throw new NullPointerException("Trying to add null!");
	}
        this.root.add(el);
    }

    public void addAll(Collection<Element> el) {
	for (Element e: el) {
	    if (e!=null) {
		root.add(e);
	    } else {
		throw new NullPointerException("Trying to add null!");
	    }
	}
        this.root.addAll(el);
    }

    public SimpleXPath getTags(String tagName) {
        SimpleXPath xp = new SimpleXPath();
        for (Element e : root) {
            xp.addAll(e.getAllElements(tagName));
        }
        return xp;
    }

    public SimpleXPath getAllTagByAttributes(String attribName, String attribValue) {
        SimpleXPath xp = new SimpleXPath();
        for (Element e : root) {
            xp.addAll(e.getAllElements(attribName, attribValue, true));
        }
        return xp;
    }
    
    public SimpleXPath filter(String attribName, String attribValue) {
        SimpleXPath xp = new SimpleXPath();
        if (attribValue != null) {
            for (Element e : root) {
                if (attribValue.equals(e.getAttributeValue(attribName))) {
                    xp.add(e);
                }
            }
        } else {
            for (Element e : root) {
                if (e.getAttributeValue(attribName)==null) {
                    xp.add(e);
                }
            }
        }
        return xp;
    }
    
    public SimpleXPath filterTagName(String tagName) {
        SimpleXPath xp = new SimpleXPath();
        for (Element e : root) {
            if (tagName.equals(e.getName())) {
                xp.add(e);
            }
        }
        return xp;
    }
    
    public SimpleXPath parentTagName(String tagName) {
        SimpleXPath xp = new SimpleXPath();
        for (Element e : root) {
            if (tagName.equals(e.getParentElement().getName())) {
                xp.add(e);
            }
        }
        return xp;
    }
    
    public SimpleXPath children() {
        SimpleXPath xp = new SimpleXPath();
        for (Element e : root) {
            xp.addAll(e.getChildElements());
        }
        return xp;
    }

    public SimpleXPath parent() {
        SimpleXPath xp = new SimpleXPath();
        for (Element e : root) {
            xp.add(e.getParentElement());
        }
        return xp;
    }

    public SimpleXPath first() {
        if (root.size() > 0) {
            return new SimpleXPath(root.get(0));
        }
        return this;
    }
    
    public Element firstElement() {
	if (root.size() > 0) {
	    return root.get(0);
	}
	return null;
    }

    public boolean isEmpty() {
        return root.isEmpty();
    }

    /**
     * @return
     * @see java.util.List#size()
     */
    public int size() {
        return root.size();
    }

    /**
     * @return
     * @see java.util.List#iterator()
     */
    public Iterator<Element> iterator() {
        return root.iterator();
    }
    
    public Iterable<Element> iterable() {
	    return root;
    }

    public List<Element> toList() {
        return root;
    }
    
    /**
     * 
     * @see java.util.List#clear()
     */
    public void clear() {
        root.clear();
    }

    /**
     * @param index
     * @return
     * @see java.util.List#get(int)
     */
    public Element get(int index) {
        return root.get(index);
    }
    
    public Element unique() {
	    if (root.size() == 1) {
		    return root.get(0);
	    } else {
		    throw new RuntimeException("Element list is not unique, size:"+root.size()+"\n content:"+root);
	    }
    }
    
    public String getValue() {
	    if (root.size() > 0) {
		    return root.get(0).getTextExtractor().toString();
	    }
	    return null;
    }

    @Override
    public String toString() {

        return "XPath[" + root.toString() + "]";
    }

}

@@ -843,38 +843,8 @@
 %0A%09%7D%0A
-        this.root.addAll(el);%0A
     

fix accidentally left code