"""Inspect and read the synthetic file created by write_netcdf.py.

Run: python read_netcdf.py [example.nc]
"""
import numpy as np
from netCDF4 import Dataset, num2date


def read_example(path="example.nc"):
    with Dataset(path) as ds:
        print("Format:", ds.data_model)
        print("Variables:", list(ds.variables))
        for name, dimension in ds.dimensions.items():
            print(name, len(dimension), "unlimited:", dimension.isunlimited())
        temp = ds.variables["temperature"]
        print("Temperature:", temp.dimensions, temp.shape, temp.units)
        print("Attributes:", {name: temp.getncattr(name) for name in temp.ncattrs()})
        # Read only the requested slice rather than the entire variable.
        first_slice = temp[0, :, :]
        latitudes = ds.variables["lat"][:]
        longitudes = ds.variables["lon"][:]
        time = ds.variables["time"]
        dates = num2date(time[:], units=time.units,
                        calendar=getattr(time, "calendar", "standard"))
        print("Dates:", [date.strftime("%Y-%m-%d %H:%M:%S") for date in dates])
        print("Masked cells:", int(np.ma.getmaskarray(first_slice).sum()))
        print("First-slice mean (K):", float(first_slice.mean()))
        # For this regular grid, choose the nearest coordinate on each 1-D axis.
        # This is not a general geographic nearest-neighbor search.
        iy = int(np.abs(latitudes - 37.2).argmin())
        ix = int(np.abs(longitudes - (-122.2)).argmin())
        series = temp[:, iy, ix]
        print("Selected coordinates:", float(latitudes[iy]), float(longitudes[ix]))
        print("Point series (K):", series)
        units = temp.units
    # Arrays remain usable after closure, unlike Dataset variable objects.
    return latitudes, longitudes, first_slice, dates, series, units


if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("path", nargs="?", default="example.nc")
    args = parser.parse_args()
    read_example(args.path)
