/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright 2008 jOpenDocument, by ILM Informatique. All rights reserved.
 * 
 * The contents of this file are subject to the terms of the GNU
 * General Public License Version 3 only ("GPL").  
 * You may not use this file except in compliance with the License. 
 * You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
 * See the License for the specific language governing permissions and limitations under the License.
 * 
 * When distributing the software, include this License Header Notice in each file.
 * 
 */

package org.jopendocument.dom.template.statements;

import org.jopendocument.dom.template.TemplateException;
import org.jopendocument.dom.template.engine.DataModel;
import org.jopendocument.dom.template.engine.Processor;

import java.util.ArrayList;
import java.util.List;

import org.jdom.Content;
import org.jdom.Element;

/**
 * If tag: conditionally displays a document element. <br>
 * Attributes:
 * <ul>
 * <li><b>element </b> (required): the document element to which this tag applies, e.g. "table-row"
 * </li>
 * <li><b>test </b> (required): expression that must be true for the element to be displayed</li>
 * </ul>
 */
public class If extends BaseStatement {

    public If() {
        super("if");
    }

    @SuppressWarnings("unchecked")
    public void prepare(Element script, Element command) throws TemplateException {
        String elementName = command.getAttributeValue("element");
        if (elementName == null)
            throw new TemplateException("missing required attribute for if tag: element");
        String testExpression = command.getAttributeValue("test");
        if (testExpression == null)
            throw new TemplateException("missing required attribute for if tag: test");
        Element target = getAncestorByName(script, elementName);
        if (target == null) {
            throw new TemplateException("no such element enclosing if tag: " + elementName + " for expression: " + testExpression);
        }
        Element parent = target.getParentElement();
        // Element ifTag = parent.addElement(getQName("if")).addAttribute("test",
        // testExpression);
        // parent.remove(ifTag);
        final Element ifTag = getElement(this.getName()).setAttribute("test", testExpression);
        int index = parent.indexOf(target);
        target.detach();
        parent.getContent().add(index, ifTag);
        ifTag.addContent(target);

        script.detach();
    }

    @SuppressWarnings("unchecked")
    public void execute(Processor processor, Element tag, DataModel model) throws TemplateException {
        String testExpression = tag.getAttributeValue("test");
        if (testExpression != null) {
            Object value = model.eval(testExpression);
            if (Boolean.TRUE.equals(value)) {
                final List<Content> parentContent = tag.getParentElement().getContent();
                final int index = parentContent.indexOf(tag);

                // copy cause the list is live, and we're about to remove its content
                final List<Element> children = new ArrayList<Element>(tag.getChildren());
                // change the parent of the children
                parentContent.addAll(index, tag.removeContent());
                // then transform, see ForEach
                for (final Element target : children) {
                    processor.transform(target);
                    removeSection(target);
                }
            }
        }
        tag.detach();
    }

}