/**
 * All rights reserved. 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.jivesoftware.smackx.pubsub.provider;

import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.provider.PacketExtensionProvider;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smack.util.PacketParserUtils;
import org.jivesoftware.smackx.pubsub.Item;
import org.jivesoftware.smackx.pubsub.PayloadItem;
import org.jivesoftware.smackx.pubsub.SimplePayload;
import org.jivesoftware.smackx.pubsub.packet.PubSubNamespace;
import org.xmlpull.v1.XmlPullParser;

/**
 * Parses an <b>item</b> element as is defined in both the {@link PubSubNamespace#BASIC} and {@link PubSubNamespace#EVENT}
 * namespaces.  To parse the item contents, it will use whatever {@link PacketExtensionProvider} is registered in
 * <b>smack.providers</b> for its element name and namespace.  If no provider is registered, it will return a {@link SimplePayload}.
 *
 * @author Robin Collier
 */
public class ItemProvider implements PacketExtensionProvider {
    public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
        String id = parser.getAttributeValue(null, "id");
        String node = parser.getAttributeValue(null, "node");
        String elem = parser.getName();

        int tag = parser.next();

        if (tag == XmlPullParser.END_TAG) {
            return new Item(id, node);
        } else {
            String payloadElemName = parser.getName();
            String payloadNS = parser.getNamespace();

            if (ProviderManager.getInstance().getExtensionProvider(payloadElemName, payloadNS) == null) {
                StringBuilder payloadText = new StringBuilder();
                boolean done = false;
                boolean isEmptyElement = false;

                // Parse custom payload
                while (!done) {
                    if (tag == XmlPullParser.END_TAG && parser.getName().equals(elem)) {
                        done = true;
                    } else if (parser.getEventType() == XmlPullParser.START_TAG) {
                        payloadText.append("<").append(parser.getName());
                        if (parser.getName().equals(payloadElemName) && (!"".equals(payloadNS))) {
                            payloadText.append(" xmlns=\"").append(payloadNS).append("\"");
                        }
                        int n = parser.getAttributeCount();
                        for (int i = 0; i < n; i++) {
                            payloadText.append(" ").append(parser.getAttributeName(i)).append("=\"")
                                    .append(parser.getAttributeValue(i)).append("\"");
                        }
                        if (parser.isEmptyElementTag()) {
                            payloadText.append("/>");
                            isEmptyElement = true;
                        } else {
                            payloadText.append(">");
                        }
                    } else if (parser.getEventType() == XmlPullParser.END_TAG) {
                        if (isEmptyElement) {
                            isEmptyElement = false;
                        } else {
                            payloadText.append("</").append(parser.getName()).append(">");
                        }
                    } else if (parser.getEventType() == XmlPullParser.TEXT) {
                        payloadText.append(parser.getText());
                    }

                    tag = parser.next();
                }
                return new PayloadItem<SimplePayload>(id, node, new SimplePayload(payloadElemName, payloadNS,
                        payloadText.toString()));
            } else {
                return new PayloadItem<PacketExtension>(id, node, PacketParserUtils.parsePacketExtension(
                        payloadElemName, payloadNS, parser));
            }
        }
    }
}
