package nl.wldelft.fews.system.plugin.dataExport;

import nl.wldelft.util.TextUtils;
import nl.wldelft.util.io.LineWriter;
import nl.wldelft.util.io.TextSerializer;
import nl.wldelft.util.timeseries.OutOfDetectionRangeFlag;
import nl.wldelft.util.timeseries.TimeSeriesContent;
import nl.wldelft.util.timeseries.TimeSeriesHeader;

/**
 * IbeverTimeSeriesSerializer converts TimeSeriesContent to CSV text files.
 * <p/>
 * Each timeseries value in the timeseries content is written as a serperate row in the file.<br>
 * Each row contains information on the location ID and name, parameter ID and name, date and time, value, unit, flag
 * Only non-missing values are printed.
 * <p/>
 * The following header information is present for every timeseries array:
 * <li>iBever header line</li>
 */
public class IbeverTimeSeriesSerializer implements TextSerializer<TimeSeriesContent> {
    private static final String[] HEADER_LINE = {
            "mpn_mpnomsch",      /*  1 locationName */
            "mpn_mpnident",      /*  2 locationID   */
            "mwa_mwadtmb",       /*  3 beginDatum   */
            "mwa_mwatijdb",      /*  4 beginTijd    */
            "mwa_mwawrden",      /*  5 meetwaarde   */
            "mep_domgwcod",      /*  6 eenheid      */
            "mrsinovs_domafkrt", /*  7 Detectiegrens*/
            "mps_domgwcod",      /*  8 Parameter code*/
            "hoe_domgwcod",      /*  9 Hoedanigheid code*/
            "mco_domgwcod",      /* 10 compartiment */
            "wtt_cod",           /* 11 watertype    */
            "mpn_mrfxcoor",      /* 12 xcoord    */
            "mpn_mrfycoor"};       /* 13 ycoord    */


    @Override
    public void serialize(TimeSeriesContent content, LineWriter writer, String virtualFileName) throws Exception {
        writer.writeLine(HEADER_LINE, ';');

        String[] line = new String[13];
        for (int i = 0, n = content.getTimeSeriesCount(); i < n; i++) {
            content.setTimeSeriesIndex(i);
            TimeSeriesHeader header = content.getTimeSeriesHeader();

            for (int j = 0, m = content.getContentTimeCount(); j < m; j++) {
                content.setContentTimeIndex(j);
                if (!content.isTimeAvailable()) continue;

                String[] locationIdParts = TextUtils.split(header.getLocationId(), ';'); //split locationid

                line[0] = header.getLocationName();
                line[1] = locationIdParts[0];
                line[2] = content.getTime(content.getDefaultTimeZone(), "yyyy-MM-dd");
                line[3] = content.getTime(content.getDefaultTimeZone(), "HH:mm:ss");
                line[4] = content.getValue('.');
                line[5] = header.getUnit();
                line[6] = setOutOfDetectionRangeFlag(content.getOutOfDetectionRangeFlag());
                line[7] = header.getParameterId();

                //Qualifiers can be entered or not. If not then enter defaults
                line[8] = header.getQualifierCount() == 0 ? "NVT" : header.getQualifierId(0);  // Hoedanigheid code
                //default  altijd waarde 10, kan ook 80 zijn als het lucht betreft, of 40 voor waterbodem
                line[9] = header.getQualifierCount() > 1 ?  header.getQualifierId(1) : "10" ;  // compartiment
                line[10] = locationIdParts.length > 1 ? locationIdParts[1] : "";  // watertype
                line[11] = Double.toString(header.getGeometry().getX(0));
                line[12] = Double.toString(header.getGeometry().getY(0));

                writer.writeLine(line, ';');
            }
        }
    }

    private static String setOutOfDetectionRangeFlag(OutOfDetectionRangeFlag setOutOfDetectionRangeFlag) {
        if (setOutOfDetectionRangeFlag == OutOfDetectionRangeFlag.BELOW_DETECTION_RANGE) return "<";
        if (setOutOfDetectionRangeFlag == OutOfDetectionRangeFlag.ABOVE_DETECTION_RANGE) return ">";
        return "";
    }
}
  • No labels