package ai.cogmission.fxmaps.xml;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

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

import com.stanfy.gsonxml.GsonXml;
import com.stanfy.gsonxml.GsonXmlBuilder;
import com.stanfy.gsonxml.XmlParserCreator;


public class GPXReader {
    /** {@link XmlParserCreator} creator */
    public static final XmlParserCreator PARSER_CREATOR = new XmlParserCreator() {
        @Override
        public XmlPullParser createParser() {
            try {
                final XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
                parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
                return parser;
            } catch (final Exception e) {
                throw new RuntimeException(e);
            }
        }
    };
    
    /** The reader used */
    private GsonXml reader;
    
    /**
     * Constructs a new GPXReader
     */
    public GPXReader() {
        reader = createGson(false);
    }

    /**
     * Returns a new {@link GsonXml} object for reading xml.
     * 
     * @param namespaces    flag indicating whether to use name spaces.
     * @return  a GsonXml object
     */
    public GsonXml createGson(final boolean namespaces) {
        return new GsonXmlBuilder().setSameNameLists(true).setXmlParserCreator(PARSER_CREATOR).setTreatNamespaces(namespaces).create();
    }
    
    /**
     * Returns an {@link GPXPersistentMap} object which models a 
     * given Route, Waypoint, Track
     * 
     * @param url   the location of the text source
     * @return      the persistent map
     */
    public GPXPersistentMap read(URL url) {
        try {
            return read(url.openStream());
        }catch(Exception e) { e.printStackTrace(); }
        
        return null;
    }
    
    /**
     * Returns an {@link GPXPersistentMap} object which models a 
     * given Route, Waypoint, Track
     * 
     * @param stream    the stream of text
     * @return          the persistent map
     */
    public GPXPersistentMap read(InputStream stream) {
        GPXPersistentMap map = null;
        try {
            BufferedReader buff = new BufferedReader(new InputStreamReader(stream));
            map = reader.fromXml(buff, GPXPersistentMap.class);
        }catch(Exception e) {
            e.printStackTrace();
        }
        
        return map;
    }
}