package nl.wldelft.timeseriesparsers;

import nl.wldelft.util.FastDateFormat;
import nl.wldelft.util.TextUtils;
import nl.wldelft.util.TimeZoneUtils;
import nl.wldelft.util.io.XmlParser;
import nl.wldelft.util.timeseries.DefaultTimeSeriesHeader;
import nl.wldelft.util.timeseries.TimeSeriesContentHandler;
import org.apache.log4j.Logger;

import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.util.Locale;

/**
 * Created with IntelliJ IDEA.
 * User: pelgrim
 * Date: 8/9/13
 * Time: 9:35 AM
 * To change this template use File | Settings | File Templates.
 */
public class LmwWeatherdataTimeSeriesParser implements XmlParser<TimeSeriesContentHandler> {
    private static final Logger log = Logger.getLogger(LmwWeatherdataTimeSeriesParser.class);
    private TimeSeriesContentHandler contentHandler = null;
    private XMLStreamReader reader = null;
    private DefaultTimeSeriesHeader header = null;
    private long time = Long.MIN_VALUE;
    private final FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm", TimeZoneUtils.GMT, Locale.getDefault(), null);


    @Override
    public void parse(XMLStreamReader reader, String virtualFileName, TimeSeriesContentHandler contentHandler) throws Exception {
        this.reader = reader;
        this.contentHandler = contentHandler;

        header = new DefaultTimeSeriesHeader();

        reader.require(XMLStreamConstants.START_DOCUMENT, null, null);
        reader.nextTag();
        reader.require(XMLStreamConstants.START_ELEMENT, null, "WEATHERDATA");
        reader.nextTag();

        while (!TextUtils.equals(reader.getLocalName(), "PLATFORM")) {
            reader.nextTag();
        }

        reader.require(XMLStreamConstants.START_ELEMENT, null, "PLATFORM");
        header.setLocationId(reader.getAttributeValue(null, "NAME"));
        reader.nextTag();
        while (TextUtils.equals(reader.getLocalName(), "GROUP")) {
            time = dateFormat.parse(reader.getAttributeValue(null, "TIME")).getTime();
            reader.nextTag();
            parseData("HDLEVEL1");
            parseData("HDLEVEL2");
            parseData("HYDRO");
            parseData("METEO");
            reader.nextTag();
        }
    }

    private void parseData(String element) throws XMLStreamException {
        if (!TextUtils.equals(reader.getLocalName(), element)) {
            return;
        }
        for (int i = 0; i < reader.getAttributeCount(); i++) {
            String parameter = reader.getAttributeLocalName(i);
            String stringValue = reader.getAttributeValue(i);
            try {
                float value = Float.valueOf(stringValue);
                contentHandler.setValue(value);
            } catch (NumberFormatException nfe) {
                log.info("Parameter " + parameter + " does not have valid value format: " + stringValue + ". Will be set to missing.");
                contentHandler.setValue(Float.NaN);
            }
            header.setParameterId(parameter);
            contentHandler.setTimeSeriesHeader(header);
            contentHandler.setTime(time);
            contentHandler.applyCurrentFields();
        }
        reader.nextTag();
        reader.nextTag();
    }
}
