package com.example.design.patterns.interpreter.xml;

import java.util.ArrayList;
import java.util.Collection;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;

/**
 * 元素作为非终结符对应的解释器，解释并执行中间元素
 */
public class ElementExpression extends AbstractElementExpression {

    private static final Logger LOGGER = LoggerFactory.getLogger(ElementExpression.class);

    /**
     * 用来记录组合的ReadXmlExpression元素
     */
    private Collection<AbstractElementExpression> elements = new ArrayList<AbstractElementExpression>();

    /**
     * 元素的名称
     */
    private String elementName = "";

    public ElementExpression(String elementName) {
        this.elementName = elementName;
    }

    public boolean addElement(AbstractElementExpression element) {
        this.elements.add(element);
        return true;
    }

    public boolean removeElement(AbstractElementExpression element) {
        this.elements.remove(element);
        return true;
    }

    @Override
    public String interpret(Context context) {
        // 先取出上下文里的当前元素作为父级元素
        // 查找到当前元素名称所对应的xml元素，并设置回到上下文中
        Element parentElement = context.getParentElement();
        if (parentElement == null) {
            // 说明现在获取的是根元素
            context.setParentElement(context.getDocument().getDocumentElement());
        } else {
            // 根据父级元素和要查找的元素的名称来获取当前的元素
            Element element = context.findElementFromParent(parentElement, elementName);
            LOGGER.info("find element : {}", element);
            // 把当前获取的元素放到上下文里面
            context.setParentElement(element);
        }

        // 调用第一个子元素的interpret方法
        for (AbstractElementExpression element : elements) {
            return element.interpret(context);
        }
        return null;
    }

    @Override
    public String toString() {
        return "ElementExpression{" +
                "elements=" + elements +
                ", elementName='" + elementName + '\'' +
                '}';
    }
}
