package allen.town.podcast.core.export.opml;

import android.util.Log;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;

import allen.town.podcast.core.BuildConfig;

/** Reads OPML documents. */
public class OpmlReader {
	private static final String TAG = "OpmlReader";
	
	// ATTRIBUTES
	private boolean isInOpml = false;
	private ArrayList<OpmlElement> elementList;

	/**
	 * Reads an Opml document and returns a list of all OPML elements it can
	 * find
	 * 
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public ArrayList<OpmlElement> readDocument(Reader reader)
			throws XmlPullParserException, IOException {
		elementList = new ArrayList<>();
		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		factory.setNamespaceAware(true);
		XmlPullParser xpp = factory.newPullParser();
		xpp.setInput(reader);
		int eventType = xpp.getEventType();

		while (eventType != XmlPullParser.END_DOCUMENT) {
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				if (BuildConfig.DEBUG)
					Log.d(TAG, "Reached beginning of document");
				break;
			case XmlPullParser.START_TAG:
				if (xpp.getName().equals(OpmlSymbols.OPML)) {
					isInOpml = true;
					if (BuildConfig.DEBUG)
						Log.d(TAG, "Reached beginning of OPML tree.");
				} else if (isInOpml && xpp.getName().equals(OpmlSymbols.OUTLINE)) {
					if (BuildConfig.DEBUG)
						Log.d(TAG, "Found new Opml element");
					OpmlElement element = new OpmlElement();
					
					final String title = xpp.getAttributeValue(null, OpmlSymbols.TITLE);
					if (title != null) {
						Log.i(TAG, "Using title: " + title);
						element.setText(title);
					} else {
						Log.i(TAG, "Title not found, using text");
						element.setText(xpp.getAttributeValue(null, OpmlSymbols.TEXT));			
					}
					element.setXmlUrl(xpp.getAttributeValue(null, OpmlSymbols.XMLURL));
					element.setHtmlUrl(xpp.getAttributeValue(null, OpmlSymbols.HTMLURL));
					element.setType(xpp.getAttributeValue(null, OpmlSymbols.TYPE));
					if (element.getXmlUrl() != null) {
						if (element.getText() == null) {
							Log.i(TAG, "Opml element has no text attribute.");
							element.setText(element.getXmlUrl());
						}
						elementList.add(element);
					} else {
						if (BuildConfig.DEBUG)
							Log.d(TAG,
									"Skipping element because of missing xml url");
					}
				}
				break;
			}
			eventType = xpp.next();
		}

		if (BuildConfig.DEBUG)
			Log.d(TAG, "Parsing finished.");

		return elementList;
	}

}
