/*
 * Copyright 2005 Sascha Weinreuter
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.intellij.lang.xpath.xslt.psi.impl;

import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.xml.XmlChildRole;
import com.intellij.psi.xml.XmlTag;
import org.intellij.lang.xpath.xslt.XsltSupport;
import org.intellij.lang.xpath.xslt.psi.XsltElement;
import org.intellij.lang.xpath.xslt.psi.XsltElementFactory;
import org.jetbrains.annotations.Nullable;

class XsltElementFactoryImpl extends XsltElementFactory {
    private static final Key<Pair<ASTNode, XsltElement>> WRAPPER = Key.create("WRAPPER");

    @SuppressWarnings({ "unchecked" })
    public XsltElement wrapElement(XmlTag target) {
        return wrapElement(target, XsltElement.class);
    }

    @Override
    public <T extends XsltElement> T wrapElement(XmlTag target, Class<T> clazz) {
        assert target.isValid();

        final Pair<ASTNode, XsltElement> wrapper = target.getUserData(WRAPPER);
        final ASTNode tagNode = target.getNode();
        final ASTNode nameNode = tagNode != null ? XmlChildRole.START_TAG_NAME_FINDER.findChild(tagNode) : null;
        if (wrapper != null) {
            if (wrapper.getFirst() == nameNode) {
                if (wrapper.second.isValid() && clazz.isAssignableFrom(wrapper.second.getClass())) {
                    return clazz.cast(wrapper.second);
                }
            }
        }
        assert XsltSupport.isXsltTag(target) : "Not an XSLT tag: {" + target.getNamespace() + "}" + target.getName();

        final XsltElement element;
        if (XsltSupport.isTemplate(target, false)) {
            element = new XsltTemplateImpl(target);
        } else if (XsltSupport.isVariable(target)) {
            element = new XsltVariableImpl(target);
        } else if (XsltSupport.isParam(target)) {
            element = new XsltParameterImpl(target);
        } else if (XsltSupport.isTemplateCall(target)) {
            element = new XsltCallTemplateImpl(target);
        } else if (XsltSupport.isApplyTemplates(target)) {
            element = new XsltApplyTemplatesImpl(target);
        } else if ("with-param".equals(target.getLocalName())) {
            element = new XsltWithParamImpl(target);
        } else if (XsltSupport.isXsltRootTag(target)) {
            element = new XsltStylesheetImpl(target);
        } else if (XsltSupport.isFunction(target)) {
            element = new XsltFunctionImpl(target);
        } else {
            element = new DummyElementImpl(target);
        }

        if (!(element instanceof DummyElementImpl)) {
            target.putUserData(WRAPPER, Pair.create(nameNode, element));
        }
        return clazz.cast(element);
    }

    private static class DummyElementImpl extends XsltElementImpl {
        public DummyElementImpl(XmlTag target) {
            super(target);
        }

        @Nullable
        public String toString() {
            return "Unrecognized tag: " + getTag().getName();
        }
    }
}
