package org.mock;

import org.joda.time.DateTime;
import ucar.ma2.*;
import ucar.nc2.*;

import java.io.IOException;

import static java.util.Collections.singletonList;
import static ucar.ma2.DataType.CHAR;
import static ucar.ma2.DataType.STRING;
import static ucar.ma2.DataType.STRUCTURE;
import static ucar.nc2.NetcdfFileWriter.Version.netcdf4;

public class NetCdfCreatorLite2 {

    @SuppressWarnings("Duplicates")
    public static void main(String[] args) throws IOException, InvalidRangeException {
        System.setProperty("jna.library.path", "C:\\Program Files (x86)\\netCDF 4.3.3.1\\bin");

        NetcdfFileWriter ncFile = NetcdfFileWriter.createNew(netcdf4, "res/mockSimulation.nc");
        Group root = ncFile.addGroup(null, "Fake");

        Dimension city = ncFile.addDimension(null, "City", 1);
        Variable cityVar = ncFile.addVariable(null, "City", STRING, singletonList(city));

        Dimension other = ncFile.addDimension(null, "Other", 1, false, true, false);
        Structure otherVar = (Structure) ncFile.addVariable(root, "Other", STRUCTURE, singletonList(other));
        otherVar.addMemberVariable(ncFile.addStructureMember(otherVar, "Date1", CHAR, "Other"));
        otherVar.addMemberVariable(ncFile.addStructureMember(otherVar, "Date2", CHAR, "Other"));

        ncFile.create();

        ArrayStructure otherStructure = new ArrayStructureMA(otherVar.makeStructureMembers(), new int[]{1, 2});

        char[] dateInChars = DateTime.now().toString().toCharArray();
        ArrayChar date = new ArrayChar.D1(dateInChars.length);
        for (int i = 0; i < dateInChars.length; i++) date.setChar(i, dateInChars[i]);

        char[] dateInChars2 = DateTime.now().toString().toCharArray();
        ArrayChar date2 = new ArrayChar.D1(dateInChars.length);
        for (int i = 0; i < dateInChars2.length; i++) date2.setChar(i, dateInChars[i]);

        otherStructure.getMembers().forEach(m -> m.setDataArray(date));
        otherStructure.getMembers().forEach(m -> m.setDataArray(date2));
        ncFile.write(otherVar, otherStructure);

        ArrayString.D1 cities = new ArrayString.D1(1);
        cities.set(0, "Las Palmas");
        ncFile.write(cityVar, cities);

        ncFile.close();
    }
}
