package com.wix.rt.codeInsight;

import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.source.xml.XmlDocumentImpl;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ArrayUtil;
import com.intellij.xml.XmlAttributeDescriptor;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.XmlElementsGroup;
import com.intellij.xml.XmlNSDescriptor;
import com.intellij.xml.impl.schema.AnyXmlAttributeDescriptor;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;

/**
 * rt-require tag descriptor
 */
public class RTClassTagDescriptor implements XmlElementDescriptor {

    private final String name;
    private final PsiElement psiElement;

    public RTClassTagDescriptor(String name, PsiElement psiElement) {
        this.name = name;
        this.psiElement = psiElement;
    }

    @Override
    public String getQualifiedName() {
        return name;
    }

    @Override
    public String getDefaultName() {
        return name;
    }

    @Override
    public XmlElementDescriptor[] getElementsDescriptors(XmlTag context) {
        XmlDocumentImpl xmlDocument = PsiTreeUtil.getParentOfType(context, XmlDocumentImpl.class);
        if (xmlDocument == null) return EMPTY_ARRAY;
        return xmlDocument.getRootTagNSDescriptor().getRootElementsDescriptors(xmlDocument);
    }

    @Override
    public XmlElementDescriptor getElementDescriptor(XmlTag childTag, XmlTag contextTag) {
        XmlTag parent = contextTag.getParentTag();
        if (parent == null) return null;
        final XmlNSDescriptor descriptor = parent.getNSDescriptor(childTag.getNamespace(), true);
        return descriptor == null ? null : descriptor.getElementDescriptor(childTag);
    }

//    @Override
//    public XmlAttributeDescriptor[] getAttributesDescriptors(@Nullable XmlTag context) {
//        final String string = getDeclaration().getIndexItem().getTypeString();
//        final String attributes = string.split(";", -1)[3];
//        final String[] split = attributes.split(",");
//        final XmlAttributeDescriptor[] result;
//        if (split.length == 1 && split[0].isEmpty()) {
//            result = XmlAttributeDescriptor.EMPTY;
//        } else {
//            result = new XmlAttributeDescriptor[split.length];
//            for (int i = 0; i < split.length; i++) {
//                result[i] = new AnyXmlAttributeDescriptor(DirectiveUtil.getAttributeName(split[i]));
//            }
//        }
//
//        final XmlAttributeDescriptor[] commonAttributes = RelaxedHtmlFromSchemaElementDescriptor.getCommonAttributeDescriptors(context);
//        return RelaxedHtmlFromSchemaElementDescriptor.addAttrDescriptorsForFacelets(context, ArrayUtil.mergeArrays(result, commonAttributes));
//    }

    @Override
    public XmlAttributeDescriptor[] getAttributesDescriptors(@Nullable XmlTag context) {
        // final Project project = xmlTag.getProject();
//        final Map<String, XmlAttributeDescriptor> result = new LinkedHashMap<String, XmlAttributeDescriptor>();
//        result.put(RTTagDescriptorsProvider.DEPENDENCY, new RTXmlAttributeDescriptor2(RTTagDescriptorsProvider.DEPENDENCY));
//        result.put(RTTagDescriptorsProvider.AS, new RTXmlAttributeDescriptor2(RTTagDescriptorsProvider.AS));
        // <rt-require dependency="./CodeMirrorEditor" as="CodeEditor"/>
//        return result.values().toArray(new XmlAttributeDescriptor[result.size()]);
        return new XmlAttributeDescriptor[0];
    }

    @Nullable
    @Override
    public XmlAttributeDescriptor getAttributeDescriptor(XmlAttribute attribute) {
        return getAttributeDescriptor(attribute.getName(), attribute.getParent());
    }

    @Nullable
    @Override
    public XmlAttributeDescriptor getAttributeDescriptor(@NonNls final String attributeName, @Nullable XmlTag context) {
        return new AnyXmlAttributeDescriptor(attributeName);
//        return ContainerUtil.find(getAttributesDescriptors(context), new Condition<XmlAttributeDescriptor>() {
//            @Override
//            public boolean value(XmlAttributeDescriptor descriptor) {
//                return attributeName.equals(descriptor.getName());
//            }
//        });
    }

    @Override
    public XmlNSDescriptor getNSDescriptor() {
        return null;
    }

    @Nullable
    @Override
    public XmlElementsGroup getTopGroup() {
        return null;
    }

    @Override
    public int getContentType() {
        return CONTENT_TYPE_ANY;
    }

    @Nullable
    @Override
    public String getDefaultValue() {
        return null;
    }

//    @Override
//    public JSNamedElementProxy getDeclaration() {
//        return myDeclaration;
//    }

    @Override
    public PsiElement getDeclaration() {
        return psiElement;
    }

    @Override
    public String getName(PsiElement context) {
        return getName();
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void init(PsiElement element) {
    }

    @Override
    public Object[] getDependences() {
        return ArrayUtil.EMPTY_OBJECT_ARRAY;
    }
}